2012-03-20 31 views
5

tôi ở đây có một mã làm việc hoàn hảo trong Windows 7 tôi mất sự giúp đỡ từ this bài ....Kiểm soát Windows Firewall trong C# cho Windows 7 và Xp Sp3

vấn đề này được đưa ra khi mà cùng một mã trong biên soạn trên Win Xp PC Sp3. Của nó không comile ... nói giao diện bị mất (lỗi) ....

Tôi không thể hình dung ra được. Tôi đã thêm tài liệu tham khảo một lần nữa để hnetcfg.dll (COM API tham khảo) cho Windows XP (trong windows 7 tôi phải thêm Nother dll "FirewallAPi.dll") để dự

using NATUPNPLib; 
using NETCONLib; 
using NetFwTypeLib; 

Nhưng vẫn là giao diện và khác lớp học là không hiển thị cho VS

tha thứ cho đăng toàn bộ mã

lớp

Firewall quản lý

using System; 
using System.Collections; 
using System.IO; 
using System.Linq; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using NATUPNPLib; 
using NETCONLib; 
using NetFwTypeLib; 

namespace WindowsFirewallManager 
{ 
/// Allows basic access to the windows firewall API. 
/// This can be used to add an exception to the windows firewall 
/// exceptions list 
public class FirewallHelper 
{ 
    #region Variables 

    /// Hooray! Singleton access. 
    private static FirewallHelper instance; 

    /// Interface to the firewall manager COM object 
    private INetFwMgr fireWallManager = null; 


    #endregion 

    #region Properties 

    /// Singleton access to the firewallhelper object. 
    /// Threadsafe. 
    public static FirewallHelper Instance 
    { 
     get 
     { 
      lock (typeof (FirewallHelper)) 
      { 
       return instance ?? (instance = new FirewallHelper()); 
      } 
     } 
    } 

    #endregion 

    #region Constructivat0r 

    /// Private Constructor. 
    /// If this fails, HasFirewall will return false 
    private FirewallHelper() 
    { 
     // Get the type of HNetCfg.FwMgr, or null if an error occurred 
     Type fwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); 

     // Assume failed. 
     fireWallManager = null; 

     if (fwMgrType != null) 
     { 
      try 
      { 
       fireWallManager = 
        (INetFwMgr) Activator.CreateInstance(fwMgrType); 
      } 
       // In all other circumnstances, fireWallManager is null. 
      catch (ArgumentException) 
      { 
      } 
      catch (NotSupportedException) 
      { 
      } 
      catch (TargetInvocationException) 
      { 
      } 
      catch (MissingMethodException) 
      { 
      } 
      catch (MethodAccessException) 
      { 
      } 
      catch (MemberAccessException) 
      { 
      } 
      catch (InvalidComObjectException) 
      { 
      } 
      catch (COMException) 
      { 
      } 
      catch (TypeLoadException) 
      { 
      } 
     } 
    } 

    #endregion 

    #region Helper Methods 

    /// Gets whether or not the firewall is installed on this computer. 
    public bool IsFirewallInstalled 
    { 
     get 
     { 
      return fireWallManager != null && 
        fireWallManager.LocalPolicy != null && 
        fireWallManager.LocalPolicy.CurrentProfile != null; 
     } 
    } 

    /// Returns whether or not the firewall is enabled. 
    /// If the firewall is not installed, this returns false. 
    public bool IsFirewallEnabled 
    { 
     get 
     { 
      return IsFirewallInstalled && 
        fireWallManager.LocalPolicy.CurrentProfile. 
         FirewallEnabled; 
     } 
    } 

    /// Returns whether or not the firewall allows Application "Exceptions". 
    /// If the firewall is not installed, this returns false. 
    /// 
    /// 
    /// Added to allow access to this method 
    public bool AppAuthorizationsAllowed 
    { 
     get 
     { 
      return IsFirewallInstalled && 
        !fireWallManager.LocalPolicy.CurrentProfile. 
         ExceptionsNotAllowed; 
     } 
    } 

