PowerShell: как запустить скрипт powershell на удаленной машине с помощью WMI

Чтобы быть конкретным: я хочу запустить скрипт powershell на удаленном сервере Windows, но я могу подключиться к этому серверу только с помощью WMI.

Я использовал, например, Get-Wmiobject, чтобы получить некоторые данные, такие как запущенные процессы, но после долгих поисков мне не удалось найти способ запустить блок сценария powershell на этом удаленном. Одна из найденных мной команд — Invoke-Command, но она использует winRM, который не открыт для этого удаленного сервера.

Итак, НЕ разрешено запускать сценарий powershell на удаленном сервере с использованием WMI? Я не нашел четкого и прямого ответа на этот вопрос.


person Yasser Mohsen    schedule 19.11.2017    source источник
comment
Это не то, для чего используется WMI   -  person Shawn Esterman    schedule 20.11.2017
comment
Спасибо, а какая от него основная польза?   -  person Yasser Mohsen    schedule 20.11.2017


Ответы (2)


тл;др

Рассмотрите возможность использования psexec в качестве альтернативы удаленному взаимодействию PowerShell для выполнения произвольных команд.


Список команд PowerShell, поддерживающих работу с удаленными компьютерами без использования удаленного взаимодействия PowerShell, ограничен (см. ниже); все они могут быть основаны на WMI (я не уверен), и они ориентированы на извлечение удаленных ресурсов и управление ими (как WMI в целом), а не на предоставление возможность выполнять произвольные команды.

Обновление: полезный ответ Альберто Варги указывает, что Win32_Process метод .Create класса WMI действительно позволяет создавать произвольные процессы ; документация PowerShell Invoke-WmiMethod cmdlet даже содержит пример.

Напротив, Invoke-Command, который предлагает возможность выполнять произвольные команды, действительно использует удаленное взаимодействие PowerShell, как вы обнаружили, для которого требуется протокол WS-Management, реализованный службой Microsoft WinRM, среди прочего. предварительные условия — см. Get-Help about_Remote_Requirements .

Наиболее общей из перечисленных ниже команд без удаленного взаимодействия является Invoke-WmiMethod, обеспечивающий неограниченный доступ к классам WMI и их методам.

Обратите внимание, однако, что Microsoft рекомендует использовать более новые *-Cim* командлеты, такие как Invoke-CimMethod, в интересах межплатформенной поддержки, и что эти CIM, снова полагаются на стандарты WS-Management (WSMan), как и удаленное взаимодействие PowerShell.


Список командлетов PowerShell, которые поддерживают нацеливание на удаленные машины через -ComputerName без использования удаленного взаимодействия PowerShell, начиная с PSv5.1 (см. Get-Help about_Remote_FAQ для справочной информации):

Add-Computer
Clear-EventLog
Get-EventLog
Get-HotFix
Get-Process
Get-Service
Get-WmiObject
Invoke-WmiMethod
Limit-EventLog
New-EventLog
Register-WmiEvent
Remove-Computer
Remove-EventLog
Remove-WmiObject
Rename-Computer
Restart-Computer
Set-Service
Set-WmiInstance
Show-EventLog
Stop-Computer
Test-Connection
Write-EventLog
person mklement0    schedule 19.11.2017
comment
Спасибо тебе за это. Я попробовал Invoke-WmiMethod, и мне понравилось. В зависимости от вашего ответа, я попробовал многие из этих команд и обнаружил, что почти все они основаны на WMI. - person Yasser Mohsen; 20.11.2017
comment
Но, к сожалению, у некоторых из них нет способа передать им учетные данные, например команды, связанные с Get-Process, Get-Service и журналом событий, поэтому, например, я могу использовать Get-Process напрямую, чтобы получить процессы удаленного компьютера, только если он те же учетные данные моей локальной машины, но если это не так, я думаю, нам нужно использовать Invoke-Command для передачи учетных данных. Можете ли вы помочь мне также получить размер файлов в определенной папке через WMI? Спасибо. - person Yasser Mohsen; 20.11.2017
comment
Похоже, вам придется использовать Invoke-WmiMethod, если вы хотите передать учетные данные; Я предлагаю вам попробовать это, и если это не сработает, вы зададите новый вопрос, касающийся этой конкретной проблемы. - person mklement0; 20.11.2017

Это можно легко сделать. Вам нужен Win32_Process и метод Create. Это позволяет создавать процессы на удаленных машинах 2K3 и выше.

person Alberto Vargas    schedule 20.11.2017