2013-11-27 4 views
7

をラップするために、私はこのようになりますオブジェクトを与えてきました:使用PowerShellは、既存のCOMオブジェクトPowerShellと<code>System.DirectoryServices</code>を使用して

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() 

私はPowerShellのから新しいCOMオブジェクトを作成して取引を見つけることができるすべてのコード例返された既存のオブジェクトをラップしません。このオブジェクトを実際にどのように扱うことができますか(実際のプロパティとメソッドを列挙して使用します)。

注:このオブジェクト実際はタイプライブラリ(「ActiveDs」)を持っていないが、別の質問(Loading a Type Library via PowerShell and scripting Windows Live Writer)が示唆するように、何らかの理由で私はケースである必要があり、箱から出して、それを使用することができません。

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

がActive Directoryで動作するように特別に設計コマンドレットがあります。 http://technet.microsoft.com/en-us/library/ee617195.aspxあなたがそれらを使用すると、あなたの人生を楽にすることができるかもしれません。 –

+0

問題が発生しているこの特定のオブジェクトを返すコード例を教えてください。 –

+0

残念ながら、私は新しいモジュールをインストールできません。そうでなければ、私は確かにそれを使用したでしょう。 – Reinderien

答えて

5

PowerShellの反射が適切にこれらのオブジェクトのプロパティとメソッドを「見ない」:ここでは

は、このようなオブジェクトを取得する方法を示すワンライナーです。プロパティとメソッドに到達するために、私はいくつかのラッパー関数を使用します。これらの関数を呼び出すときにセットプロパティと呼び出し、メソッドが自分の最後のパラメータとして配列を使用することを

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 

注ので、私は(@を使用):ここでは一例です。

+2

私はすでにInvokeMemberを使用していますが、それは醜いです。実際にはTLBがありますが、何らかの理由でPSはそれを無視しているようです。実際のタイプの名前を取得したり、適切なTLBをロードするために、利用可能な「実際の」プロパティとメソッドをリストする方法はありますか? – Reinderien

1

ほんの少し違ったアプローチその後、ビル・スチュワートさん:

アイデアは、通常、あなたは/がComObjectの複数のインスタンスを作成する必要がないということです。

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 

それは方法に関し場合、 –Methodスイッチを追加する必要があります。プロパティの場合、値を入力するかどうかによって、プロパティを取得または設定する必要があるかどうかがコマンドレットによって自動的に判断されます。 このコマンドレットでは、最初にComObjectを作成する必要はありません。 PathNameと同じことを行うには

ComInvoke ADSystemInfo ComputerName 

::シンプルonelinerにADSystemInfoからComputerName(DN)を取得する

$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) 

NameTranslate例:

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

しますか、複数のインスタンスを作成する場合は、最初にComObjectインスタンスを作成してから、それをComInvoke functiに渡すことができます上:最新Invoke-ComObjectバージョンについては

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

、以下を参照してくださいhttps://powersnippets.com/invoke-comobject/

関連する問題