2009-08-26 14 views
22

¿Hay alguna manera de detectar si hay un software antivirus instalado en una máquina que usa C#? Sé que Security Center detecta software antivirus, pero ¿cómo se puede detectar eso en C#?Detectar antivirus en Windows usando C#

+0

¿Hay alguna manera de saber si el antivirus se actualiza en el sistema en windows [email protected] ng.47 – TechBrkTru

+0

Puede usar WMI; vea [aquí] (http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/bd97d9e6-75c1-4f58-9573-9009df5de19b). – SLaks

Respuesta

31

De acuerdo con Microsoft, el Centro de seguridad de Windows utiliza un enfoque de dos niveles para el estado de detección. Un nivel es manual, y el otro nivel es automático a través de Windows Management Instrumentation (WMI). En el modo de detección manual, el Centro de seguridad de Windows busca claves de registro y archivos proporcionados a Microsoft por fabricantes de software independientes. Estas claves de registro y archivos permiten que el Centro de seguridad de Windows detecte el estado del software independiente. En el modo WMI, los fabricantes de software determinan su propio estado del producto y lo informan al Centro de seguridad de Windows a través de un proveedor de WMI. En ambos modos, Windows Security Center intenta determinar si lo siguiente es verdadero:

Un programa antivirus está presente.

Las firmas de los antivirus están actualizadas.

El escaneado en tiempo real o en acceso está activado para los programas antivirus.

Para los firewalls, Windows Security Center detecta si un firewall de terceros está instalado y si el firewall está encendido o no.

Así que con el fin de determinar la presencia de un software antivirus, puede utilizar el WMI hacer una conexión con el root\SecurityCenter espacio de nombres (a partir de Windows Vista debe utilizar el espacio de nombres root\SecurityCenter2), y luego una consulta de la clase WMI AntiVirusProduct.

mirada a este código de ejemplo

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(); 
    } 

    } 
} 
+1

¿Alguien sabe cómo hacer esto en Windows 7? – aHunter

+3

En Windows 7 debe utilizar el espacio de nombres '\ root \ SecurityCenter2' – RRUZ

+0

Lo probé en Windows Server 2008. Sin embargo, recibo una excepción" Espacio de nombres no válido ". Funciona en Windows 7. – Rahil

3

La consulta WMI cambia ligeramente en Vista SP2 y más allá.

Pruebe esta parte \ root \ SecurityCenter2 en lugar de \ root \ SecurityCenter

Los resultados son ligeramente diferentes. Aún puede obtener el nombre para mostrar, pero necesitará enmascarar un poco el campo ProductState para determinar si onAccessScanner está habilitado/deshabilitado y el tipo de información upToDate.

2

Abra C:\Windows\System32\wbem\wscenter.mof con el Bloc de notas. Le ayuda el que existen espacios de nombres y clases:


C# query:

// SELECT * FROM AntiVirusProduct 
// SELECT * FROM FirewallProduct 
// SELECT * FROM AntiSpywareProduct 
ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter2", "SELECT * FROM AntiVirusProduct"); 
ManagementObjectCollection data = wmiData.Get(); 

foreach (ManagementObject virusChecker in data) 
{ 
    var virusCheckerName = virusChecker["displayName"]; 
} 

wscenter.mof:

#pragma autorecover 
#pragma classflags(64) 
#pragma namespace("\\\\.\\root") 

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace 
{ 
    Name = "SecurityCenter"; 
}; 

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace 
{ 
    Name = "SecurityCenter2"; 
}; 
#pragma namespace("\\\\.\\root\\SecurityCenter") 

class AntiVirusProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    [Not_Null] boolean productUptoDate; 
    boolean onAccessScanningEnabled; 
    boolean productHasNotifiedUser; 
    boolean productWantsWscNotifications; 
    uint8 productState; 
    string companyName; 
    string versionNumber; 
    string pathToSignedProductExe; 
}; 

class FirewallProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    boolean enabled; 
    boolean productHasNotifiedUser; 
    boolean productWantsWscNotifications; 
    uint8 productState; 
    string companyName; 
    string versionNumber; 
    string pathToSignedProductExe; 
}; 

class AntiSpywareProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    [Not_Null] boolean productUptoDate; 
    boolean productEnabled; 
    boolean productHasNotifiedUser; 
    boolean productWantsWscNotifications; 
    uint8 productState; 
    string companyName; 
    string versionNumber; 
    string pathToSignedProductExe; 
}; 
#pragma namespace("\\\\.\\root\\SecurityCenter2") 

class AntiVirusProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    [Not_Null] string pathToSignedProductExe; 
    [Not_Null] string pathToSignedReportingExe; 
    [Not_Null] uint32 productState; 
    string timestamp; 
}; 

class FirewallProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    [Not_Null] string pathToSignedProductExe; 
    [Not_Null] string pathToSignedReportingExe; 
    [Not_Null] uint32 productState; 
    string timestamp; 
}; 

class AntiSpywareProduct 
{ 
    [key,Not_Null] string instanceGuid; 
    [Not_Null] string displayName; 
    [Not_Null] string pathToSignedProductExe; 
    [Not_Null] string pathToSignedReportingExe; 
    [Not_Null] uint32 productState; 
    string timestamp; 
}; 
#pragma autorecover 
Cuestiones relacionadas