1

我正在尝试一个脚本来远程获取服务器上安装的软件。问题是我希望它输出某些属性,包括计算机名称,但我似乎无法弄清楚如何插入名称。

这是我到目前为止...

$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 脚本编写者,所以希望这对你们来说很容易。在此先感谢您的帮助

4

2 回答 2

1

由于从 WMI 调用返回的对象不包含您发出请求的计算机,因此您需要自己从 include your ForEach-Object( %) 块中包含它。您可以Add-Member自己添加它,然后Select-Object像现在一样在外面做:

$servers | % {
    Get-WMIObject -Class Win32Reg_AddREmovePrograms -ComputerName $_ |
    Add-Member -MemberType NoteProperty -Name ComputerName -Value $_ -PassThru
} | select Displayname,Version,InstallDate,ComputerName

另一种方法是将 to 移动Select-Object到块内并在那里执行它,通过使用哈希表动态创建一个新属性:

$servers | % {
    Get-WMIObject -Class Win32Reg_AddREmovePrograms -computername $_ |
    Select-Object Displayname,Version,InstallDate,@{Name='ComputerName';Expression={$_}}
}
于 2015-11-10T23:37:08.093 回答
1

你的命令:

Get-WMIObject -Class Win32Reg_AddREmovePrograms

不指定要查询的计算机,所以它只是查询正在执行的计算机命令。因此PSComputerNamedisplay MY COMPUTER,就像MY COMPUTER被查询的计算机一样。您必须为cmdlet指定-ComputerName参数才能查询特定计算机。Get-WMIObject并且-ComputerName参数接受计算机名称数组,因此您可以将计算机名称数组放入其中,而不是使用ForEach-Objectcmdlet 并一次查询一台计算机。

于 2015-11-11T05:38:23.967 回答