    /// Adds an application to the list of authorized applications. 
    /// If the application is already authorized, does nothing. 
    /// 
    /// 
    /// The full path to the application executable. This cannot 
    /// be blank, and cannot be a relative path. 
    /// 
    /// 
    /// This is the name of the application, purely for display 
    /// puposes in the Microsoft Security Center. 
    /// 
    /// 
    /// When applicationFullPath is null OR 
    /// When appName is null. 
    /// 
    /// 
    /// When applicationFullPath is blank OR 
    /// When appName is blank OR 
    /// applicationFullPath contains invalid path characters OR 
    /// applicationFullPath is not an absolute path 
    /// 
    /// 
    /// If the firewall is not installed OR 
    /// If the firewall does not allow specific application 'exceptions' OR 
    /// Due to an exception in COM this method could not create the 
    /// necessary COM types 
    /// 
    /// 
    /// If no file exists at the given applicationFullPath 
    public void GrantAuthorization(string applicationFullPath, 
            string appName, 
            NET_FW_SCOPE_ scope, 
            NET_FW_IP_VERSION_ ipVersion) 
    { 
     #region Parameter checking 

     if (applicationFullPath == null) 
      throw new ArgumentNullException("applicationFullPath"); 
     if (appName == null) 
      throw new ArgumentNullException("appName"); 
     if (applicationFullPath.Trim().Length == 0) 
      throw new ArgumentException(
       "applicationFullPath must not be blank"); 
     if (applicationFullPath.Trim().Length == 0) 
      throw new ArgumentException("appName must not be blank"); 
     if (applicationFullPath.IndexOfAny(Path.InvalidPathChars) >= 0) 
      throw new ArgumentException(
       "applicationFullPath must not contain invalid path characters"); 
     if (!Path.IsPathRooted(applicationFullPath)) 
      throw new ArgumentException(
       "applicationFullPath is not an absolute path"); 
     if (!File.Exists(applicationFullPath)) 
      throw new FileNotFoundException("File does not exist", 
              applicationFullPath); 

     // State checking 
     if (!IsFirewallInstalled) 
      throw new FirewallHelperException(
       "Cannot grant authorization: Firewall is not installed."); 
     if (!AppAuthorizationsAllowed) 
      throw new FirewallHelperException(
       "Application exemptions are not allowed."); 

     #endregion 

     if (!HasAuthorization(applicationFullPath)) 
     { 
      // Get the type of HNetCfg.FwMgr, or null if an error occurred 
      Type authAppType = 
       Type.GetTypeFromProgID("HNetCfg.FwAuthorizedApplication", 
             false); 

      // Assume failed. 
      INetFwAuthorizedApplication appInfo = null; 

      if (authAppType != null) 
      { 
       try 
       { 
        appInfo = 
         (INetFwAuthorizedApplication) 
         Activator.CreateInstance(authAppType); 
       } 
        // In all other circumnstances, appInfo is null. 
       catch (ArgumentException) 
       { 
       } 
       catch (NotSupportedException) 
       { 
       } 
       catch (TargetInvocationException) 
       { 
       } 
       catch (MissingMethodException) 
       { 
       } 
       catch (MethodAccessException) 
       { 
       } 
       catch (MemberAccessException) 
       { 
       } 
       catch (InvalidComObjectException) 
       { 
       } 
       catch (COMException) 
       { 
       } 
       catch (TypeLoadException) 
       { 
       } 
      } 

      if (appInfo == null) 
       throw new FirewallHelperException(
        "Could not grant authorization: can't create INetFwAuthorizedApplication instance."); 

      appInfo.Name = appName; 
      appInfo.ProcessImageFileName = applicationFullPath; 
      appInfo.Scope = scope; 
      appInfo.IpVersion = ipVersion; 
      appInfo.Enabled = true; 
      // ... 
      // Use defaults for other properties of the AuthorizedApplication COM object 

      // Authorize this application 
      fireWallManager.LocalPolicy.CurrentProfile. 
       AuthorizedApplications.Add(appInfo); 
     } 
     // otherwise it already has authorization so do nothing 
    } 

    /// Removes an application to the list of authorized applications. 
    /// Note that the specified application must exist or a FileNotFound 
    /// exception will be thrown. 
    /// If the specified application exists but does not current have 
    /// authorization, this method will do nothing. 
    /// 
    /// 
    /// The full path to the application executable. This cannot 
    /// be blank, and cannot be a relative path. 
    /// 
    /// 
    /// When applicationFullPath is null 
    /// 
    /// 
    /// When applicationFullPath is blank OR 
    /// applicationFullPath contains invalid path characters OR 
    /// applicationFullPath is not an absolute path 
    /// 
    /// 
    /// If the firewall is not installed. 
    /// 
    /// 
    /// If the specified application does not exist. 
    public void RemoveAuthorization(string applicationFullPath) 
    { 
     #region Parameter checking 

     if (applicationFullPath == null) 
      throw new ArgumentNullException("applicationFullPath"); 
     if (applicationFullPath.Trim().Length == 0) 
      throw new ArgumentException(
       "applicationFullPath must not be blank"); 
     if (applicationFullPath.IndexOfAny(Path.InvalidPathChars) >= 0) 
      throw new ArgumentException(
       "applicationFullPath must not contain invalid path characters"); 
     if (!Path.IsPathRooted(applicationFullPath)) 
      throw new ArgumentException(
       "applicationFullPath is not an absolute path"); 
     if (!File.Exists(applicationFullPath)) 
      throw new FileNotFoundException("File does not exist", 
              applicationFullPath); 
     // State checking 
     if (!IsFirewallInstalled) 
      throw new FirewallHelperException(
       "Cannot remove authorization: Firewall is not installed."); 

     #endregion 

     if (HasAuthorization(applicationFullPath)) 
     { 
      // Remove Authorization for this application 
      fireWallManager.LocalPolicy.CurrentProfile. 
       AuthorizedApplications.Remove(applicationFullPath); 
     } 
     // otherwise it does not have authorization so do nothing 
    } 

