Windowsのウィルス対策ソフト(Windows Defender / Microsoft Security Essentials)の状態が最新になってるかチェックする処理をPowerShellで書いたので貼っておく。
Windows DefenderはWindows 8以降では標準で入ってます。Windows 7だとMicrosoft Security EssentialsがMicrosoft純正で無料で使えますが、明示的にインストールしないと使えないです。
Windowsのセキュリティセンターで認識されているウィルス対策ソフトの状態は、WMI経由で root/SecurityCenter2
の AntiVirusProduct
というところから取得できます。状態は 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
}