2013-11-27 14 views
7

Verwenden von Powershell und System.DirectoryServices zu wickeln, ich habe ein Objekt gegeben, das wie folgt aussieht:Verwenden Powershell eine vorhandene COM-Objekt

TypeName: System.__ComObject 

Name      MemberType Definition 
----      ---------- ---------- 
CreateObjRef    Method  System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType) 
Equals     Method  bool Equals(System.Object obj) 
GetHashCode    Method  int GetHashCode() 
GetLifetimeService  Method  System.Object GetLifetimeService() 
GetType     Method  type GetType() 
InitializeLifetimeService Method  System.Object InitializeLifetimeService() 
ToString     Method  string ToString() 

Alle Beispiel-Code, den ich beschäftigt sich mit der Schaffung neuer COM-Objekte von Powershell finden Umbrechen von vorhandenen Objekten, die zurückgegeben wurden. Wie kann ich mit diesem Objekt sinnvoll umgehen (die tatsächlichen Eigenschaften und Methoden aufzählen und verwenden)?

Hinweis: dieses Objekt tatsächlich tut eine Art Bibliothek („ActiveDs“), aber aus irgendeinem Grund kann ich nicht es aus der Box verwenden, da eine andere Frage (Loading a Type Library via PowerShell and scripting Windows Live Writer) schlägt vor, sollte der Fall sein. Hier

ist ein Einzeiler zeigt, wie ein solches Objekt zu erhalten:

