PowerShell 5.1中Invoke-Command与gwmi计算机数组的交互逻辑及疑问
PowerShell 5.1:Invoke-Command与Get-WmiObject的ComputerName参数配合说明
先理清楚核心逻辑
Invoke-Command的-ComputerName是让脚本块直接在目标远程机器上运行;而Get-WmiObject(简称gwmi)的-ComputerName是从当前执行gwmi的机器发起WMI请求到指定机器。搞明白这俩的本质,就懂怎么配合了。
常规场景:必须省略gwmi的-ComputerName
这是99%场景下最合理的用法:
当你用Invoke-Command指定了远程机器列表,脚本块会在每台远程机器上本地化执行。此时gwmi不加-ComputerName,默认就是查询当前这台远程机器自身的WMI数据。
这么做的好处:
- 效率更高:直接在远程机器本地查WMI,不用多绕一次无意义的网络请求(本地→远程→远程自身)
- 权限更简单:Invoke-Command已经处理了远程登录权限,gwmi本地执行不需要额外的WMI远程权限
修正后的示例代码:
function fx1(){ Invoke-Command -ComputerName Computer1, Computer2, doesNotexist -ScriptBlock { gwmi win32_service -filter "name='whatever'" } -ErrorAction SilentlyContinue -ErrorVariable errors }
同时指定两者的执行行为
如果非要在脚本块里给gwmi加-ComputerName,分两种情况:
- 指定当前远程机器的名称:比如写
-ComputerName $env:COMPUTERNAME,这属于完全多余的操作——相当于远程机器自己给自己发WMI请求,和不加参数效果一样,但多了一次无意义的网络调用。 - 指定其他机器名:脚本块先在Invoke-Command的目标机器上运行,然后从那台机器发起WMI请求到你指定的另一台机器。这属于“跳板机”场景,只有当你需要通过中间机器访问第三方机器时才用,但要注意:中间机器必须有访问第三方机器的WMI权限,而且这种模式出问题时排查更麻烦。
要不要省略其中一方?
- 常规远程查询场景:一定要省略gwmi的-ComputerName,只用Invoke-Command的
-ComputerName指定目标即可。 - 特殊跳板场景:才需要保留gwmi的-ComputerName,但这种情况极少。
另外提一句:你示例里的[computername]是语法错误,要获取当前机器名应该用$env:COMPUTERNAME,但就算修正了也是多余操作。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

