2012-01-17 215 views
2

我有一個使用端口777與我的SQL Server通信異步通信和3306端口C#中的應用。當端口被防火牆阻止時出現問題。我嘗試創建一個程序,在Windows 7的防火牆列表中添加一個異常。自動化Windows防火牆

當我運行該程序時,出現如下錯誤:「災難性故障(異常來自HRESULT:0x8000FFFF(E_UNEXPECTED))」。

我不明白這些錯誤的意思是,任何的建議是值得歡迎的,謝謝。

protected internal void AddExceptionToFirewall(){ 
    try { 
     INetFwMgr fireWall = null; 
     INetFwAuthorizedApplications apps = null; 
     INetFwAuthorizedApplication app = null; 
     Type progID = null; 
     INetFwOpenPorts ports = null; 
     INetFwOpenPort asyncPort = null; 
     INetFwOpenPort mysqlPort = null; 
     bool appFounded = false; 
     bool asyncPortFounded = false; 
     bool mysqlPortFounded = false; 

     progID = Type.GetTypeFromProgID("HNetCfg.FwMgr"); 

     // checking for Windows Firewall 
     fireWall = (INetFwMgr)Activator.CreateInstance(progID); 
     if (fireWall.LocalPolicy.CurrentProfile.FirewallEnabled) { 

      // obtain the list of authorized applications 
      apps = (INetFwAuthorizedApplications)fireWall.LocalPolicy.CurrentProfile.AuthorizedApplications; 
      IEnumerator appEnumerate = apps.GetEnumerator(); 
      while (appEnumerate.MoveNext()){ 
       app = (INetFwAuthorizedApplication)appEnumerate.Current; 
       if (app.Name == Application.ProductName){ 
        appFounded = true; 
        break; 
       } 
      } 

      // add this application to the list of authorized applications 
      if(appFounded==false){ 
       app.Name = Application.ProductName; 
       StringBuilder strBuild = new StringBuilder(); 
       strBuild.Append(Application.ExecutablePath.Replace("\\","\\\\")); 
       app.ProcessImageFileName = strBuild.ToString(); 
       app.Enabled = true; 
       apps = (INetFwAuthorizedApplications)fireWall.LocalPolicy.CurrentProfile.AuthorizedApplications; 
       apps.Add(app); 
      } 

      // obtain the list of authorized asynchronous socket ports (777) 
      ports = (INetFwOpenPorts)fireWall.LocalPolicy.CurrentProfile.GloballyOpenPorts; 
      IEnumerator portEnumerate = ports.GetEnumerator(); 
      while (portEnumerate.MoveNext()) { 
       asyncPort = (INetFwOpenPort)portEnumerate.Current; 
       if (asyncPort.Port == 777) { 
        asyncPortFounded = true; 
        break; 
       } 
      } 

      // add a port 777 to globally open ports 
      if (asyncPortFounded==false) 
       ports.Add(asyncPort); 


      // obtain the list of authorized mysql socket ports(3306) 
      while (portEnumerate.MoveNext()) { 
       mysqlPort = (INetFwOpenPort)portEnumerate.Current; 
       if (mysqlPort.Port == 3306) { 
        mysqlPortFounded = true; 
        break; 
       } 
      } 

      // add a port 3306 to globally open ports 
      if (mysqlPortFounded == false) 
       ports.Add(mysqlPort); 

     } 
    } 
    catch (COMException cm) { 
     MessageBox.Show(cm.Message); 
    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message); 
    } 
} 
+0

是否有一個 '內部錯誤'(內*例外*)? – 2012-01-17 04:23:24

回答

10

http://www.codeproject.com/Articles/14906/Open-Windows-Firewall-During-Installation

  1. 使用下列程序之前,請補充參考FirewallAPI.dll到Visual Studio 2010 執行以下操作: 右鍵單擊該項目 Solution Explorer中的Visual Studio 2010 - 選擇添加參照的文ce - 選擇C:\ Windows \ System32 \ FirewallAPI.dll - 好的

  2. 調用程序防火牆,下面有3行代碼。你可以把這段代碼在你的程序的形式負載:

    private clsFirewall objFirewall = new clsFirewall(); 
        objFirewall.CloseFirewall(); 
        objFirewall.OpenFirewall(); 
    

/*自動化Windows防火牆C#支持Windows 7 */

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
using System.Threading; 
using NetFwTypeLib; 
using System.Windows.Forms; 


namespace MyFirewall { 

    public class clsFirewall { 

    private int[] portsSocket = { 777, 3306 }; 
    private string[] portsName = { "AsyncPort", "MySqlPort" }; 
    private INetFwProfile fwProfile = null; 

