Конвертировать вызов WMI в вызов CIM

Код, который я пишу, предполагает запуск любых исправлений, доступных в настоящее время на сервере, использующем CIM. И я должен использовать CIM из-за необходимого протокола DCOM для моей сети.

Я использую `для облегчения просмотра

Следующий код 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.

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
                 }

Ваша проблема в том, что вы используете две несовместимые команды для перевода.

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
Другие вопросы по тегам