PowerShell - Comprobar el estado de Windows Defender

Hace tiempo que tenía en mente tratar de resolver este tema, ya que en alguna oportunidad me hubiese sido muy útil. Me puse a investigar un poco y pude armar algo bastante aceptable y quiero compartirlo.

Para atacar el problema lo primero que traté de imaginar es que información me brinda el equipo local para poder utilizar en el script. Obviamente que fui derecho al registro de Windows y ahí encontré lo que buscaba. Si nos situamos en la ruta:

HKLM:\Software\Microsoft\Windows Defender\SignatureUpdates

Podemos observar las siguientes claves que contienen información relevante para nosotros:

Si prestan atención esos números son los que indican la versión de la definición de Virus y Spyware que actualmente se encuentra instalada en nuestro equipo (basta con abrir desde el panel de control Windows Defender y revisar la pestaña Update):

Hasta ahí vamos bien, pero de donde obtengo ese número? Existe referencia hacía él? Google me resolvió estas preguntas enseguida, dentro de los resultados de búsqueda aparece un sitio de Microsoft (Malware Protection Center) que brinda información sobre la última revisión liberada, asi como las versiones anteriores. Gol! Con estos datos, podemos empezar a crear algo…

(Aunque no me crean, cuando saqué la captura de pantalla, ya habían liberado otra definición nueva, por eso no coincide con la de las capturas anteriores)

Ya que los datos se encuentran en una web, que mejor que llamar a nuestro amigo Invoke-WebRequest para estos casos.

Ahora pasemos a armar el script:

Lo primero, debemos obtener los datos de las versiones para chequear con las de nuestro equipo local, usando el comando Invoke-WebRequest y manipulando la salida de los datos podremos obtener una lista con las últimas 20 versiones (que son las que mantienen publicadas) de definiciones:

$Web = Invoke-WebRequest Uri http://www.microsoft.com/security/portal/definitions/whatsnew.aspx
$Lista = $Web.ParsedHTML.getElementsByTagName("option") | select InnerText

Seleccione la etiqueta “option”, ya que es la que enlista la sversiones seguún el código fuente de la web (pulsar Ctrl + U o clic derecho / Inspeccionar elemento ).

Con las líneas anteriores, obtengo una variable llamada $Lista que contiene las últimas 20 definiciones de Virus de Windows Defender.

Ahora Necesito definir indicadores para saber si nuestro software local se encuentra actualizado o no. Para ello pensé en tres etapas:

  • Actualizado: Última definición publicada
  • Actualizaciones disponibles: No es la última,pero tampoco supera las 3 versiones anteriores
  • Desactualizado: Mas viejo que 3 definiciones

El código para esto es:

$LastDefinition = $Lista[0].innerText
$UmbralDefinition = $Lista[2].innerText

Y para comprobar luego defino una función condicional. Ahora voy a definir la variable que contenga la información de la versión de definición del equipo local (por medio del registro de Windows):

$LocalDefinition = Get-ItemProperty -Path 'Registry::HKLM\SOFTWARE\Microsoft\Windows Defender\Signature Updates' -Name AVSignatureVersion | Select-Object -ExpandProperty AVSignatureVersion

Solo falta la función condicional según los valores, si son mayores o menores comoestablecimos al principio y que nos devuelvan en la consola el estado. Le agregué los colores del semáforo para que sea mas descriptivo:

If ($LocalDefinition -ge $LastDefinition) {
	Write-Host "Windows Defender acutlaizado al último update" -ForegroundColor Green
	Write-Host ""
} else {
	If ($LocalDefinition -gt $UmbralDefinition) {
		Write-Host "WindowsDefender hay nuevas definiciones" -ForegroundColor Yellow
		Write-Host ""
	} else {
		Write-Host "WindowsDefender desactualizado" -ForegroundColor Red
		Write-Host ""
	}
}

Y con eso sería todo! Sólo hay que ensamblarlo y ejecutarlo.

Dejo un enlace para descargarlo: Comprobar el estado de Windows Defender

Y el código:

############################################################################### 
# 
#  WindowsDefenderStatus - Victor Silva - 4/2/15 
# 
############################################################################### 
$Web = Invoke-WebRequest Uri http://www.microsoft.com/security/portal/definitions/whatsnew.aspx 
$Lista = $Web.ParsedHTML.getElementsByTagName("option") | select InnerText 

$LastDefinition = $Lista[0].innerText 
$UmbralDefinition = $Lista[2].innerText 

$LocalDefinition = Get-ItemProperty -Path 'Registry::HKLM\SOFTWARE\Microsoft\Windows Defender\Signature Updates' -Name AVSignatureVersion | Select-Object -ExpandProperty AVSignatureVersion 

If ($LocalDefinition -ge $LastDefinition) { 
  Write-Host "Windows Defender acutlaizado al último update" -ForegroundColor Green 
  Write-Host "" 
} else { 
  If ($LocalDefinition -gt $UmbralDefinition) { 
    Write-Host "WindowsDefender hay nuevas definiciones" -ForegroundColor Yellow 
    Write-Host "" 
  } else { 
    Write-Host "WindowsDefender desactualizado" -ForegroundColor Red 
    Write-Host "" 
  } 
}

Happy scripting!

Comments