Windows マシンで実行されているウイルス対策ソリューションがあるかどうかを検出するスクリプトに取り組んでいます。Windows 8で実行している場合、サードパーティのウイルス対策ソリューションを実行すると、無効になっている Windows Defender が常に存在するため、ウイルス対策が無効になっているという誤検知が発生します。
サードパーティのウイルス対策ソフトウェアの productState が有効であり、正しく報告されていることを確認できますが、私のスクリプトは Windows Defender エントリのみをプルしています。
Windows Defender のエントリを保持する必要がありますが、Windows Defender に関心があるのは、他のウイルス対策ソフトウェアがインストールされていない場合のみです。コマンド プロンプトから次のコマンドを実行してデータを取得すると、2 つの別個のエントリが表示されます。
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get /Format:List
サードパーティのウイルス対策ソフトウェアがインストールされている場合のみ取得し、それ以外の場合は Windows Defender の情報を保持したいと考えています。
これを行う方法は、instanceGUID を呼び出して Windows Defender GUID と比較することですが、いくつかの誤検知が発生しています。このデータを正しく解析し、理想的にはサードパーティの情報のみを確認する方法はありますか?
私が見ているものを正確に示すために完全なスクリプトを含めています。必要に応じて省略できます。
Set objWMIServiceSC = GetObject("winmgmts:\\.\root\SecurityCenter2")
Set colAVItems = objWMIServiceSC.ExecQuery("Select * from AntiVirusProduct")
For Each objAntiVirusProduct In colAVItems
strinstanceGuid = (objAntiVirusProduct.instanceGuid)
strWinDefGUID = "{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
If strinstanceGuid <> strWinDefGUID Then
AvStatus = Hex(objAntiVirusProduct.ProductState)
If (objAntiVirusProduct.ProductState = "393472" _
OR Mid(AvStatus, 2, 2) = "10" Or Mid(AvStatus, 2, 2) = "11" _
OR Mid(AvStatus, 5, 2) = "10" Or Mid(AvStatus, 5, 2) = "11") Then
strproductState = "ENABLED"
Else
strproductState = "DISABLED"
End If
Else
If Mid(AvStatus, 2, 2) = "10" Or Mid(AvStatus, 2, 2) = "11" _
OR Mid(AvStatus, 5, 2) = "10" Or Mid(AvStatus, 5, 2) = "11" Then
strproductState = "ENABLED"
Else
strproductState = "DISABLED"
End If
End If
If Mid(AvStatus, 4, 2) = "00" Then
strdefinitionState = "CURRENT"
ElseIf Mid(AvStatus, 4, 2) = "10" Then
strdefinitionState = "OUTDATED"
End If
Next
繰り返しますが、これはWindows 8の問題です。