PowerShell for循环中调用Invoke-Command遍历AD计算机报错如何解决
报错原因
你调用Invoke-Command时传入的$i不是纯字符串格式的计算机名,而是包含CN属性的PowerShell自定义对象:
你执行Select-Object CN后得到的数组元素都是结构化对象,不是直接的计算机名字符串,Invoke-Command的-ComputerName参数仅接收字符串格式的计算机名,因此抛出无效计算机名的报错。
解决方法
方案1:查询时直接提取纯计算机名(推荐)
在Select-Object后添加-ExpandProperty参数直接提取CN属性的字符串值,同时Invoke-Command本身支持批量传入计算机名数组,无需手动写循环,执行效率更高:
# 直接获取纯字符串格式的计算机名数组 $Hosts_Array = Get-ADComputer -Properties CN -Filter * | Sort-Object | Select-Object -ExpandProperty CN # 批量执行命令,自动并行处理多台计算机 Invoke-Command -ComputerName $Hosts_Array -ScriptBlock { Get-Service -Name "sysmon64" }
方案2:循环内指定读取属性值
如果需要保留原有循环写法,传参时指定读取对象的CN属性即可:
$Hosts_Array = Get-ADComputer -Properties CN -Filter * | Sort-Object | Select-Object CN foreach ($i in $Hosts_Array) { Invoke-Command -ComputerName $i.CN -ScriptBlock { Get-Service -Name "sysmon64"} }
注意事项
- 目标计算机需要提前开启WinRM服务,建议通过域组策略批量配置开启规则和防火墙放行策略
- 执行命令的账号需要拥有所有目标计算机的本地管理员权限
- 可添加
-ErrorAction SilentlyContinue参数跳过离线、无权限的计算机,避免执行中断
内容的提问来源于stack exchange,提问作者Seyed Muhammad Alavi
相关产品推荐
相关产品推荐

