我对Powershell很新,并且无法弄清楚如何将它拼凑在一起。 我希望得到一个计算机名称列表,它们所在的OU,并指定特定程序的版本。
我能够为本地计算机使用Get-WMIObject命令并过滤我正在寻找的特定程序的结果。
Get-WMIObject -Class Win32_Product | Select-Object -Property name,version | Where-Object {$_.name -eq "Citrix Receiver Inside"
接下来,我在AD服务器上运行了计算机名称和OU:
Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select Expand Name, DistinguishedName
我正在尝试将第一个Get-WMIObject脚本传递给第二个1,但我遇到了麻烦......
所以我的最终结果应该是4列的输出:计算机名称,可分辨名称(OU),程序名称(所有应该只是Citrix Receiver Inside)和版本。
我打算在excel中使用类似子命令的子字符串来获取OU名称,但是如果有一种方法可以在PS脚本中获取OU名称,那就更好了。
我在PS subreddit上发布了这个,他们提到了SCCM / SCOM;我从来没有使用过,如果有人能用那些很酷的方法来推荐一种方法。
这是一个发布在我的帖子上的脚本,但我仍然没有得到这样的结果:
$computerList = Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select-Object -Property DistinguishedName, Name
foreach ($computer in $computerList) {
Get-WMIObject -Class Win32_Product -computername $computer.name | Select-Object -Property name, version | where {$computer.name -eq "Citrix Receiver Inside"}
}
答案 0 :(得分:0)
我认为您遇到了问题,因为您在这里针对错误的值运行了Where-Object:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$computer.name -eq "Citrix Receiver Inside"}
Get-WMIObject将返回有关Win32_Product(已安装软件)的大量信息,包括应用程序GUID,程序名称,程序版本以及昵称或标题属性。
在您的Where-Object命令中,您说"给我一个软件列表,其中计算机的名称是' Citrix Receiver Inside&#39 ;。您已经非常不可能将计算机命名为:)
请改为尝试:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$_.name -eq "Citrix Receiver Inside"}
这将为您提供所有名为Citrix Receiver Inside的软件的列表。
现在,将它整合到您的脚本中。您希望最终获得仅包含此产品和此产品的计算机列表,然后查看comptuername,程序名称,程序版本,OU。您遇到的一个问题是,某些计算机将处于脱机状态,您无法及时联系到这些计算机。
为了解决这个问题(这将导致错误和丑陋的红色文字),我们将使用Try / Catch块来尝试访问一台机器。如果机器没有响应,我们将在Catch块中运行代码。
try {$product = Get-WMIObject -Class Win32_Product -computername $computer.name -ErrorAction Stop|
Select-Object -Property name, version |
where {$_.name -eq "Citrix Receiver Inside"} }
catch{$product =[pscustomobject]@{Name="Citrix Receiver Inside";Version="Error"}}
这里的目标是制作一个$ product对象,即使机器不在线。我们将在脚本的下一步中使用它,我们说"如果计算机响应,$ product.Version将不等于“错误”,对于所有这些人,写出来筛选我想要的属性"。
$computerList = Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select-Object -Property DistinguishedName, Name
foreach ($computer in $computerList) {
try {$product = Get-WMIObject -Class Win32_Product -computername $computer.name -ErrorAction Stop|
Select-Object -Property name, version |
where {$_.name -eq "Citrix Receiver Inside"} }
catch{$product =[pscustomobject]@{Name="Citrix Receiver Inside";Version="Error"}}
if ($product.version -ne 'Error'){
[pscustomobject]@{ComputerName=$computer.Name;
OU=$computer.DistinguishedName;
ProgramName=$product.name;
ProgramVersion=$product.version;
}
}
}
示例输出