首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WMI调用转换为CIM调用

将WMI调用转换为CIM调用
EN

Stack Overflow用户
提问于 2018-07-18 03:32:34
回答 2查看 986关注 0票数 3

我正在编写的代码旨在启动当前可用于使用CIM的服务器的任何补丁。由于我的网络需要DCOM协议,所以我必须使用CIM。

我正在使用`以便于查看

下面的wmi代码可以工作:

代码语言:javascript
复制
$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所做的不起作用的事情:

代码语言:javascript
复制
$null = (Invoke-CimMethod -CimSession $Computer.CimSession `
                          -Namespace 'ROOT\ccm\ClientSDK' `
                          -ClassName 'CCM_SoftwareUpdatesManager' `
                          -MethodName 'InstallUpdates').InstallUpdates($CMMissingUpdates)

我不仅对我的Invoke-CimMethod的解决方案感兴趣,而且还对它是如何解决的感兴趣。我似乎无法确定如何在CIM中查看和实现类的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-19 04:48:57

原来是选角的问题。解决方案链接:https://www.reddit.com/r/PowerShell/comments/8zvsd8/kick_off_a_sccm_clients_install_all_available/

最终的解决方案:

代码语言:javascript
复制
$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
                 }
票数 0
EN

Stack Overflow用户

发布于 2018-07-18 04:40:05

您的问题是您正在使用两个不兼容的命令进行转换。

代码语言:javascript
复制
Invoke-CimMethod == Invoke-WmiMethod

然而,Get-WmiObject并不是上面提到的。这里有一个完成你正在做的事情的方法:

代码语言:javascript
复制
$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确定了键/值。

这也可以通过以下方式找到:

代码语言:javascript
复制
Get-CimClass -ClassName 'CCM_SoftwareUpdatesManager' -Namespace 'Root\CCM\ClientSDK' |
     ForEach-Object -MemberName CimClassMethods
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51388966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档