Powershell:查找已安装的 Antivirus,过滤掉 Windows Defender
Powershell: Find installed Antivirus, filtering out 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。有人可以指出我遗漏了什么吗?
非常感谢!
我的猜测是它正在检查 elseif 语句中数组的每个元素,因此即使有多个结果也是如此。您可以添加一个只有一个结果的条件,如下所示:
elseif ($AntivirusNames -eq "Windows Defender" -and $AntivirusNames.count -eq 1) {
Write-host "ONLY Windows Defender is installed!"
}
我会在你赋值的时候声明$AntivirusNames
是一个数组,然后用一个switch循环遍历结果。
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
,此时您可以跳过声明所有这些块。
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
主要问题是:
$AntivirusProduct = Get-WmiObject ...
$AntivirusNames -eq "Windows Defender"
当Get-WmiObject
returns单个项目时,$AntivirusNames
变成一个字符串,-eq
测试它是否匹配文字字符串。
当Get-WmiObject
returns多个item时,$AntivirusNames
变成数组,-eq
开始做过滤器,过滤掉符合文字串的item。即,如果数组包含 "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。有人可以指出我遗漏了什么吗?
非常感谢!
我的猜测是它正在检查 elseif 语句中数组的每个元素,因此即使有多个结果也是如此。您可以添加一个只有一个结果的条件,如下所示:
elseif ($AntivirusNames -eq "Windows Defender" -and $AntivirusNames.count -eq 1) {
Write-host "ONLY Windows Defender is installed!"
}
我会在你赋值的时候声明$AntivirusNames
是一个数组,然后用一个switch循环遍历结果。
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
,此时您可以跳过声明所有这些块。
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
主要问题是:
$AntivirusProduct = Get-WmiObject ...
$AntivirusNames -eq "Windows Defender"
当Get-WmiObject
returns单个项目时,$AntivirusNames
变成一个字符串,-eq
测试它是否匹配文字字符串。
当Get-WmiObject
returns多个item时,$AntivirusNames
变成数组,-eq
开始做过滤器,过滤掉符合文字串的item。即,如果数组包含 "Windows Defender",它确实如此。