2012-11-28 62 views
13

Tôi đang tiến hành kiểm tra Tường lửa. Mã sau đây khá dễ dàng kiểm tra trạng thái của tường lửa Windows mặc định:Kiểm tra Tường lửa của Bên Thứ ba trên Máy

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

Câu hỏi sau đó trở thành: Làm cách nào để tìm trạng thái của tường lửa không phải Windows? Nếu Tường lửa được tích hợp đúng cách, việc kiểm tra ở trên có hoạt động giống nhau hoặc có phương pháp tốt hơn để thực hiện việc này không? Tôi đã kiểm tra bài đăng này: C# Windows Security Center Settings và bài đăng này: C# - How to chceck if external firewall is enabled? nhưng cả hai đều tỏ ra tương đối không hữu ích.

Tôi đã xem xét API WMI nhưng điều này khá khó hiểu cho đến nay và tài liệu qua MSDN không quá hứa hẹn. Tôi cũng đã cố gắng rối tung xung quanh với SelectQuery nhưng cho đến nay tôi đã không thành công. Có ai có thể hỗ trợ tôi trong một điểm khởi đầu mới hoặc nơi tôi có thể tìm thấy tài liệu/hướng dẫn tốt hơn liên quan đến Tường lửa của bên thứ 3 không?

EDIT: Hiện tại tôi đang khám phá thêm về WMI, cụ thể là lớp FirewallProduct như được đề xuất bởi bài đăng.

UPDATE 2: Tôi đã được thử nghiệm đoạn mã sau:

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

Nhưng chạy kết quả này trong các lỗi sau: Exception Invalid namespace và nó trỏ tới dòng 39 (scope.Connect()). Tôi sẽ không ngạc nhiên nếu tôi chỉ đơn giản là bỏ lỡ một tham số hoặc định dạng một cái gì đó không đúng, tôi chỉ không biết nó là gì.

CẬP NHẬT 3 Chuyển từ SecurityCenter2 sang SecurityCenter vẫn mang lại cùng một lỗi invalid namespace.

CẬP NHẬT 4 Tôi đã chuyển ứng dụng bảng điều khiển sang một hộp khác (win7 không winserver08r2) và được báo cáo đúng cách như mong đợi. Vì vậy, nó có thể là một vấn đề với VM mà tôi hiện đang thử nghiệm. Bước tiếp theo là phân tích trạng thái hoạt động/không hoạt động

CẬP NHẬT 5 Đã được thử nghiệm trên một hộp Server08 khác và xuất hiện lỗi invalid namespace. Sử dụng SecurityCenter thay vì SecurityCenter2 không giải quyết được sự cố. Có một số tính năng bảo mật cơ bản của Windows Server OS sử dụng để ngăn chặn giả mạo với tường lửa, hoặc làm hệ điều hành máy chủ không đi kèm với một tập hợp các tính năng WMI cụ thể?

+1

Bạn có thể khám phá trang này http: //www.codeproject.com/Articles/37714/Software-Development-Build-your-own-Windows-Securi Ba liên kết tham chiếu ở dưới cùng cũng trỏ đến một số trang hữu ích. – Gary

+1

Không gian tên 'SecurityCenter2' là dành cho Windows Vista, 7 và 8, đối với XP, bạn phải sử dụng không gian tên' SecurityCenter'. – RRUZ

+0

@wjhguitarman - Tại sao bạn cần phát hiện nếu tường lửa được cài đặt? –

Trả lời

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.

Vì vậy, bạn có thể sử dụng WMI để xác định xem một bức tường lửa của bên thứ ba được cài đặt, sử dụng lớp FirewallProduct, đôi khi trước, tôi đã viết một bài báo về chủ đề này mà giải thích như thế nào có được thông tin này bằng cách sử dụng WMI.

Hãy thử mẫu này C# để nhận tên tường lửa của bên thứ ba hiện tại và trạng thái được cài đặt.

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 bạn chắc chắn dường như biết nội dung của bạn! Tôi đang ở giữa thử nghiệm ví dụ của bạn nhưng vì lợi ích của việc không chỉ sao chép-dán tôi có một câu hỏi, "{0, -35} {1, -40}" trong 'Console.WriteLine'and là gì mục đích của nó là gì? – wjhguitarman

+1

@wjhguitarman chỉ là các tùy chọn định dạng để nó hiển thị độc đáo. –

+0

Tôi đọc thêm về liên kết blog của bạn mà bạn đã đăng và tôi nên sớm hơn nhiều, toàn bộ thời gian này tôi đã cố gắng làm cho nó hoạt động trên Máy chủ 2008, không biết nó chỉ dành cho phiên bản máy tính để bàn: ( – wjhguitarman

Các vấn đề liên quan