Edited at

PowerShellでウィルス対策ソフト(Windows Defender / Microsoft Security Essentials)のリアルタイム保護状態とウィルス定義ファイル状態が最新かどうか確認する

More than 3 years have passed since last update.

Windowsのウィルス対策ソフト(Windows Defender / Microsoft Security Essentials)の状態が最新になってるかチェックする処理をPowerShellで書いたので貼っておく。

Windows DefenderはWindows 8以降では標準で入ってます。Windows 7だとMicrosoft Security EssentialsがMicrosoft純正で無料で使えますが、明示的にインストールしないと使えないです。

Windowsのセキュリティセンターで認識されているウィルス対策ソフトの状態は、WMI経由で root/SecurityCenter2AntiVirusProduct というところから取得できます。状態は productState という変数から取得できるのですが、16進数の6桁でビットに意味があるので、これをデコードします。Microsoft製品以外のベンダーのウィルス対策ソフトでは、このビットの意味が違う可能性が高いですが、そこまで調べられてません。

function Check-AntiVirus{

$antiVirus = @{}
$antiVirusProduct = Get-WmiObject -Namespace "root/SecurityCenter2" -Query "SELECT * FROM AntiVirusProduct"
# ウィルス対策ソフト
# Windows Defender (Windows8標準)
# Microsoft Security Essentials (Windows7標準)
$antiVirus["AntiVirusDisplayName"] = $antiVirusProduct.displayName

# ウィルス対策ソフトのタイムスタンプ
# システムとセキュリティ>アクションセンターで対策状況が問題ないかの判定日時
# Windows Defenderだと設定されるが、Microsoft Security Essentialsだと値が設定されないので参考値
$antiVirus["AntiVirusTimestamp"] = $antiVirusProduct.timestamp

# ウィルス対策ソフトの状態
$antiVirus["AntiVirusProductState"] = $antiVirusProduct.productState
# productStateは16進数で6桁でビットに意味がある
# 0-1桁目が製品区分
# 2-3桁目がリアルタイム保護の状態
# 4-5桁目がウィルス定義の状態
# Windows Defender (Windows8標準の例)
# 397568 (0x061100) = enabled and up to date
# Microsoft Security Essentials (Windows7標準の例)
# 397312 (0x061000) = enabled and up to date
$antiVirusProductStateBit = ""
if ($antiVirusProduct.productState) {
$antiVirusProductStateBit = "{0:X6}" -f $antiVirusProduct.productState
$antiVirus["AntiVirusProductStateBit"] = $antiVirusProductStateBit

# リアルタイム保護の状態
$stateRealTimeMsg = ""
switch ($antiVirusProductStateBit.Substring(2,2)) {
# Windows Defender (Windows8標準)
"01" { $stateRealTimeMsg = 'disabled' }
"11" { $stateRealTimeMsg = 'enabled' }
# Microsoft Security Essentials (Windows7標準)
"00" { $stateRealTimeMsg = 'disabled' }
"10" { $stateRealTimeMsg = 'enabled' }

default { $stateRealTimeMsg = "unkown state($antiVirusProductStateBit)" }
}
$antiVirus["AntiVirusProductStateRealTimeMsg"] = $stateRealTimeMsg

# ウィルスおよびスパイウェア定義の状態
$stateDefMsg = ""
switch ($antiVirusProductStateBit.Substring(4,2)) {
"00" { $stateDefMsg = 'up_to_date' }
"10" { $stateDefMsg = 'out_of_date' }
default { $stateDefMsg = "unkown state($antiVirusProductStateBit)" }
}
$antiVirus["AntiVirusProductStateDefMsg"] = $stateDefMsg
} else {
# productStateが未定義の場合はnillを埋める
$antiVirus["AntiVirusProductStateBit"] = $null
$antiVirus["AntiVirusProductStateRealTimeMsg"] = $null
$antiVirus["AntiVirusProductStateDefMsg"] = $null
}

# チェック判定
if (($stateRealTimeMsg -eq 'enabled') -and ($stateDefMsg -eq 'up_to_date')) {
$antiVirus["CheckStatus"] = "OK"
} else {
$antiVirus["CheckStatus"] = "NG"
}

return $antiVirus
}