获取 ADComputers 并过滤已安装的软件
Get ADComputers and filter installed software
我对 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"}
}
我认为您遇到了问题,因为您运行宁 Where-Object 反对这里的错误值:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$computer.name -eq "Citrix Receiver Inside"}
Get-WMIObject 将 return 一些关于 Win32_Product(已安装软件)的信息,包括应用程序 GUID、程序名称、程序版本和昵称或标题 属性.
在您的 Where-Object 命令中,您说的是“给我 计算机名称 为 'Citrix Receiver Inside' 的软件列表。这极不可能您已将计算机命名为:)
试试这个:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$_.name -eq "Citrix Receiver Inside"}
这将为您提供名为 Citrix Receiver Inside 的所有软件的列表。
整合
现在,将其作为一个整体集成到您的脚本中。您希望以包含此产品且仅此产品的计算机列表结束,然后查看计算机名称、程序名称、程序版本、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 object,即使机器不在线。我们将在脚本的下一步中使用它,我们说“如果计算机响应,$product.Version 将不等于 'Error',对于所有这些人,写出以筛选属性我要。
完成代码
$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;
}
}
}
示例输出
我对 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"}
}
我认为您遇到了问题,因为您运行宁 Where-Object 反对这里的错误值:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$computer.name -eq "Citrix Receiver Inside"}
Get-WMIObject 将 return 一些关于 Win32_Product(已安装软件)的信息,包括应用程序 GUID、程序名称、程序版本和昵称或标题 属性.
在您的 Where-Object 命令中,您说的是“给我 计算机名称 为 'Citrix Receiver Inside' 的软件列表。这极不可能您已将计算机命名为:)
试试这个:
Get-WMIObject -Class Win32_Product -computername $computer.name |
Select-Object -Property name, version |
where {$_.name -eq "Citrix Receiver Inside"}
这将为您提供名为 Citrix Receiver Inside 的所有软件的列表。
整合
现在,将其作为一个整体集成到您的脚本中。您希望以包含此产品且仅此产品的计算机列表结束,然后查看计算机名称、程序名称、程序版本、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 object,即使机器不在线。我们将在脚本的下一步中使用它,我们说“如果计算机响应,$product.Version 将不等于 'Error',对于所有这些人,写出以筛选属性我要。
完成代码
$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;
}
}
}
示例输出