Конкретно про антивирус и фаерволл: если ОС знает о них, то и Вы можете узнать вот так посредством WMI (пример на WSH/VBScript; проверялось на Windows XP SP3 Professional: ниже SP2 работать не будет, выше — теоретически возможно, но не проверялось):
Код:
Option Explicit
Dim objSWbemServicesEx
Dim collSWbemObjectSet_AntiVirusProduct
Dim objSWbemObjectEx_AntiVirusProduct
Dim collSWbemObjectSet_FireWallProduct
Dim objSWbemObjectEx_FireWallProduct
Set objSWbemServicesEx = GetObject("WinMgmts:{impersonationLevel=impersonate}!\\.\root\SecurityCenter")
Set collSWbemObjectSet_AntiVirusProduct = objSWbemServicesEx.ExecQuery("SELECT * From AntiVirusProduct")
If collSWbemObjectSet_AntiVirusProduct.Count <> 0 Then
For Each objSWbemObjectEx_AntiVirusProduct In collSWbemObjectSet_AntiVirusProduct
With objSWbemObjectEx_AntiVirusProduct
WScript.Echo .CompanyName, .DisplayName, .VersionNumber, "is", .productUpToDate
End With
Next
Else
WScript.Echo "Not found AntiVirus Products"
End If
Set collSWbemObjectSet_AntiVirusProduct = Nothing
Set collSWbemObjectSet_FireWallProduct = objSWbemServicesEx.ExecQuery("SELECT * From FireWallProduct")
If collSWbemObjectSet_FireWallProduct.Count <> 0 Then
For Each objSWbemObjectEx_FireWallProduct In collSWbemObjectSet_FireWallProduct
With objSWbemObjectEx_FireWallProduct
WScript.Echo .CompanyName, .DisplayName, .VersionNumber
End With
Next
Else
WScript.Echo "Not found FireWall Products"
End If
Set collSWbemObjectSet_FireWallProduct = Nothing
WScript.Quit 0
Естественно, «правильные» антивирус или фаерволл должны «сообщать» о своём присутствии, иначе экземпляры этих классов будут отсутствовать.
Update: поскольку выше речь косвенно шла вроде как о пакетных файлах, то приведу описанный функционал и для них (посредством WMIC):
Код:
wmic.exe /Node:. /NameSpace:\\Root\SecurityCenter Path AntiVirusProduct Get CompanyName, DisplayName, VersionNumber, productUpToDate
wmic.exe /Node:. /NameSpace:\\Root\SecurityCenter Path FireWallProduct Get CompanyName, DisplayName, VersionNumber