我正在尝试一个脚本来远程获取服务器上已安装的软件。问题是我希望它输出某些属性,包括计算机名称,但我似乎无法弄清楚如何插入名称。
这是我到目前为止所拥有的......
$servers = Get-QADComputer -SearchRoot "OU=servers,OU=mydomain:-),DC=COM" | Select Name
......当然可以正常工作。然后...
$servers | % {Get-WMIObject -Class Win32Reg_AddREmovePrograms} | select Displayname,Version,InstallDate,PSComputerName
...它提供了该OU中所有服务器上安装的软件的完整列表,但PSComputerName变为MY COMPUTER(我运行查询的计算机 - 不是被查询系统的计算机名)。目标是在软件的每个行项目上安装软件的服务器名称。我问谷歌教授,似乎没有看到任何有用的东西(或者我理解的任何东西)。
希望这是有道理的。半业余的PS剧本作家所以希望这对你们来说很容易。在此先感谢您的帮助
答案 0 :(得分:1)
由于从WMI调用返回的对象并不包含您发出请求的计算机,因此您需要自己包含它,而不是包含ForEach-Object
(%
)块。您可以使用Add-Member
自行添加,然后像您一样在外面执行Select-Object
:
$servers | % {
Get-WMIObject -Class Win32Reg_AddREmovePrograms |
Add-Member -MemberType NoteProperty -Name ComputerName -Value $_ -PassThru
} | select Displayname,Version,InstallDate,ComputerName
另一种方法是将Select-Object
移动到块内并在其中执行,方法是使用哈希表动态创建新属性:
$servers | % {
Get-WMIObject -Class Win32Reg_AddREmovePrograms |
Select-Object Displayname,Version,InstallDate,@{Name='ComputerName';Expression={$_}}
}
答案 1 :(得分:1)
你的命令:
Get-WMIObject -Class Win32Reg_AddREmovePrograms
不指定要查询的计算机,因此它只查询正在执行的计算机命令。因此PSComputerName
显示MY COMPUTER
,因为MY COMPUTER
是要查询的计算机。您必须将-ComputerName
参数指定到Get-WMIObject
cmdlet才能查询特定计算机。并且-ComputerName
参数接受计算机名称数组,因此您可以将计算机名称数组放入其中,而不是使用ForEach-Object
cmdlet并在一次查询一台计算机。