【问题标题】:Convert WMI call to CIM call将 WMI 调用转换为 CIM 调用
【发布时间】:2018-12-25 14:28:54
【问题描述】:

我正在编写的代码假设使用 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 中查看和实现类的方法。

【问题讨论】:

标签: powershell wmi cim


【解决方案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

【讨论】:

  • 当我使用您的代码时,我收到以下错误。 Invoke-CimMethod : Could not infer CimType from the provided .NET object. At line:1 char:1 + Invoke-CimMethod @cimArgs + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Invoke-CimMethod], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.Management.Infrastru cture.CimCmdlets.InvokeCimMethodCommand@TheIncorrigible1
  • 另外,我想要做的只是启动 SCCM 的“全部安装”补丁,这些补丁目前在 SCCM 客户端上列为可用。
  • @Keith 根据错误信息,这是类型问题。该方法需要CCM_SoftwareUpdate[ManagementObject] 不需要你的类型转换
  • @TheIncorrigble1 当我在没有类型转换的情况下测试它时,我得到了同样的错误。我只是希望能够在使用 CIM 的计算机上开始安装当前在 SCCM 客户端中列出的任何 SCCM 补丁。也许invoke-cimmethod 不是正确的方法。您是否知道另一种方法会导致我试图达到的结果不合法?
  • 您可以使用Get-CimInstance,它相当于Get-WmiObject(大部分情况下)。我将使用此方法更新我的答案。
【解决方案2】:

原来是选角问题。解决方案链接: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
                 }

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2013-03-19
    • 2017-01-04
    • 2019-07-14
    • 1970-01-01
    • 2011-06-24
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多