我正在编写的代码假设是开始使用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中查看和实现类的方法。
答案 0 :(得分:1)
您的问题是您正在使用两个不兼容的命令进行翻译。
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
cmdlet使用字典将参数传递给方法。我根据this documentation确定了键/值。
这可以通过以下方法找到:
Get-CimClass -ClassName 'CCM_SoftwareUpdatesManager' -Namespace 'Root\CCM\ClientSDK' |
ForEach-Object -MemberName CimClassMethods
答案 1 :(得分:0)
原来这是一个强制性问题。链接到解决方案:https://www.reddit.com/r/PowerShell/comments/8zvsd8/kick_off_a_sccm_clients_install_all_available/
最终解决方案:
$CMMissingUpdates = @( `
Get-CimInstance -Query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" `
-Namespace "ROOT\ccm\ClientSDK"
)
Invoke-CimMethod -Namespace 'ROOT\ccm\ClientSDK' `
-ClassName 'CCM_SoftwareUpdatesManager' `
-MethodName 'InstallUpdates' `
-Arguments @{
CCMUpdates = [cminstance[]]$CMMissingUpdates
}