使用 Invoke-CimMethod 触发 SCCM 更新安装时出错

问题描述

我正在尝试通过从 Powershell 7 调用 CIM 方法来触发将 SCCM 通告的更新安装到某些特定计算机。 不管命令触发了所需的操作,我仍然总是收到错误消息。

Invoke-CimMethod:Es wurde keine Instanz mit den Eigenschaftswerten gefunden。

或翻译成英文:

Invoke-CimMethod :没有找到具有给定属性值的实例。

这是代码

$COmpuTERNAME = 'RemoteComputer01'
$Cimsession = New-Cimsession -ComputerName $COmpuTERNAME
$GetCimInstanceParams = @{
    NameSpace   = 'ROOT\ccm\ClientSDK'
    ClassName   = 'CCM_SoftwareUpdate'
    Filter      = 'ComplianceState = 0'
    Cimsession  = $Cimsession
    ErrorAction = 'Stop'
}
$InvokeCimMethodParams = @{
    Namespace   = 'ROOT\ccm\ClientSDK' 
    ClassName   = 'CCM_SoftwareUpdatesManager'
    MethodName  = 'InstallUpdates'
    Arguments   = @{ CCMUpdates = [ciminstance[]](Get-CimInstance @GetCimInstanceParams) }
    Cimsession  = $Cimsession
    ErrorAction = 'Stop'
}
Invoke-CimMethod @InvokeCimMethodParams

不管我如何尝试调用 CIM 方法 - splatted 或在一行中 - 我总是得到错误

Invoke-CimMethod -Namespace 'root/ccm/ClientSDK' -ClassName 'CCM_SoftwareUpdatesManager' -ComputerName $ComputerName -Arguments @{ CCMUpdates = [ciminstance[]] (Get-CimInstance -Namespace 'root/ccm/ClientSDK' -ClassName 'CCM_SoftwareUpdate' -ComputerName $ComputerName) } -MethodName 'InstallUpdates'

怎么了?如何摆脱错误并获得返回值?

解决方法

如果将来有人对它感兴趣... ;-)

最终找到了至少一个我可以接受的解决方法。

我现在使用 PS 会话而不是 CIM 会话并实际在本地运行命令。

$COMPUTERNAME = 'RemoteComputer01'
$PSSession = New-PSSession -ComputerName $COMPUTERNAME
Invoke-Command -Session $PSSession -ScriptBlock {
    $GetCimInstanceParams = @{
        NameSpace   = 'ROOT\ccm\ClientSDK'
        ClassName   = 'CCM_SoftwareUpdate'
        Filter      = 'ComplianceState = 0'
        ErrorAction = 'Stop'
    }
    $InvokeCimMethodParams = @{
        Namespace   = 'ROOT\ccm\ClientSDK' 
        ClassName   = 'CCM_SoftwareUpdatesManager'
        MethodName  = 'InstallUpdates'
        Arguments   = @{ CCMUpdates = [ciminstance[]](Get-CimInstance @GetCimInstanceParams ) }
        ErrorAction = 'Stop'
    }
    Invoke-CimMethod @InvokeCimMethodParams
}

这为我提供了正确的返回码。

,

与 PowerShell 5 相同的问题,我更新了代码以忽略错误

[ciminstance[]]$Application = (Get-CIMinstance -CIMSession $CIMsession -Namespace "root\ccm\clientSDK" -Class CCM_SoftwareUpdate | Where-Object { $_.EvaluationState -like "*$($AppEvalState0)*" -or $_.EvaluationState -like "*$($AppEvalState1)*"})

Invoke-CimMethod -Namespace root\ccm\clientsdk -ClassName CCM_SoftwareUpdatesManager -MethodName 'InstallUpdates' -Arguments @{CCMUpdates = $Application} -CimSession $CIMsession -ErrorAction SilentlyContinue |out-null

if($error[0] -notlike "*no instance found*"){
     Write-log "Error found $($error)"
}