You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,分两种情况:

  1. 指定当前远程机器的名称:比如写-ComputerName $env:COMPUTERNAME,这属于完全多余的操作——相当于远程机器自己给自己发WMI请求,和不加参数效果一样,但多了一次无意义的网络调用。
  2. 指定其他机器名:脚本块先在Invoke-Command的目标机器上运行,然后从那台机器发起WMI请求到你指定的另一台机器。这属于“跳板机”场景,只有当你需要通过中间机器访问第三方机器时才用,但要注意:中间机器必须有访问第三方机器的WMI权限,而且这种模式出问题时排查更麻烦。

要不要省略其中一方?

  • 常规远程查询场景:一定要省略gwmi的-ComputerName,只用Invoke-Command的-ComputerName指定目标即可。
  • 特殊跳板场景:才需要保留gwmi的-ComputerName,但这种情况极少。

另外提一句:你示例里的[computername]是语法错误,要获取当前机器名应该用$env:COMPUTERNAME,但就算修正了也是多余操作。

内容的提问来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:00:06