title: Automating Windows Firewall with
body: <p>I have C# Application that uses PORT 777 for asynchronous communication and PORT 3306 for communication with My Sql Server. Problems arise when the ports is blocked by a firewall. I tried to create a program to add an exception in the firewall list of Windows 7. </p>
  
  <p>When i run the program, i get bug as follow: "Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))".</p>
  
  <p>I do not understand what these errors mean, any suggestion is welcome, Thanks.</p>
  
  <pre><code>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);
      }
  }
  </code></pre>