3

私が書いているコードは、CIM を使用してサーバーで現在利用可能なパッチを開始することを想定しています。また、ネットワークに必要な DCOM プロトコルのため、CIM を使用する必要があります。

見やすくするために ` を使用しています

次の wmi コードが機能します。

$ComputerName = 'Foo'
[System.Management.ManagementObject[]] $CMMissingUpdates = @(`
    Get-WmiObject -ComputerName $ComputerName `
                  -Query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" `
                  -Namespace "ROOT\ccm\ClientSDK" `
                  -ErrorAction Stop)
$null = (Get-WmiObject -ComputerName $ComputerName `
                       -Namespace "root\ccm\ClientSDK" `
                       -Class "CCM_SoftwareUpdatesManager" `
                       -List).InstallUpdates($CMMissingUpdates)

動作しない CIM を使用して作成したもの:

$null = (Invoke-CimMethod -CimSession $Computer.CimSession `
                          -Namespace 'ROOT\ccm\ClientSDK' `
                          -ClassName 'CCM_SoftwareUpdatesManager' `
                          -MethodName 'InstallUpdates').InstallUpdates($CMMissingUpdates)

自分の解決策に興味があるだけでなく、Invoke-CimMethodそれがどのように解決されたかにも興味があります。CIM でクラスのメソッドを表示および実装する方法を判断できないようです。

4

2 に答える 2

1

問題は、互換性のない 2 つのコマンドを使用して翻訳していることです。

Invoke-CimMethod == Invoke-WmiMethod

Get-WmiObjectただし、上記ではありません。あなたがやっていることを達成する方法は次のとおりです。

$ComputerName = 'Foo'
$cimArgs = @{
    'Namespace'    = 'Root\CCM\ClientSDK'
    'ClassName'    = 'CCM_SoftwareUpdatesManager'
    'MethodName'   = 'InstallUpdates' # returns UInt32 object; 0 = success
    'Arguments'    = @{
        'CCMUpdates' = Get-WmiObject -Namespace Root\CCM\ClientSDK -Class CCM_SoftwareUpdate -Filter 'ComplianceState = "0"'
    }
    'CimSession'   = New-CimSession -ComputerName $ComputerName -SessionOption (New-CimSessionOption -Protocol Dcom)
}
Invoke-CimMethod @cimArgs

コマンドレットは、Invoke-CimMethod引数をメソッドに渡すためにディクショナリを受け取ります。このドキュメントに基づいてキー/値を決定しました。

これは、次の方法でも見つけることができます。

Get-CimClass -ClassName 'CCM_SoftwareUpdatesManager' -Namespace 'Root\CCM\ClientSDK' |
     ForEach-Object -MemberName CimClassMethods
于 2018-07-17T20:40:05.270 に答える