Como você está falando de 15.000 hosts, consultar cada um deles da rede será altamente ineficiente.
O Right Thing To Do ™ é ter um watchdog em execução em cada host para garantir que o software apropriado esteja instalado e em execução. Esse watchdog pode ser um software executado como um serviço, um script agendado ou mesmo baseado em hardware se você usar algo como o Intel vPro.
Para verificar se um software antivírus está instalado, você pode usar o seguinte comando do PowerShell -
$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" '
-computername "." -filter "Name like '%antivirus%'"
Observe que, no final, você tem um argumento filter
que pode ser personalizado para garantir que esteja vendo o produto certo.
Depois de jogar um pouco com o operador like
, você deve conseguir adivinhar a descrição do antivírus e pequenas variações aqui e ali. Observe que meu exemplo acima (qualquer coisa que contenha a palavra "antivírus") é bastante simplista. Em vez disso, você deve procurar padrões específicos que correspondam ao seu software antivírus aprovado (por exemplo, "Trend Micro Antivirus%")
De qualquer forma, o comando acima retornará uma coleção de produtos instalados que correspondem à sua declaração filter
. A partir daqui, você pode testar se $avSoftware.Count
é maior que zero e, nesse caso, você tem um software antivírus instalado. O exemplo abaixo lista todos os softwares antivírus instalados -
if ($avSoftware.Count -gt 0) {
foreach ($av in $avSoftware) {
write-host $p.Name
}
} else {
write-host "No AV software found"
}
Em vez de apenas imprimir uma mensagem dizendo que nenhum AV foi encontrado, você obviamente deve fazer algo mais útil, por exemplo,
- Notificar um administrador
- Instalar um antivírus da rede
Você também disse que gostaria de obter a versão do AV instalado. Para fazer isso, você pode usar a propriedade Version
do Win32_Process
. Vamos modificar o código acima assim para também imprimir os números de versão do software instalado -
$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" '
-computername "." -filter "Name like '%antivirus%'"
foreach ($av in $avSoftware) {
write-host $av.Name, $av.Version
}
Quanto à versão dos arquivos de definição de vírus instalados, você deve confiar em cada interface específica do AV WMI. Você terá que consultar a documentação do fornecedor para isso.
Mais uma coisa para lembrar. Provavelmente não é suficiente saber que o host tem o AV instalado se o AV não estiver em execução. Depois de verificar qual AV está instalado, você deve certificar-se de que seu processo está sendo executado. Para fazer isso, você terá que saber qual é o processo apropriado para cada um dos seus programas antivírus e procurá-los assim -
$processes = get-wmiobject -class "Win32_Process" -namespace "root\cimv2" '
-computername "." -filter "Name = 'TeaTimer.exe'"
if ($processes.Count -gt 0) {
foreach ($p in $processes) {
write-host $p.Name
} else {
# AV not running. Launch it here or notify someone
}
O exemplo acima procura pelo processo do Spybot (não exatamente AV, mas você obtém a imagem), que é chamado de "TeaTimer.exe". Modifique-o para procurar seu processo.
Agora, tudo isso dito, se você está lidando com milhares de hosts desse tipo, provavelmente deve investir em alguma ferramenta de gerenciamento (por exemplo, LANdesk, Microsoft System Center ou Plataformas de Nível). Essas ferramentas tornariam sua vida um todo muito mais fácil.