2017-04-13 29 views
2

全部。Powershell:查找已安裝的防病毒軟件,過濾掉Windows Defender

我有一個PowerShell腳本,它將檢測安裝在Windows中的防病毒軟件(它實際上很常見)。問題是,我想要它過濾Windows Defender,尤其是在Windows 8,8.1和10自帶安裝的情況下。我希望我的腳本能夠指示Windows Defender是否僅顯示防病毒軟件,如果是,則顯示不同的輸出。

這裏是我迄今爲止...

function Get-AntivirusName { 
[cmdletBinding()]  
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    BEGIN 
     { 
      $wmiQuery = "SELECT * FROM AntiVirusProduct" 
     } 
    PROCESS 
     {  
      $AntivirusProduct = Get-WmiObject -Namespace "root\SecurityCenter2" -Query $wmiQuery @psboundparameters   
      $AntivirusNames = $AntivirusProduct.displayName  
      if ($AntivirusNames -eq "") { 
       Write-host "Anti-Virus is NOT installed!" 
      } 
      elseif ($AntivirusNames -eq "Windows Defender") { 
       Write-host "ONLY Windows Defender is installed!" 
      } 
      else { 
       Write-host "Anti-Virus is installed (" + $AntivirusNames + ")." 
      } 

     } 
    END { 
     } 
} 

Get-AntivirusName 

結果是,不管所安裝的其他殺毒軟件的應用程序,它不斷告訴我只安裝了Windows Defender的。有人能指出我錯過了什麼嗎?

非常感謝!

回答

1

我的猜測是它檢查elseif語句中數組的每個元素,所以即使有多個結果也是如此。你可以添加一個條件,即只有一個結果如下:

elseif ($AntivirusNames -eq "Windows Defender" -and $AntivirusNames.count -eq 1) { 
       Write-host "ONLY Windows Defender is installed!" 
      } 
2

我會宣佈$AntivirusNames是當你將它,然後在結果使用一個開關循環數組。

function Get-AntivirusName { 
[cmdletBinding()]  
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    BEGIN 
     { 
      $wmiQuery = "SELECT * FROM AntiVirusProduct" 
     } 
    PROCESS 
     {  
      $AntivirusProduct = Get-WmiObject -Namespace "root\SecurityCenter2" -Query $wmiQuery @psboundparameters   
      [array]$AntivirusNames = $AntivirusProduct.displayName  
      Switch($AntivirusNames) { 
       {$AntivirusNames.Count -eq 0}{"Anti-Virus is NOT installed!";Continue} 
       {$AntivirusNames.Count -eq 1 -and $_ -eq "Windows Defender"} {"ONLY Windows Defender is installed!";Continue} 
       {$_ -ne "Windows Defender"} {"Anti-Virus is installed ($_)."} 
      } 
} 
    END { 
     } 
} 
Get-AntivirusName 

因此,切換...如果沒有結果,則聲明沒有安裝AV。如果有1個結果,並且是Windows Defender,則聲明該結果。否則,如果當前結果不是Windows Defender輸出實際AV的內容。

在一個側面說明,因爲你沒有允許在你的參數任何一個數組,你可以只跳過BEGININGPROCESS和東西所有的代碼到END,此時你可以跳過宣佈所有這些塊的。

function Get-AntivirusName { 
[cmdletBinding()]  
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    $wmiQuery = "SELECT * FROM AntiVirusProduct" 
    $AntivirusProduct = Get-WmiObject -Namespace "root\SecurityCenter2" -Query $wmiQuery @psboundparameters   
    [array]$AntivirusNames = $AntivirusProduct.displayName  
    Switch($AntivirusNames) { 
     {$AntivirusNames.Count -eq 0}{"Anti-Virus is NOT installed!";Continue} 
     {$AntivirusNames.Count -eq 1 -and $_ -eq "Windows Defender"} {Write-host "ONLY Windows Defender is installed!";Continue} 
     {$_ -ne "Windows Defender"} {"Anti-Virus is installed ($_)."} 
    } 
} 
Get-AntivirusName 
2

的主要問題是:

$AntivirusProduct = Get-WmiObject ... 
$AntivirusNames -eq "Windows Defender" 

Get-WmiObject返回單個項目,$AntivirusNames變成一個字符串,-eq測試它的文字字符串相匹配。

Get-WmiObject返回多個項目時,$AntivirusNames成爲數組,並且-eq開始作爲過濾器,過濾出與文字字符串匹配的項目。即,如果該數組包含「Windows Defender」,則它執行該操作。

相關問題