((new-object DirectoryServices.DirectoryEntry -a ' 
LDAP://somedc').Properties.GetEnumerator() |?{$_.PropertyName -eq 'usnChanged' }).Value[0] | Get-Member 
+0

Es gibt Cmdlets, die sich speziell mit Active Directory arbeiten konzipiert. http://technet.microsoft.com/en-us/library/ee617195.aspx Es könnte sein, dass Sie Ihr Leben leichter machen, wenn Sie diese verwenden. –

+0

Könnten Sie bitte auch ein Codebeispiel geben, das dieses spezielle Objekt zurückgibt, bei dem Sie Probleme haben mit –

+0

Leider kann ich keine neuen Module installieren; sonst hätte ich das sicherlich gebraucht. – Reinderien

Antwort

5

Powershell Reflexion nicht richtig dieser Objekte Eigenschaften und Methoden „sehen“. Um zu den Eigenschaften und Methoden zu gelangen, verwende ich einige Wrapper-Funktionen. Hier ein Beispiel:

function Get-Property { 
    param(
    [__ComObject] $object, 
    [String] $propertyName 
) 
    $object.GetType().InvokeMember($propertyName,"GetProperty",$NULL,$object,$NULL) 
} 

function Set-Property { 
    param(
    [__ComObject] $object, 
    [String] $propertyName, 
    $propertyValue 
) 
    [Void] $object.GetType().InvokeMember($propertyName,"SetProperty",$NULL,$object,$propertyValue) 
} 

function Invoke-Method { 
    param(
    [__ComObject] $object, 
    [String] $methodName, 
    $methodParameters 
) 
    $output = $object.GetType().InvokeMember($methodName,"InvokeMethod",$NULL,$object,$methodParameters) 
    if ($output) { $output } 
} 

$ADS_ESCAPEDMODE_ON = 2  # see ADS_ESCAPE_MODE_ENUM 
$ADS_SETTYPE_DN = 4   # see ADS_SETTYPE_ENUM 
$ADS_FORMAT_X500_PARENT = 8 # see ADS_FORMAT_ENUM 

$Pathname = New-Object -ComObject "Pathname" 
# store initial EscapedMode 
$escapedMode = Get-Property $PathName "EscapedMode" 
# Enable all escaping 
Set-Property $PathName "EscapedMode" @($ADS_ESCAPEDMODE_ON) 
Invoke-Method $Pathname "Set" @("CN=Ken Dyer,OU=H/R,DC=fabrikam,DC=com",$ADS_SETTYPE_DN) 
Invoke-Method $Pathname "Retrieve" @($ADS_FORMAT_X500_PARENT) 
# outputs 'OU=H\/R,DC=fabrikam,DC=com' 
$escapedMode = Set-Property $PathName "EscapedMode" @($escapedMode) 
# set EscapedMode property back to initial value 

Beachten Sie, dass die Set-Property und Invoke-Methode ein Array als ihre letzte Parameter verwenden, so dass ich @() wenn diese Funktionen aufrufen.

+2

Ich benutze bereits InvokeMember, aber es ist hässlich. Es gibt tatsächlich einen TLB, aber aus irgendeinem Grund scheint PS ihn zu ignorieren. Gibt es eine Möglichkeit, die verfügbaren "echten" Eigenschaften und Methoden aufzulisten, den richtigen Typnamen zu erhalten oder den richtigen TLB zu laden? – Reinderien

1

nur ein wenig anders Ansatz dann Bill Stewart:

Die Idee ist, dass in der Regel brauchen Sie nicht/mehrere Instanzen des ComObject erstellen möchten:

Function Invoke-ComObject([Parameter(Mandatory = $true)]$ComObject, [Switch]$Method, [Parameter(Mandatory = $true)][String]$Property, $Value) { 
    If ($ComObject -IsNot "__ComObject") { 
     If (!$ComInvoke) {$Global:ComInvoke = @{}} 
     If (!$ComInvoke.$ComObject) {$ComInvoke.$ComObject = New-Object -ComObject $ComObject} 
     $ComObject = $ComInvoke.$ComObject 
    } 
    If ($Method) {$Invoke = "InvokeMethod"} ElseIf ($MyInvocation.BoundParameters.ContainsKey("Value")) {$Invoke = "SetProperty"} Else {$Invoke = "GetProperty"} 
    [__ComObject].InvokeMember($Property, $Invoke, $Null, $ComObject, $Value) 
}; Set-Alias ComInvoke Invoke-ComObject 

Wenn sie ein Verfahren betrifft, Sie Sie müssen den Schalter –Method hinzufügen. Im Fall einer Eigenschaft bestimmt das Cmdlet automatisch, ob die Eigenschaft abgerufen oder festgelegt werden muss, je nachdem, ob ein Wert angegeben wird. Mit diesem Cmdlet müssen Sie das ComObject nicht zuerst erstellen und z. die ComputerName (DN) von ADSystemInfo in einem einfachen oneliner zu erhalten:

ComInvoke ADSystemInfo ComputerName 

ein, das gleiche zu tun mit der PathName:

$EscapedMode = ComInvoke PathName EscapedMode 
ComInvoke PathName EscapedMode @($ADS_ESCAPEDMODE_ON) 
ComInvoke Pathname -Method Set @("CN=Ken Dyer,OU=H/R,DC=fabrikam,DC=com", $ADS_SETTYPE_DN) 
ComInvoke Pathname -Method Retrieve @($ADS_FORMAT_X500_PARENT) 
ComInvoke PathName EscapedMode @($EscapedMode) 

Ein Name NameTranslate Beispiel:

ComInvoke -Method NameTranslate Init @(1, "domain.com") 
ComInvoke -Method NameTranslate Set @(8, "User001") 
ComInvoke -Method NameTranslate Get @(1) 

Or Wenn Sie mehrere Instanzen haben möchten, können Sie zuerst die ComObject-Instanz erstellen und sie dann an die ComInvoke-Funktion übergeben auf:

$NameTranslate = New-Object -ComObject NameTranslate 
ComInvoke -Method $NameTranslate Init @(1, "domain.com") 
ComInvoke -Method $NameTranslate Set @(8, "User001") 
ComInvoke -Method $NameTranslate Get @(1) 

Für neueste Invoke-ComObject Version finden Sie unter: https://powersnippets.com/invoke-comobject/

Verwandte Themen