全部。
我有一个 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 是什么。
顺便说一句,由于您不允许在参数中包含任何内容的数组,因此您可以跳过 BEGINING
和 PROCESS
并将所有代码填充到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/