¿Cómo detectar antivirus en Windows Server 2008 en C#?
windows-server-2008 windows-server-2008-r2 (5)
He visto ejemplos de código similares a los siguientes varias veces en mi búsqueda de una respuesta:
using System;
using System.Text;
using System.Management;
namespace ConsoleApplication1
{
class Program
{
public static bool AntivirusInstalled()
{
string wmipathstr = @"//" + Environment.MachineName + @"/root/SecurityCenter";
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmipathstr, "SELECT * FROM AntivirusProduct");
ManagementObjectCollection instances = searcher.Get();
return instances.Count > 0;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return false;
}
public static void Main(string[] args)
{
bool returnCode = AntivirusInstalled();
Console.WriteLine("Antivirus Installed " + returnCode.ToString());
Console.WriteLine();
Console.Read();
}
}
}
Desafortunadamente, parece que Windows Server 2008 no tiene el espacio de nombres de SecurityCenter
o SecurityCenter2
, por lo que obtengo una excepción de Invalid namespace
al intentar este enfoque.
¿Alguien sabe de una manera de determinar si hay software antivirus ejecutándose en Windows Server 2008? Cualquier ayuda es apreciada!
De acuerdo con la mayor parte de la web, SecurityCenter y SecurityCenter2 no están disponibles en Windows Server 2008 (como ya lo ha hecho usted mismo).
Encontré este artículo de SO, que contiene una solución. Cómo detectar el antivirus instalado en Windows 2003 Server y 2008 Server 2003 R2 y 2008 Server R2 utilizando WMI u otro WMI en C ++
Es cierto que esta es una implementación de C ++, pero no veo ninguna razón por la que no se pueda portar a C #
También encontré esta página que sugiere usar el marco OESIS. http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c
Enfrenté este problema hace algún tiempo para un cliente y terminé realizando una búsqueda temporal en los controladores y procesos del sistema local en busca de un patrón de firmas antivirus conocidas (como nombres de carpetas, nombres de procesos, etc.) Es no estoy 100% seguro porque en algún lugar alguien descargará un nuevo antivirus que desconoces, pero aparte de eso, fue muy efectivo ...
Esto es más una idea que una solución perfecta. Con respecto a la respuesta de Leonardo, ¿qué hay de usar una pieza real de software antivirus (enlace contra él) para realizar una búsqueda de otro software antivirus? ClamAV es un código abierto y un buen punto para comenzar. Usted "solo" necesita definir una base de datos de firmas nueva y bastante específica.
Hmmm, terminé jugando con PowerShell:
$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root/cimv2" -computername "." -filter "Name like ''%antivirus%''"
if ($avSoftware.Count -gt 0) {
foreach ($av in $avSoftware) {
write-host $p.Name
}
} else {
write-host "No AV software found"
}
Parece estar funcionando tanto en nuestras instancias de Windows Server 2008 y 2008 R2 ...
Más información aquí: https://serverfault.com/questions/12343/how-can-i-determine-whether-an-antivirus-product-is-installed
Utilice el virus de prueba EICAR.
- Haga que su aplicación intente escribir uno de estos archivos en el disco: http://www.eicar.org/85-0-Download.html
- Atrapa la excepción
No solo funcionará con todos los antivirus en la tierra, sino que también le dirá si el antivirus está activo.
Puede resultarle difícil descargar el archivo de prueba si tiene un antivirus activo, por lo que es posible que desee usar esta cadena en su lugar:
X5O!P%@AP[4/PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Tenga en cuenta que probablemente desee mantener la cadena codificada en su aplicación y decodificarla justo antes de escribirla en el disco. De lo contrario, puede arriesgarse a que su aplicación sea detectada como un virus :)
En el sitio de EICAR, dicen:
Cualquier producto antivirus que admita el archivo de prueba EICAR debe detectarlo en cualquier archivo siempre que el archivo comience con los siguientes 68 caracteres y que tenga exactamente 68 bytes de longitud.
Sin embargo, no contaría que los desarrolladores de AV hayan leído la especificación, así que mejor mantengan la cadena codificada. De hecho, solo traté de guardar la cadena en un archivo .txt en mi escritorio con algunos caracteres adicionales y Windows Defender comenzó a gritar.