Como posso determinar se um produto antivírus está instalado?

2

Temos uma grande instalação com mais de 15.000 máquinas. Eles devem ter uma versão do Trend Micro instalada; no entanto, não sabemos com certeza.

Estas são todas as caixas do Windows que incluem o XP com vários níveis de SP, o Vista, tanto o RTM quanto o SP1, e vários servidores de 2000 e 2003.

Como posso determinar:

  1. Se QUALQUER produto AV está instalado?
  2. Qual versão do produto está instalada?
  3. Qual versão do arquivo padrão está na caixa?

Idéias?

Obrigado,

    
por NotMe 26.05.2009 / 21:37

7 respostas

6

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.

    
por 27.05.2009 / 14:29
3

Nas versões atuais do Windows (xp sp3 +, vista, win 7), é possível consultar o mesmo provedor WMI que a Central de Segurança do Windows usa para saber se um produto antivírus está instalado e atualizado.

Veja um exemplo:

Set objSWbemServices = GetObject("winmgmts:\.\root\SecurityCenter")
Set colFirewall = objSWbemServices.ExecQuery("Select * From antivirusProduct",,48)
For Each objAntiVirusProduct In colFirewall
  WScript.Echo "companyName: " & objAntiVirusProduct.companyName
  WScript.Echo "displayName: " & objAntiVirusProduct.displayName
  WScript.Echo "instanceGuid: " & objAntiVirusProduct.instanceGuid
  WScript.Echo "onAccessScanningEnabled: " & objAntiVirusProduct.onAccessScanningEnabled
  WScript.Echo "productUptoDate: " & objAntiVirusProduct.productUptoDate
  WScript.Echo "versionNumber: " & objAntiVirusProduct.versionNumber
Next

Dito isso, nem todos os produtos antivírus registrarão um provedor WMI, mas suspeito que a maioria dos populares o faça. Além disso, não está claro se isso é oficialmente suportado pela Microsoft, por isso pode desaparecer em versões futuras.

Você pode testá-lo em combinação com as outras sugestões do WMI aqui, voltando a verificar os produtos instalados se isso não funcionar.

    
por 27.05.2009 / 06:14
2

Como você mencionou a Trend Micro e usamos o Trend, veja o que fazemos. Uma tarefa agendada faz uma verificação completa do sistema e coloca os resultados em um arquivo de texto. Na verdade, é um arquivo de log com a data como o nome do arquivo ... como 20090517.log na pasta C: \ TRENDMICRO. Porque isso só tem os resultados da digitalização, é um pequeno arquivo.

No nosso caso, com aproximadamente 100 computadores, é fácil para um script powershell no servidor percorrer todos os computadores e concatenar esses arquivos, e procurar apenas os que não têm a string "Contagem de vírus encontrada (0) "neles. Obviamente, se o arquivo e a frase não estiverem presentes, algo está errado: o AV não foi executado recentemente, o vírus foi encontrado, o AV não foi instalado etc. Você provavelmente precisará de algo um pouco mais sofisticado para ampliá-lo.

Mas não há versões corporativas do AV que fazem tudo para você em vez da versão do meu pobre?

    
por 27.05.2009 / 00:48
2

+1 para o Knox em relação à versão corporativa. Concordo. A solução de desktops corporativos da Trend possui uma peça de servidor que controla os clientes e quais mecanismos e padrões de verificação eles têm atualmente. Também permite implantar. Eu usaria isso para trabalhar em direção ao seu objetivo. Implante uma reinstalação do OfficeScan usando isso. Eu nem me incomodaria com o esforço de implantar scripts para descobrir onde você está neste momento do jogo. Melhor para começar de novo. Trabalhe com o Trend on the licensing se você ainda não tiver as ferramentas corporativas (o que realmente me surpreenderia). Se você não o fizer, alguém precisa responder por decisões de compra ruins.

    
por 27.05.2009 / 02:33
1

Eu faria um script de logon que verificasse várias entradas ou arquivos do Registro para determinar se um produto estava instalado. Em seguida, o script pode criar um log de máquinas que fazem ou não.

Dim WSHShell,strRegKey 
Set WSHShell = WScript.CreateObject("WScript.Shell") 
strRegKey="HKLM\Software\Symantec\Version" 
WSHShell.RegRead(strRegKey) 
Wscript.quit(0) 
    
por 26.05.2009 / 21:42
1

Não sei ao certo como isso é prático, considerando 15.000 hosts, mas se você tiver uma lista das máquinas que deseja verificar em um arquivo de texto, poderá consultar a chave de desinstalação no registro e analisar os resultados.

Arquivo de texto denominado computers.txt com um nome de máquina por linha:

COMPUTER1
COMPUTER2

Exemplo chamado batch.bat:

@echo off

for /F %%i in (computers.txt) do call :SUB %%i

GOTO :EOF

:SUB
echo %1
reg query "\%1\HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" /s

Eu percebo que isso pode ser um pouco de sobrecarga de informações no texto, mas permite analisar os resultados de qualquer software A / V que você esteja procurando, sem saber a entrada do registro contida nas informações de desinstalação de cada produto. / p>

Você também pode adaptar isso para entradas de registro de produto específicas, substituindo a consulta de registro pelas chaves de registro do produto específico.

    
por 26.05.2009 / 22:23
1

Respondendo suas perguntas por sua vez

  1. e 2.

Eu escreveria um script para ser executado em cada sistema. Você consultará a chave de registro de desinstalação. Você terá que olhar através de cada subchave. Usando o WMI é o melhor método neste caso. Nessa chave, você verá o nome do produto e a versão. Consulte este exemplo para criação de scripts.

3.

Eu faria tentativa e erro, mas no caso do Trend, imagino que eles colocariam sua versão de definição no registro em HKEY_LOCAL_MACHINE \ Software \ TrendMicro ou em um arquivo config ou ini em seu diretório local. / p>

Isso seria responsável apenas por essa versão do software antivírus. Você terá que fazer isso para várias versões.

    
por 26.05.2009 / 23:00