2009-08-26 10 views
22

Czy istnieje sposób sprawdzenia, czy na komputerze jest zainstalowane oprogramowanie antywirusowe używające C#? Wiem, że Centrum zabezpieczeń wykrywa oprogramowanie antywirusowe, ale jak wykryć to w C#?Wykrywanie programu antywirusowego w systemie Windows przy użyciu C#

+0

jest jakiś sposób, aby wiedzieć, czy program antywirusowy jest aktualizowany w systemie w systemie Windows [email protected] ng.47 – TechBrkTru

+0

Możesz użyć WMI; zobacz [tutaj] (http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/bd97d9e6-75c1-4f58-9573-9009df5de19b). – SLaks

Odpowiedz

31

Według firmy Microsoft Centrum zabezpieczeń systemu Windows używa dwuwarstwowego podejścia do statusu wykrywania. Jedna warstwa jest ręczna, a druga warstwa jest automatyczna za pomocą Instrumentacji zarządzania Windows (WMI). W trybie wykrywania ręcznego Centrum zabezpieczeń systemu Windows wyszukuje klucze rejestru i pliki dostarczane firmie Microsoft przez niezależnych producentów oprogramowania. Te klucze i pliki rejestru umożliwiają programowi Windows Security Center wykrywanie statusu niezależnego oprogramowania. W trybie WMI producenci oprogramowania określają swój status produktu i raportują go z powrotem do Centrum zabezpieczeń systemu Windows za pośrednictwem dostawcy WMI. W obu trybach Centrum zabezpieczeń systemu Windows próbuje ustalić, czy spełnione są następujące warunki:

Program antywirusowy jest obecny.

Podpisy sygnatur antywirusowych są aktualne.

Skanowanie w czasie rzeczywistym lub skanowanie podczas uzyskiwania dostępu jest włączone w przypadku programów antywirusowych.

W przypadku zapór sieciowych Centrum zabezpieczeń systemu Windows wykrywa, czy jest zainstalowany firewall innej firmy i czy zapora jest włączona, czy też nie.

Zatem w celu ustalenia obecność oprogramowania antywirusowego, można użyć WMI wykonaniu połączenia do nazw root\SecurityCenter (począwszy od systemu Windows Vista należy użyć nazw root\SecurityCenter2), a następnie zapytać o klasie AntiVirusProduct WMI.

Spójrz na ten przykładowy kod

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

Czy ktoś, jak to zrobić w systemie Windows 7? – aHunter

+3

W systemie Windows 7 należy użyć przestrzeni nazw '\ root \ SecurityCenter2'. – RRUZ

+0

Próbowałem na serwerze Windows 2008. Jednak otrzymuję wyjątek" Nieprawidłowy obszar nazw ". Działa na Windows 7. – Rahil

3

Kwerenda WMI zmienia się nieznacznie w Vista SP2 i poza nią.

Spróbuj tej części \ root \ SecurityCenter2 zamiast \ root \ SecurityCenter

Wyniki są nieco inne, jak również. Nadal możesz uzyskać nazwę wyświetlaną, ale musisz wykonać trochę maskowania dla pola ProductState, aby określić, czy onAccessScanner jest włączony/wyłączony i jakie są informacje typu upToDate.

2

Otwórz C:\Windows\System32\wbem\wscenter.mof przez Notatnik. To pomaga których przestrzenie nazw i klas istnieje:


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 
Powiązane problemy