2012-11-28 12 views
13

Pracuję nad sprawdzeniem zapory ogniowej. Poniższy kod dość łatwo sprawdza stan domyślny Zapora systemu Windows:Sprawdź zapory innych firm na komputerze

INetFwMgr manager = GetFireWallManager(); 
    bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled; 
    if (isFirewallEnabled == false) 
    { 
     Console.WriteLine("Firewall is not enabled."); 
    } 
    else 
    { 
     Consoe.WriteLine("Firewall is enabled."); 
    } 
    Console.ReadLine(); 

    private static INetFwMgr GetFireWallManager() 
    { 
    Type objectType = Type.GetTypeFromCLSID(new Guid(firewallGuid)); 
    return Activator.CreateInstance(objectType) as INetFwMgr; 
    } 

Staje się pytanie: Jak mogę znaleźć status niż Windows Firewall? Jeśli zapora jest poprawnie zintegrowana, czy powyższy sprawdzian działa tak samo, czy jest na to lepsza metoda? Sprawdziłem ten wpis: C# Windows Security Center Settings i ten wpis: C# - How to chceck if external firewall is enabled?, ale oba okazały się stosunkowo pomocne.

Zajmuję się API WMI, ale jest to dość mylące do tej pory, a dokumentacja za pośrednictwem MSDN nie była zbyt obiecująca. Próbowałem też zadzierać z SelectQuery, ale jak dotąd nie udało mi się. Czy ktoś może mi pomóc w nowym punkcie wyjścia lub w miejscu, w którym mógłbym znaleźć lepszą dokumentację/instrukcje dotyczące zapór zewnętrznych?

EDIT: Obecnie jestem zwiedzania dalej do WMI, a konkretnie klasę FirewallProduct jak sugeruje stanowisku.

UPDATE 2: I zostały testowanie następujący fragment:

string wmiNameSpace = "SecurityCenter2"; 
    ManagementScope scope; 
    scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", wmiNameSpace), null); 
    scope.Connect(); 
    ObjectQuery query = new ObjectQuery("SELECT * FROM FirewallProduct"); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

Ale działa to prowadzi do następującego błędu: Exception Invalid namespace i wskazuje na linii 39 (scope.Connect()). Nie byłbym wcale zaskoczony, gdybym po prostu pominął parametr lub sformatował coś niewłaściwie, po prostu nie wiem, co to jest.

UPDATE 3 Przejście z SecurityCenter2 do SecurityCenter wciąż daje ten sam invalid namespace błąd.

AKTUALIZACJA 4 Przeniosłem aplikację konsoli na inne pudełko (win7 not winserver08r2) i poprawnie zgłoszono ją zgodnie z oczekiwaniami. Może to być problem z maszyną wirtualną, którą obecnie testowałem. Następnym krokiem jest do analizowania na aktywny/status nieaktywnych Pojawia UPDATE 5 Został on przetestowany na innym polu Server08 i tym samym invalid namespace błędu

. Używanie SecurityCenter zamiast SecurityCenter2 nie rozwiązuje problemu. Czy istnieje pewna podstawowa funkcja zabezpieczeń, której używa Windows Server OS, aby zapobiec manipulowaniu zaporami ogniowymi, czy też systemowi operacyjnemu serwera nie dostarczono określonego zestawu kluczy funkcji WMI?

+1

Możesz zajrzeć na tę stronę http: //www.codeproject.com/Articles/37714/Software-Development-Build-your-own-Windows-Securi Trzy odnośniki na dole również wskazują na przydatne strony. – Gary

+1

Przestrzeń nazw 'SecurityCenter2' przeznaczona jest dla systemów Windows Vista, 7 i 8, dla XP musisz używać przestrzeni nazw' SecurityCenter'. – RRUZ

+0

@wjhguitarman - Dlaczego musisz wykrywać, czy firewall jest zainstalowany? –

Odpowiedz

10

According to Microsoft Q: How does Windows Security Center detect third-party products and their status?

A: Windows Security Center uses a two-tiered approach for detection status. One tier is manual, and the other tier is automatic through Windows Management Instrumentation (WMI). In manual detection mode, Windows Security Center searches for registry keys and files that are provided to Microsoft by independent software manufacturers. These registry keys and files let Windows Security Center detect the status of independent software. In WMI mode, software manufacturers determine their own product status and report that status back to Windows Security Center through a WMI provider. In both modes, Windows Security Center tries to determine whether the following is true:

  • An antivirus program is present.
  • The antivirus signatures are up-to-date.
  • Real-time scanning or on-access scanning is turned on for antivirus programs.
  • For firewalls, Windows Security Center detects whether a third-party firewall is installed and whether the firewall is turned on or not.

Więc można użyć WMI, aby ustalić, czy zapora innej firmy jest zainstalowany, za pomocą klasy FirewallProduct, jakiś czas temu napisałem artykuł na ten temat, które wyjaśniają w jaki sposób uzyskać te informacje za pomocą WMI.

Wypróbuj tę próbkę C#, aby pobrać aktualną nazwę i stan zapory firmowej.

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 

namespace GetWMI_Info 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      try 
      { 
       //select the proper wmi namespace depending of the windows version 
       string WMINameSpace = System.Environment.OSVersion.Version.Major > 5 ? "SecurityCenter2" : "SecurityCenter"; 

       ManagementScope Scope; 
       Scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", WMINameSpace), null); 

       Scope.Connect(); 
       ObjectQuery Query = new ObjectQuery("SELECT * FROM FirewallProduct"); 
       ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query); 

       foreach (ManagementObject WmiObject in Searcher.Get()) 
       { 

        Console.WriteLine("{0,-35} {1,-40}","Firewall Name",WmiObject["displayName"]);      
        if (System.Environment.OSVersion.Version.Major < 6) //is XP ? 
        { 
        Console.WriteLine("{0,-35} {1,-40}","Enabled",WmiObject["enabled"]);  
        } 
        else 
        { 
         Console.WriteLine("{0,-35} {1,-40}","State",WmiObject["productState"]); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace)); 
      } 
      Console.WriteLine("Press Enter to exit"); 
      Console.Read(); 
     } 
    } 
} 
+0

Wow, na pewno znasz swoje rzeczy! Jestem w trakcie testowania twojego przykładu, ale w interesie nie tylko kopiowania wklejania mam pytanie, co to jest "{0, -35} {1, -40}" w 'Console.WriteLine'i jaki jest jego cel? – wjhguitarman

+1

@wjhguitarman są to tylko opcje formatowania, aby ładnie się wyświetlały. –

+0

Przeczytałem więcej na blogu, który zamieściłeś na blogu, i powinienem mieć znacznie wcześniej, przez cały ten czas próbowałem uruchomić go na serwerze 2008, nie wiedząc, że jest on przeznaczony tylko dla wersji na komputery :( – wjhguitarman

Powiązane problemy