仅当不存在其他软件时才能使用特定软件查找机器

时间:2017-05-11 19:01:47

标签: powershell

我的任务是创建一个报告,我需要找到只有Office 365 ProPlus而不是OneDrive的计算机。我们有一个混合的环境,出于商业目的,一些机器都有,而其他机器只有O365。我需要一份包含O365的所有机器列表(淘汰O365 \ OneDrive组合机器)。

这是我目前所处的位置:

$OutPath = "c:\Machines_with_O365.csv"
$Software = "Microsoft Office 365 ProPlus*"

$Computers = Get-ADComputer -Filter *
foreach ($Computer in $Computers) {
    $Ping = Test-Connection -ComputerName $Computer.Name -Quiet -Count 1 
    if ($Ping -eq $true) {
        try {
            $MachineName = $Computer.Name 
            Get-WmiObject -Class Win32_Product -ComputerName $computer.Name -ErrorAction Stop |
                ? {$_.Name -like $Software} |
                Select-Object @{N="ComputerName";E={$Computer.Name}}, Vendor, Name |
                Export-Csv $OutPath -Append
        } catch {
            Write-Host "Unable to Obtain WMI Object of $MachineName" 
        }
    }
}
if ($Ping -eq $false) {
    Write-Host "The $MachineName is not pingable" 
}

我需要添加\更改才能让我到达终点线?

1 个答案:

答案 0 :(得分:0)

您需要检查已安装软件的列表是否包含一个程序,但不包含另一个程序。尝试这样的事情:

$MachineName = $Computer.Name 
$softwarList = Get-WmiObject -Class Win32_Product -Computer $MachineName -ErrorAction Stop
if ($softwareList -contains $Software -and $softwareList -notcontains $OneDrive) {
    $softwareList |
        Select-Object @{n='ComputerName';e={$MachineName}}, Vendor, Name |
        Export-Csv $OutPath -Append

但请注意,Win32_Product类为considered harmful,因为对该类的查询可能会触发程序包重新配置。