2009-09-22 4 views
5

Tengo una aplicación y estoy tratando de asegurarme de que se ejecute en un entorno seguro. En primer lugar, compruebo si Windows is genuine, lo que hace que sea más probable que el usuario lo mantenga actualizado. Si no, solo aparece un mensaje advirtiendo al usuario que existe un posible riesgo porque todavía necesita validar Windows.¿Cómo detectar si un virusscanner y/o firewall está instalado? (Y algunas otras Q relacionadas con la seguridad.)

Ahora, quiero hacer un poco más. También quiero verificar si el usuario ha instalado un virusscanner. No me importa cuál, siempre y cuando haya instalado uno. Luego, lo mismo para verificar si un firewall está instalado. Y si es posible, quiero verificar cuándo el usuario actualizó su Windows/Scanner/Firewall la última vez solo para asegurarse de que no sea demasiado viejo. Entonces:

1) ¿Cómo verifico si un virusscanner está instalado?
2) ¿Cómo puedo determinar cuándo se actualizó el virusscanner?
3) ¿Cómo detectar cuando el virusscanner hizo su última verificación de sistema completo?
4) ¿Cómo puedo detectar si un firewall está instalado y activo?
5) ¿Cómo puedo verificar cuando Windows recibió su actualización más reciente?

Básicamente, cuando comience mi aplicación quiero mostrar una pantalla con advertencias (solo una vez por día) en caso de que alguna de estas cosas tenga un problema. Esto porque mi aplicación funciona con todo tipo de información confidencial que el usuario recopila de sus clientes. (Que incluye números de cuentas bancarias, números de identificación de pasaportes, NAW + DOB, ingresos y mucho más). Básicamente, si el sistema tiene un problema, el usuario debe confirmar que conoce estos problemas. Quita la posible responsabilidad de mi solicitud si continúa sabiendo que su sistema es posiblemente inseguro ...


¿Y el lenguaje? Básicamente C++ o Delphi para ejemplos de WIN32 y C# para ejemplos de .NET. Se trata más de .NET/Windows API/.NET que del lenguaje.

Respuesta

7

Creo que se puede hacer casi todo esto a través de WMI

Algo como esto:

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

foreach (ManagementObject virusChecker in data) 
{ 
    // This is the virus checkers name. 
    String virusCheckerName = virusChecker["displayName"]; 
} 

[usted no mencionó qué idioma, por lo que la muestra contiene en C#, pero WMI CAN hacerse desde casi cualquier cosa]

[Editar: Usted puede hacer lo mismo pero con "FirewallProduct" en su lugar para información de firewall. Además, para el antivirus, puede consultar la propiedad "productUptoDate" en los resultados para obtener información sobre si está actualizado]

El WMI reference debería ayudarlo a encontrar los demás. (1, 2, 3 y 4 Estoy bastante seguro de que están disponibles a través de WMI. 5 No estoy tan seguro, pero creo que debería ser)

Probablemente encontrará WMI Code Creator útil para las pruebas y averiguar qué consultas/objetos necesita usar. También Scriptomatic y WMI Admin tools podría ser útil.

+0

C# está bien, aunque el idioma no importa. Es la llamada API/.NET lo que cuenta. –

+0

Genial, espero que te haya ayudado entonces. Su pregunta es un poco difícil de responder porque tiene muchas partes. Una vez que hayas explorado WMI un poco, si todavía estás atrapado en uno de ellos en particular, publica una nueva pregunta y solo concéntrate en un punto. De esa manera, con suerte obtendrá a alguien que sepa exactamente dónde buscar esos datos. No sé WMI muy bien más allá de un nivel básico. –

3

Como yo estaba buscando un C++ y .NET no forma dependía mezclé entre esta respuesta y MSDN example: Getting WMI Data from the Local Computer.

Los comandos que necesitan ser cambiado con el fin de obtener el nombre de AV son:

  • _bstr_t(L"ROOT\\CIMV2") a _bstr_t(L"ROOT\\SecurityCenter2"). Tenga en cuenta que SecurityCenter2 es para Win 7, Vista SP2 y más allá según this.Debajo de Vista SP2, necesita usar SecurityCenter.
  • bstr_t("SELECT * FROM Win32_OperatingSystem") a bstr_t("SELECT * FROM AntivirusProduct")
  • hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); a hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);.

Este código modificado se ha comprobado y funciona correctamente.

Para un método más simple siempre puede iterar sobre this algorithm y buscar su AV por su nombre.

Cuestiones relacionadas