Powershell: Find installeret Antivirus, filtrer ud Windows Defender

Indlæg af Hanne Mølgaard Plasc

Problem



alle.


Jeg har et PowerShell script, der opdager antivirusprogrammer installeret i Windows (det er faktisk ret almindeligt). Problemet er, jeg vil have det til at filtrere Windows Defender, især da Windows 8, 8.1 og 10 kommer med det installeret. mit script for at angive, om Windows Defender, hvis den eneste antivirusprogramvare er til stede og give en anden output, hvis den er.


Her er hvad jeg har hidtil ...


function Get-AntivirusName { 
[cmdletBinding()]     
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    BEGIN  
        { 
            $wmiQuery = "SELECT * FROM AntiVirusProduct" 
        } 
    PROCESS  
        {    
            $AntivirusProduct = Get-WmiObject -Namespace "rootSecurityCenter2" -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 


Resultatet er, uanset hvilke andre antivirusprogrammer apps er installeret, det fortæller kun, at kun Windows Defender er installeret. Kan nogen påpege, hvad jeg mangler?


Mange tak på forhånd!

Bedste reference


Mit gæt er, at det kontrollerer hvert element i arrayet i elseif-sætningen, så det er sandt, selvom der er flere resultater. Du kan tilføje en betingelse om, at der kun er et resultat som følger:


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

Andre referencer 1


Jeg vil erklære, at $AntivirusNames er en matrix, når du tildeler den, og brug derefter en switch til sløjfe gennem resultaterne.


function Get-AntivirusName { 
[cmdletBinding()]     
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    BEGIN  
        { 
            $wmiQuery = "SELECT * FROM AntiVirusProduct" 
        } 
    PROCESS  
        {    
            $AntivirusProduct = Get-WmiObject -Namespace "rootSecurityCenter2" -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


Så det skifter ... Hvis der er nul resultater, erklærer du, at der ikke er nogen AV installeret. Hvis der er 1 resultat, og det er Windows Defender, erklærer du det. Ellers hvis det nuværende resultat ikke er Windows Defender-output, hvad den aktuelle AV er.


På en sidebemærkning kan du bare springe over BEGINING og PROCESS og indsætte al din kode i END, hvor du ikke kan tillade en række af noget i dine parametre. du kan springe erklærer alle disse blokke.


function Get-AntivirusName { 
[cmdletBinding()]     
param ( 
[string]$ComputerName = "$env:computername" , 
$Credential 
) 
    $wmiQuery = "SELECT * FROM AntiVirusProduct" 
    $AntivirusProduct = Get-WmiObject -Namespace "rootSecurityCenter2" -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

Andre referencer 2


Hovedproblemet er:


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


Når Get-WmiObject returnerer et enkelt element, bliver $AntivirusNames en streng og -eq test, hvis den matcher den bogstavelige streng.


Når Get-WmiObject returnerer flere elementer, bliver $AntivirusNames en matrix, og -eq begynder at være et filter, der filtrerer ud elementer, der matcher den bogstavelige streng. dvs. hvis arrayet indeholder 'Windows Defender', som det gør.