windows - Powershell:查找已安装的防病毒软件,过滤掉 Windows Defender

标签 windows powershell antivirus

全部。

我有一个 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。有人可以指出我缺少什么吗?

提前非常感谢!

最佳答案

我会在分配时声明 $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,此时您可以跳过声明所有这些 block 。

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

关于windows - Powershell:查找已安装的防病毒软件,过滤掉 Windows Defender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403076/

相关文章:

windows - 使用GDI+绘制PixelFormat32bppPARGB图像使用常规公式而不是预乘公式

c# - 程序可以在Win 7上运行,但不能在Win 8上运行

windows - 处理 .net 核心中的窗口锁定/解锁事件

powershell - 将自定义Powershell对象添加到ArrayList之后,从RAM中删除它吗?

使用 C 在 Windows 上捕获和分析音频

powershell - PowerShell比较两个字符串的内容

Powershell:在第一个函数参数已经定义时隐藏第二个函数参数

antivirus - 拥有数千个签名的防病毒软件如何在很短的时间内扫描一个文件?

delphi - 从 Delphi 应用程序内激活文件病毒扫描

windows - 防病毒和文件访问冲突 : good programming practices?