获取AD计算机并过滤已安装的软件

时间:2015-04-20 17:31:31

标签: powershell-v3.0

我对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"}
 }

1 个答案:

答案 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;
        }
    }
 }

示例输出

enter image description here