    /// Returns whether an application is in the list of authorized applications. 
    /// Note if the file does not exist, this throws a FileNotFound exception. 
    /// 
    /// 
    /// The full path to the application executable. This cannot 
    /// be blank, and cannot be a relative path. 
    /// 
    /// 
    /// The full path to the application executable. This cannot 
    /// be blank, and cannot be a relative path. 
    /// 
    /// 
    /// When applicationFullPath is null 
    /// 
    /// 
    /// When applicationFullPath is blank OR 
    /// applicationFullPath contains invalid path characters OR 
    /// applicationFullPath is not an absolute path 
    /// 
    /// 
    /// If the firewall is not installed. 
    /// 
    /// 
    /// If the specified application does not exist. 
    public bool HasAuthorization(string applicationFullPath) 
    { 
     #region Parameter checking 

     if (applicationFullPath == null) 
      throw new ArgumentNullException("applicationFullPath"); 
     if (applicationFullPath.Trim().Length == 0) 
      throw new ArgumentException(
       "applicationFullPath must not be blank"); 
     if (applicationFullPath.IndexOfAny(Path.InvalidPathChars) >= 0) 
      throw new ArgumentException(
       "applicationFullPath must not contain invalid path characters"); 
     if (!Path.IsPathRooted(applicationFullPath)) 
      throw new ArgumentException(
       "applicationFullPath is not an absolute path"); 
     if (!File.Exists(applicationFullPath)) 
      throw new FileNotFoundException("File does not exist.", 
              applicationFullPath); 
     // State checking 
     if (!IsFirewallInstalled) 
      throw new FirewallHelperException(
       "Cannot remove authorization: Firewall is not installed."); 

     #endregion 

     // Locate Authorization for this application 
     return 
      GetAuthorizedAppPaths().Cast<string>().Any(
       appName => 
       appName.ToLower() == applicationFullPath.ToLower()); 

     // Failed to locate the given app. 
    } 

    /// Retrieves a collection of paths to applications that are authorized. 
    /// 
    /// 
    /// 
    /// If the Firewall is not installed. 
    public ICollection GetAuthorizedAppPaths() 
    { 
     // State checking 
     if (!IsFirewallInstalled) 
      throw new FirewallHelperException(
       "Cannot remove authorization: Firewall is not installed."); 

     ArrayList list = new ArrayList(); 
     // Collect the paths of all authorized applications 
     foreach (
      INetFwAuthorizedApplication app in 
       fireWallManager.LocalPolicy.CurrentProfile. 
        AuthorizedApplications) 
      list.Add(app.ProcessImageFileName); 

     return list; 
    } 

    #endregion 
} 
} 

Exception

using System; 

namespace WindowsFirewallManager 
{ 
/// 
/// Describes a FirewallHelperException. 
/// 
public class FirewallHelperException : Exception 
{ 
    /// 
    /// Construct a new FirewallHelperException 
    /// 
    /// 
    public FirewallHelperException(string message) 
     : base(message) 
    { } 
} 
} 

Làm thế nào tôi có thể làm cho FirewallManager compatibel với cả hai phiên bản hệ điều hành hoặc cách anyother nếu có thể

cảm ơn vì sự giúp đỡ ....

Trả lời

3

Nó được đề cập rõ ràng trong phần Nhận xét của bài viết MSDN cho INetFwMgr:

Windows Vista: Người dùng Windows Vista phải sử dụng các ứng dụng được phát triển trong Windows Vista cho tất cả các phương pháp và thuộc tính của giao diện này.

Cách nào để nói rằng triển khai giao diện INetFwMgr là thay thế trong Vista. Nó có một IID mới vì vậy nếu bạn xây dựng chương trình của bạn trên một máy chạy Vista hoặc cao hơn thì chương trình của bạn sẽ rơi trên XP. Bạn sẽ cần phải tạo một chương trình đặc biệt cho chương trình của bạn cho người dùng XP. Bạn sẽ cần phải làm như vậy bằng cách sử dụng thư viện kiểu được nhúng trong phiên bản XP của c: \ windows \ system32 \ firewallapi.dll. Lấy thư viện interop bằng cách chạy tlbimp.exe trên DLL đó. Có một máy hoặc VM khởi động XP tất nhiên sẽ là một cách tốt để có được một bản sao của DLL đó và để kiểm tra bản build của bạn.

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