2013-08-30 19 views
9

Sono curioso di sapere se qualcuno può descrivere come enumerare i metodi ADSI disponibili tramite un'istanza associata come [ADSI]$instance.psbase.Invoke()?È possibile enumerare tutti i metodi e le proprietà disponibili tramite Invoke() di un oggetto [ADSI]?

La ricerca è stata avviata "refer to the docs for the ADSI interface". ma non sono particolarmente contento di questa risposta.

Se istanziata con:

[ADSI]$lhost_group="WinNT://./Administrators,group" 

tentare:

@($lhost_group.psbase.Invoke("Members")) | foreach-object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 

Powershell restituirà la out di GetProperty("Name") per ogni oggetto contenuto nel gruppo.

Come è possibile enumerare tutti i metodi e le proprietà disponibili che sarebbero disponibili tramite qualsiasi interfaccia ADSI fornita?

This answer from Shay Levy è un altro esempio di sintassi in cui vengono utilizzati [ADSI]$_.GetTypes().InvokeMember() e [ADSI]$_.psbase.Invoke().

+0

Mi piacerebbe aggiungere la mia generosità a questa domanda ma non so come? –

+0

Non penso che sia possibile aggiungere ulteriori taglie. Controlla con i ragazzi nella stanza più popolata in chat (nella barra degli strumenti in alto). – mbrownnyc

+0

ok ho letto il documento ^^, devo aspettare la fine della taglia prima di iniziarne una nuova ... troppo male –

risposta

5

La risposta è 'no', ed è improbabile che cambi. Condivido la tua infelicità con quella risposta, ma posso fornire qualche background tecnico per supportarlo e spiegarlo.

Il problema principale è che gli oggetti ADSI del codice nativo devono implementare l'interfaccia COM IDispatch [che consente di chiamare i metodi con limite di lunghezza], ma non implementano necessariamente ITypeInfo [che consente un comportamento simile alla riflessione]. In PowerShell, un oggetto COM che implementa IDispatch ma non ITypeInfo produce una serie dispari di restrizioni, che è ciò che si sta notando.

Il provider ADSI WinNT ha almeno 15 anni e non ha mai una funzionalità avanzata. Era un segnaposto scritto prima di Active Directory spedito (molto prima di CLR o PowerShell.) Allora, "scripting" in Microsoft significava le prime versioni di VBScript, con un certo supporto per JScript, entrambi basati su IDispatch e mai usati ITypeInfo.

Questo è stato un argomento di discussione presto nella vita di PowerShell, quando uno dei membri del team di PowerShell detto:

14 lug 2006

... Il PowerShell non può mostrare le modalità di COM oggetti se l'interfaccia ITypeInfo non è fornita. Questo sarà risolto presto. La soluzione alternativa è utilizzare Type.InvokeMethod().

Ci sono stati miglioramenti nel supporto di PowerShell agli oggetti COM, ma una correzione completa non si è mai materializzata. Penso che il membro del team possa aver promesso in eccesso ciò che è tecnicamente possibile. Questo potrebbe aver confuso le persone. Ho chiesto a uno sviluppatore come mio amico principale del team circa un paio di anni fa; egli conosceva chiaramente il problema e indicava che il caso d'uso non era una priorità elevata e menzionava anche la soluzione alternativa.

Il team di PowerShell ha distribuito funzionalità impressionanti e alcune correzioni di errori, ma francamente non penso che questo problema creerà mai la barra dei bug.

+0

Grazie per le informazioni. Penso davvero che lasci un buco, ma il sollevamento pesante per raggiungere lo stesso obiettivo è già in corso nel lavoro degli altri. Sarebbe bello per MSFT mettere un po 'di sforzo per eliminare questo dalla lista. Uno dei grandi discorsi di TechEd era fondamentalmente sull'apprendimento di PowerShell attraverso il bombardamento; questo è un muro di mattoni che ho colpito nelle mie prime due settimane di immersione. – mbrownnyc

+1

Capisco, ma personalmente penso che sarebbe molto più bello (e più realistico) avere Microsoft pubblicare un set completo di Cmdlet di manipolazione degli account locali piuttosto che fustigare il cavallo fornitore di ADSI/WinNT. I cmdlet sono sempre più in grado di scoprire che i metodi sugli oggetti, per le persone che sbattono, hanno convenzioni di denominazione ben stabilite, file di aiuto, ecc. –

2

Non esattamente sicuro se questo risponde alla tua domanda, ma per quanto riguarda quanto segue?

$lhost_group.getType().DeclaredMembers | where { $_.MemberType -eq "Method" -or $_.MemberType -eq "Property" }

+0

'$ lhost_group.getType(). DeclaredMembers | measure'. Risultati in un 'Conteggio: 0'. Hai avuto fortuna con il tuo sistema locale? – mbrownnyc

+0

Sì, ha funzionato in PoSH v3 ma non in v1/2. Prova '$ lhost_group.getType(). GetProperties()' e '$ lhost_group.getType(). GetMethods()'. È questa l'informazione che stai cercando? –

+0

No, sto cercando i metodi e le proprietà esposti dall'interfaccia ADSI, non i metodi e le proprietà esposti da 'System.DirectoryServices.DirectoryEntry'. Questo è ciò che rende questo così divertente. :) – mbrownnyc