    protected internal void OpenFirewall() { 
     INetFwAuthorizedApplications authApps = null; 
     INetFwAuthorizedApplication authApp = null; 
     INetFwOpenPorts openPorts = null; 
     INetFwOpenPort openPort = null; 
     try { 
      if (isAppFound(Application.ProductName + " Server") == false) { 
       SetProfile(); 
       authApps = fwProfile.AuthorizedApplications; 
       authApp = GetInstance("INetAuthApp") as INetFwAuthorizedApplication; 
       authApp.Name = Application.ProductName + " Server"; 
       authApp.ProcessImageFileName = Application.ExecutablePath; 
       authApps.Add(authApp); 
      } 

      if (isPortFound(portsSocket[0]) == false) { 
       SetProfile(); 
       openPorts = fwProfile.GloballyOpenPorts; 
       openPort = GetInstance("INetOpenPort") as INetFwOpenPort; 
       openPort.Port = portsSocket[0]; 
       openPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; 
       openPort.Name = portsName[0]; 
       openPorts.Add(openPort); 
      } 

      if (isPortFound(portsSocket[1]) == false) { 
       SetProfile(); 
       openPorts = fwProfile.GloballyOpenPorts; 
       openPort = GetInstance("INetOpenPort") as INetFwOpenPort; 
       openPort.Port = portsSocket[1]; 
       openPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; 
       openPort.Name = portsName[1]; 
       openPorts.Add(openPort); 
      } 

     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
     finally { 
      if (authApps != null) authApps = null; 
      if (authApp != null) authApp = null; 
      if (openPorts != null) openPorts = null; 
      if (openPort != null) openPort = null; 
     } 
    } 

    protected internal void CloseFirewall() { 
     INetFwAuthorizedApplications apps = null; 
     INetFwOpenPorts ports = null; 
     try { 
      if (isAppFound(Application.ProductName + " Server") == true) { 
       SetProfile(); 
       apps = fwProfile.AuthorizedApplications; 
       apps.Remove(Application.ExecutablePath); 
      } 

      if (isPortFound(portsSocket[0]) == true) { 
       SetProfile(); 
       ports = fwProfile.GloballyOpenPorts; 
       ports.Remove(portsSocket[0], NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP); 
      } 

      if (isPortFound(portsSocket[1]) == true) { 
       SetProfile(); 
       ports = fwProfile.GloballyOpenPorts; 
       ports.Remove(portsSocket[1], NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP); 
      } 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
     finally { 
      if (apps != null) apps = null; 
      if (ports != null) ports = null; 
     } 
    } 

    protected internal bool isAppFound(string appName) { 
     bool boolResult = false; 
     Type progID = null; 
     INetFwMgr firewall = null; 
     INetFwAuthorizedApplications apps = null; 
     INetFwAuthorizedApplication app = null; 
     try { 
      progID = Type.GetTypeFromProgID("HNetCfg.FwMgr"); 
      firewall = Activator.CreateInstance(progID) as INetFwMgr; 
      if (firewall.LocalPolicy.CurrentProfile.FirewallEnabled) { 
       apps = firewall.LocalPolicy.CurrentProfile.AuthorizedApplications; 
       IEnumerator appEnumerate = apps.GetEnumerator(); 
       while ((appEnumerate.MoveNext())) { 
        app = appEnumerate.Current as INetFwAuthorizedApplication; 
        if (app.Name == appName) { 
         boolResult = true; 
         break; 
        } 
       } 
      } 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
     finally { 
      if (progID != null) progID = null; 
      if (firewall != null) firewall = null; 
      if (apps != null) apps = null; 
      if (app != null) app = null; 
     } 
     return boolResult; 
    } 

    protected internal bool isPortFound(int portNumber) { 
     bool boolResult = false; 
     INetFwOpenPorts ports = null; 
     Type progID = null; 
     INetFwMgr firewall = null; 
     INetFwOpenPort currentPort = null; 
     try { 
      progID = Type.GetTypeFromProgID("HNetCfg.FwMgr"); 
      firewall = Activator.CreateInstance(progID) as INetFwMgr; 
      ports = firewall.LocalPolicy.CurrentProfile.GloballyOpenPorts; 
      IEnumerator portEnumerate = ports.GetEnumerator(); 
      while ((portEnumerate.MoveNext())) { 
       currentPort = portEnumerate.Current as INetFwOpenPort; 
       if (currentPort.Port == portNumber) { 
        boolResult = true; 
        break; 
       } 
      } 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      if (ports != null) ports = null; 
      if (progID != null) progID = null; 
      if (firewall != null) firewall = null; 
      if (currentPort != null) currentPort = null; 
     } 
     return boolResult; 
    } 

    protected internal void SetProfile() { 
     INetFwMgr fwMgr = null; 
     INetFwPolicy fwPolicy = null; 
     try { 
      fwMgr = GetInstance("INetFwMgr") as INetFwMgr; 
      fwPolicy = fwMgr.LocalPolicy; 
      fwProfile = fwPolicy.CurrentProfile; 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
     finally { 
      if (fwMgr != null) fwMgr = null; 
      if (fwPolicy != null) fwPolicy = null; 
     } 
    } 

    protected internal object GetInstance(string typeName) { 
     Type tpResult = null; 
     switch (typeName) { 
      case "INetFwMgr": 
       tpResult = Type.GetTypeFromCLSID(new Guid("{304CE942-6E39-40D8-943A-B913C40C9CD4}")); 
       return Activator.CreateInstance(tpResult); 
      case "INetAuthApp": 
       tpResult = Type.GetTypeFromCLSID(new Guid("{EC9846B3-2762-4A6B-A214-6ACB603462D2}")); 
       return Activator.CreateInstance(tpResult); 
      case "INetOpenPort": 
       tpResult = Type.GetTypeFromCLSID(new Guid("{0CA545C6-37AD-4A6C-BF92-9F7610067EF5}")); 
       return Activator.CreateInstance(tpResult); 
      default: 
       return null; 
     } 
    } 

    } 
} 
4

接受的由Javanese Girl回答了一個類似C的實現,其中聲明使用免費模式和冗餘代碼。這是基於該答案的重構實現。它將所有相同的調用用於FirewallAPI.dll;它在功能上是等同的,因此它解決了原始問題無法使這些類型的防火牆操作起作用的問題。該解決方案有一個簡單的界面,可以隱藏所有的細節:IsPortOpen,OpenPort和ClosePort。

實例應用:

int port = 9914; 
if (IsPortOpen(port)) 
    ClosePort(port); 
OpenPort(port, "StreamBeam API"); 

實現:

using System; 
using System.Collections; 

using NetFwTypeLib; 

namespace YourCompany 
{ 
    public static class FirewallUtils 
    { 
     public static bool IsPortOpen(int port) 
     { 
      EnsureSetup(); 

      Type progID = Type.GetTypeFromProgID("HNetCfg.FwMgr"); 
      INetFwMgr firewall = Activator.CreateInstance(progID) as INetFwMgr; 
      INetFwOpenPorts ports = firewall.LocalPolicy.CurrentProfile.GloballyOpenPorts; 
      IEnumerator portEnumerate = ports.GetEnumerator(); 
      while ((portEnumerate.MoveNext())) 
      { 
       INetFwOpenPort currentPort = portEnumerate.Current as INetFwOpenPort; 
       if (currentPort.Port == port) 
        return true; 
      } 
      return false; 
     } 

     public static void OpenPort(int port, string applicationName) 
     { 
      EnsureSetup(); 

      if (IsPortOpen(port)) 
       return; 

      INetFwOpenPort openPort = GetInstance("INetOpenPort") as INetFwOpenPort; 
      openPort.Port = port; 
      openPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; 
      openPort.Name = applicationName; 

      INetFwOpenPorts openPorts = sm_fwProfile.GloballyOpenPorts; 
      openPorts.Add(openPort); 
     } 

     public static void ClosePort(int port) 
     { 
      EnsureSetup(); 

      if (!IsPortOpen(port)) 
       return; 

      INetFwOpenPorts ports = sm_fwProfile.GloballyOpenPorts; 
      ports.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP); 
     } 

     private static object GetInstance(string typeName) 
     { 
      Type tpResult = null; 
      switch (typeName) 
      { 
       case "INetFwMgr": 
        tpResult = Type.GetTypeFromCLSID(new Guid("{304CE942-6E39-40D8-943A-B913C40C9CD4}")); 
        return Activator.CreateInstance(tpResult); 
       case "INetAuthApp": 
        tpResult = Type.GetTypeFromCLSID(new Guid("{EC9846B3-2762-4A6B-A214-6ACB603462D2}")); 
        return Activator.CreateInstance(tpResult); 
       case "INetOpenPort": 
        tpResult = Type.GetTypeFromCLSID(new Guid("{0CA545C6-37AD-4A6C-BF92-9F7610067EF5}")); 
        return Activator.CreateInstance(tpResult); 
       default: 
        throw new Exception("Unknown type name: " + typeName); 
      } 
     } 

     private static void EnsureSetup() 
     { 
      if (sm_fwProfile != null) 
       return; 

      INetFwMgr fwMgr = GetInstance("INetFwMgr") as INetFwMgr; 
      sm_fwProfile = fwMgr.LocalPolicy.CurrentProfile; 
     } 

     private static INetFwProfile sm_fwProfile = null; 
    } 
} 
+0

沒問題!很高興我能幫上忙。 – 2017-02-03 02:41:40