Use PowerShell to wrap an existing COM object

前端 未结 2 1672
死守一世寂寞
死守一世寂寞 2020-12-16 03:17

Using PowerShell and System.DirectoryServices, I\'ve been given an object that looks like this:

   TypeName: System.__ComObject

Name                    


        
2条回答
  •  生来不讨喜
    2020-12-16 04:01

    PowerShell reflection doesn't properly "see" these objects' properties and methods. To get to the properties and methods, I use some wrapper functions. Here is an example:

    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
    

    Note that the Set-Property and Invoke-Method use an array as their final parameter, so I use @( ) when calling those functions.

提交回复
热议问题