Get-WmiObject脚本无法获取计算机名问题求助
解决Win32_Product返回空ComputerName的问题
我之前处理过一模一样的问题!Win32_Product类的默认返回结果里,ComputerName字段确实经常是空的,但其实有两个可靠的办法能拿到正确的计算机名:
方法1:使用WMI的__SERVER属性(双下划线开头)
你之前试过_SERVER但没效果,是因为这个属性是两个下划线开头的__SERVER。我们可以通过PowerShell的计算属性,把它重命名为你需要的ComputerName字段:
Get-WmiObject -Class Win32_Product -Computer CLUKxxx,CLUKyyy,CLUKzzz | Select-Object @{Name='ComputerName'; Expression={$_.__SERVER}}, Name, Version, Vendor | Sort-Object Name | Export-Csv "C:\CLUKxxx_yyy_zzz_Programs.csv" -NoTypeInformation
这里额外加了-NoTypeInformation参数,能避免CSV文件开头出现多余的类型注释,让输出更干净。
方法2:遍历计算机时手动绑定名称(更可靠)
如果某些情况下__SERVER也返回异常,你可以直接遍历每台计算机,把传入的计算机名手动绑定到结果里,这种方式绝对不会空:
$targetComputers = 'CLUKxxx','CLUKyyy','CLUKzzz' $targetComputers | ForEach-Object { $currentPC = $_ Get-WmiObject -Class Win32_Product -Computer $currentPC | Select-Object @{Name='ComputerName'; Expression={$currentPC}}, Name, Version, Vendor } | Sort-Object Name | Export-Csv "C:\CLUKxxx_yyy_zzz_Programs.csv" -NoTypeInformation
额外提醒:Win32_Product的潜在问题
顺便提一句,Win32_Product每次调用都会触发Windows Installer的一致性检查,可能导致系统卡顿甚至弹出莫名其妙的安装/修复窗口。如果你的场景允许,推荐通过读取注册表来获取软件列表,路径是:
- 64位软件:
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall - 32位软件:
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
这种方式更高效也更安全,不过如果必须用Win32_Product,上面的两种方法都能解决你的计算机名问题。
内容的提问来源于stack exchange,提问作者Dan Goodwin
相关产品推荐
相关产品推荐

