[Из песочницы] Проверка статуса антивируса в корпоративной сети посредством VBScript
Предисловие
Все началось с того, что купленное корпоративное решение для аудита систем не предоставляло нужную информацию по используемому антивирусному продукту, да и работала слишком уж долго, а панель управления, используемого компанией антивируса, оставляет желать лучшего. Решено было использовать «костыль» для сбора информации об антивирусах в домене.
Приведенный ниже сценарий обрабатывает статусы состояний только антивирусов, используемых в нашей корпоративной сети.
Что же собственно нужно и как это сделать?
Первым делом было установлено, что же нужно получать от антивируса и как это сделать в короткий промежуток времени со всего домена.
Получать нужно было:
1) Наименование установленного антивируса
2) Активен ли антивирус
3) Обновлены ли на нем базы
Собственно способ был найден моментально — использовать WMI (Windows Management Instrumentation).
Пришлось погрузиться в изучение самой структуры WMI на ПК, в этом мне помог замечательный набор утилит WMI Tools.
После чего нужно было решить как взаимодействовать с WMI, не долго думая решил написать сценарий на VBScript.
Разбор полетов
Сценарий обрабатывает 3500 хостов примерно за 1 час. Собственно сам код сценария:
WScript.Interactive = true
compid = 0
On Error Resume Next
Set objDomain = GetObject("LDAP://DOMAIN/OU=Workstations,DC=DOMAIN")
comps = Array()
for each objDomainItem in objDomain
if objDomainItem.objectClass = "Computer" then
idxLast = UBound (comps)
ReDim Preserve comps(idxLast + 1)
comps(idxLast + 1) = objDomainItem.dNSHostName
end if
next
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objNewFile = objFS.CreateTextFile("C:\TEMP\AV_Check\Reports\AV_Status_Scan_is_Running.WAIT")
a = ""
objNewFile.WriteLine ""
objNewFile.WriteLine ""
objNewFile.WriteLine ""
objNewFile.WriteLine "AntiVirus status information "
objNewFile.WriteLine a & ""
objNewFile.WriteLine "AVSI -- Date: " & Now() & "
"
objNewFile.WriteLine "
'"
objNewFile.WriteLine " , base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) }"
objNewFile.WriteLine " , format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) }"
objNewFile.WriteLine "return function(table, name) {"
objNewFile.WriteLine " if (!table.nodeType) table = document.getElementById(table)"
objNewFile.WriteLine " var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML}"
objNewFile.WriteLine " window.location.href = uri + base64(format(template, ctx))"
objNewFile.WriteLine "}"
objNewFile.WriteLine "})()"
objNewFile.WriteLine ""
objNewFile.WriteLine ""
objNewFile.WriteLine ""
objNewFile.WriteLine "id Computer AV Name AV Status AV Bases Host Status "
for each comp in comps
compid = compid + 1
Set WshShell = WScript.CreateObject("WScript.Shell")
Ping = WshShell.Run("ping -n 1 " & comp, 0, True)
Select Case Ping
Case 0
On Error Resume next
Set oWMI = GetObject("winmgmts:\\" & comp & "\root\SecurityCenter2")
On Error Resume next
Set colAVItems = oWMI.ExecQuery("Select * from AntiVirusProduct")
If colAVItems.count = 0 Then
objNewFile.WriteLine "" & compid & " " & comp & " No AntiViruses found Disabled NOT Up to Date Online "
ElseIf colAVItems.count = 1 Then
For Each AntiVirus in colAVItems
If (AntiVirus.displayName) <> "Windows Defender" Then
AVStatus = hex(AntiVirus.ProductState)
If (AVStatus = "61000") _
OR (AVStatus = "51000") _
OR (AVStatus = "41000") Then
objNewFile.WriteLine "" & compid & " " & comp & " " & AntiVirus.displayName & " Active Up to Date Online "
ElseIf (AVStatus = "41010") _
OR (AVStatus = "61010") _
OR (AVStatus = "51010") Then
objNewFile.WriteLine "" & compid & " " & comp & " " & AntiVirus.displayName & " Active NOT Up to Date Online "
ElseIf (AVStatus = "60000") _
OR (AVStatus = "50000") _
OR (AVStatus = "40000") Then
objNewFile.WriteLine "" & compid & " " & comp & " " & AntiVirus.displayName & " On Access scanning disabled! Up to Date Online "
Else
objNewFile.WriteLine "" & compid & " " & comp & " " & AntiVirus.displayName & " Unknown Unknown Online "
End if
End If
Next
End If
Case 1
objNewFile.WriteLine "" & compid & " " & comp & " Unknown Unknown Unknown Offline "
End Select
Next
objNewFile.WriteLine "
"
objNewFile.WriteLine ""
objNewFile.WriteLine "End of scan: " & Now() & "
"
objNewFile.WriteLine "