2017-04-13 4 views
2

tous.Powershell: Trouver installé Antivirus, filtrant Windows Defender

J'ai un script PowerShell qui va détecter les logiciels antivirus installés dans Windows (c'est plutôt courant). Le problème est, je le veux pour filtrer Windows Defender, d'autant plus que Windows 8, 8.1 et 10 sont installés. Je veux que mon script indique si Windows Defender est ou non le seul logiciel antivirus présent et donne une sortie différente si c'est le cas.

Voici ce que j'ai jusqu'à présent ...

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 

Le résultat est, peu importe que d'autres applications de logiciels antivirus sont installés, il continue à me dire que Windows Defender est installé. Quelqu'un peut-il signaler ce qui me manque?

Merci beaucoup d'avance!

Répondre

1

Je suppose que c'est vérifier chaque élément du tableau dans l'instruction elseif donc c'est vrai même s'il y a plusieurs résultats. Vous pouvez ajouter une condition qu'il y ait un seul résultat comme suit:

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

Je déclare que $AntivirusNames est un tableau lorsque vous attribuez, puis utiliser un interrupteur à boucle à travers les résultats. Donc, ce commutateur ... S'il n'y a aucun résultat, déclarez qu'il n'y a pas d'AV installé. S'il y a 1 résultat, et c'est Windows Defender, déclarez cela. Sinon, si le résultat actuel n'est pas la sortie de Windows Defender, l'AV réelle est.

Sur une note de côté, puisque vous ne permettez pas à un tableau de quoi que ce soit dans vos paramètres que vous pouvez simplement sauter le BEGINING et PROCESS et d'autres choses tout votre code dans le END, à quel point vous pouvez ignorer déclarer tous ces blocs .

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

Le principal problème est le suivant:

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

Lorsque Get-WmiObject retourne un seul élément, $AntivirusNames devient une chaîne, et les -eq des tests si elle correspond à la chaîne littérale.

Lorsque Get-WmiObject renvoie plusieurs éléments, $AntivirusNames devient un tableau et le -eq commence à être un filtre, filtrant les éléments qui correspondent à la chaîne littérale. c'est-à-dire si le tableau contient "Windows Defender", ce qu'il fait.