2013-08-30 10 views
9

Ich bin neugierig, wenn jemand beschreiben kann, wie ADSI-Methoden, die über eine gebundene Instanz als [ADSI]$instance.psbase.Invoke() verfügbar sind, aufgelistet werden?Ist es möglich, alle Methoden und Eigenschaften aufzulisten, die über Invoke() eines [ADSI] -Objekts verfügbar sind?

Forschung ist aufgetaucht "refer to the docs for the ADSI interface". aber ich bin nicht besonders glücklich mit dieser Antwort.

Wenn ich instanziiert mit:

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

Dann versuchen:

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

Powershell wird die out von GetProperty("Name") für jeden in der Gruppe enthaltenen Objekt zurückgeben.

Wie listet ich alle verfügbaren Methoden und Eigenschaften auf, die über eine bestimmte ADSI-Schnittstelle verfügbar wären?

This answer from Shay Levy ist ein weiteres Beispiel für die Syntax wound [ADSI]$_.psbase.Invoke() verwendet werden.

+0

Ich möchte meine eigene Prämie zu dieser Frage hinzufügen, aber ich weiß nicht wie? –

+0

Ich glaube nicht, dass Sie zusätzliche Prämie hinzufügen können. Erkundigen Sie sich bei den Leuten im am meisten besiedelten Raum im Chat (in der oberen Symbolleiste). – mbrownnyc

+0

ok Ich habe das doc ^^ gelesen, muss das Ende der Bounty warten, bevor ich ein neues beginne ... schade –

Antwort

5

Die Antwort ist ‚Nein‘, und es ist unwahrscheinlich, zu ändern. Ich teile Ihre Unzufriedenheit mit dieser Antwort, aber ich kann Ihnen einen technischen Hintergrund zur Unterstützung und Erklärung geben. Das Kernproblem besteht darin, dass die ADSI-Objekte mit nativem Code die COM-Schnittstelle IDispatch implementieren müssen [wodurch spät gebundene Methoden aufgerufen werden können], aber sie implementieren nicht notwendigerweise ITypeInfo [das reflektionsähnliches Verhalten zulässt]. In PowerShell führt ein COM-Objekt, das IDispatch, aber nicht ITypeInfo implementiert, zu einem ungeraden Satz von Einschränkungen, was Sie bemerken.

Der WinNT ADSI-Anbieter ist mindestens 15 Jahre alt und hat noch nie eine starke Funktion. Es war ein Platzhalter geschrieben vor Active Directory ausgeliefert (weit vor der CLR oder PowerShell.) Damals bedeutete "Scripting" bei Microsoft frühe Versionen von VBScript, mit etwas Unterstützung für JScript, die beide auf IDispatch angewiesen und nie verwendet ITypInfo.

Dies war ein Thema der Diskussion früh in Powershell Leben, wenn einer des Mitglieds Powershell-Teams sagte:

14 Jul 2006

... Die Powershell, die Methoden der COM nicht zeigen kann, Objekte, wenn die Schnittstelle ITypeInfo nicht zur Verfügung steht. Dies wird bald behoben werden. Die Problemumgehung besteht darin, Type.InvokeMethod() zu verwenden.

Es wurden Verbesserungen in der PowerShell-Unterstützung für COM-Objekte vorgenommen, aber eine vollständige Fehlerbehebung wurde nie realisiert. Ich denke, das Teammitglied hat vielleicht zu viel versprochen, was technisch möglich ist. Dies könnte die Menschen verwirrt haben. Ich habe vor ein paar Jahren einen Entwickler, der Freund von mir im Team ist, danach gefragt; Er war mit dem Problem klar vertraut und wies darauf hin, dass der Anwendungsfall keine hohe Priorität hatte und erwähnte auch die Problemumgehung.

Das PowerShell-Team hat beeindruckende Funktionen und einige Bug-Fixes ausgeliefert, aber ehrlich gesagt glaube ich nicht, dass dieses Problem die Bug-Leiste jemals fallen lassen wird.

+0

Vielen Dank für die Info. Ich glaube wirklich, es hinterlässt ein Loch, aber schweres Heben, um das gleiche Ziel zu erreichen, ist bereits in der Arbeit anderer vorhanden. Es wäre schön für MSFT, sich ein wenig Mühe zu geben, um dies von der Liste zu streichen. Einer der großen Vorträge bei TechEd bestand darin, PowerShell zu lernen, indem man darin herumhämmerte; Das ist eine Mauer, die ich in den ersten zwei Wochen meines Tauchgangs geschlagen habe. – mbrownnyc

+1

Ich verstehe, aber persönlich denke ich, es wäre viel schöner (und realistischer), dass Microsoft eine ganze Reihe von lokalen Account-Manipulations-Cmdlets veröffentlicht, anstatt das ADSI/WinNT-Provider-Pferd zu überlisten. Cmdlets sind immer besser entdeckbar als Methoden für Objekte, für Menschen, die herumstolpern, gut etablierte Namenskonventionen, Hilfedateien usw. haben. –

2

Nicht genau, ob das Ihre Frage beantwortet, aber was ist mit den folgenden?

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

+0

'$ lhost_group.getType(). DeclaredMembers | messen ". Ergebnisse in einem 'Count: 0'. Hattest du Glück in deinem lokalen System? – mbrownnyc

+0

Ja, es funktionierte in PoSH v3 aber nicht v1/2. Probieren Sie '$ lhost_group.getType(). GetProperties()' und '$ lhost_group.getType(). GetMethods()'. Sind das die Informationen, nach denen Sie suchen? –

+0

Nein, ich suche nach den Methoden und Eigenschaften, die von der ADSI-Schnittstelle verfügbar gemacht werden, und nicht nach den Methoden und Eigenschaften, die von 'System.DirectoryServices.DirectoryEntry' bereitgestellt werden. Das macht das so viel Spaß. :) – mbrownnyc

Verwandte Themen