具体来说:我想在远程Windows服务器上运行powershell脚本,但我只能使用WMI连接到此服务器。
例如,我使用Get-Wmiobject
来获取一些数据,比如正在运行的进程,但是在经过大量搜索后我失败了,找到了在这个远程数据库上运行powershell脚本块的方法。我发现的其中一个命令是Invoke-Command
,但是这个命令使用的winRM没有打开到该远程服务器。
那么,不允许使用WMI在远程服务器上运行powershell脚本?我没有找到明确而直接的答案。
答案 0 :(得分:2)
<强> TL;博士强>
考虑使用psexec
替代PowerShell远程处理来执行任意命令。
支持定位远程计算机而不依赖于PowerShell远程处理的PowerShell命令列表是有限的(见下文);他们可能都是基于WMI的(我不确定),他们专注于检索和操作远程资源(因为WMI一般而不是提供执行任意命令的能力。
更新:Alberto Varga's helpful answer指出Win32_Process
WMI class's .Create
method确实允许创建任意进程;
documentation of PowerShell's Invoke-WmiMethod
cmdlet甚至包含一个例子。
相比之下,Invoke-Command
确实能够执行任意命令, 使用PowerShell远程处理,正如您所发现的那样,需要WS-Management协议,由Microsoft的WinRM服务实现,以及其他先决条件 -
见Get-Help about_Remote_Requirements
。
下面列出的最通用的非远程处理命令是Invoke-WmiMethod
,它提供对WMI类及其方法的开放式访问。
但请注意,为了跨平台支持,Microsoft建议使用更新的*-Cim*
cmdlet,例如Invoke-CimMethod
,并且这些CIM兼容的cmdlet再次依赖于WS-Management(WSMan)标准,就像PowerShell远程处理那样。
支持通过-ComputerName
定位远程计算机的PowerShell cmdlet列表,不使用使用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
答案 1 :(得分:1)
这很容易做到。你想要的是Win32_Process和名为Create的方法。这允许您在2K3及更高版本的远程计算机上生成进程。