获取 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;
        }
    }
 }

示例输出