Click here to Skip to main content
6,595,854 members and growing! (18,291 online)
Email Password   helpLost your password?
Web Development » ASP.NET » Samples     Intermediate License: The Code Project Open License (CPOL)

Open Windows Firewall During Installation

By Don Hamson

This test code will serve as an MSI custom action to open the Windows firewall after installation.
C#, Windows, .NET, ASP.NET, Visual Studio, Dev
Version:2 (See All)
Posted:23 Jul 2006
Views:29,541
Bookmarked:18 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
6 votes for this article.
Popularity: 2.80 Rating: 3.60 out of 5

1

2
2 votes, 33.3%
3
4 votes, 66.7%
4

5

Introduction

During the installation of my application, I needed to add it to the Windows firewall as an allowed application and open two ports for another application. This code will function as a custom action during the install to open the firewall on install and close it on uninstall. In trying to keep things as simple as possible, the following C# class library will be called from the setup - openFirewall() and closeFirewall().

First, I generated the FWSetupAction project as a C# class library. After that, I use the properties page to switch the output type to a console application to step through it with the debugger. When it's operational, switch back to the class library for integration with the MSI setup logic and incorporate it as a custom action.

After the initial project creation, rename Class1.cs to Firewall.cs in the Solution Navigator. If you're writing code anew, add the NetFwTypeLib reference first to allow intellisense to help you recognize the terms you'll be coding. This reference will be required for correct compilation, so whether you put it in before coding or after doesn't matter, but it will be needed. To add the reference, right click on References and select Browse. Browse to %windir%\system32\hnetcfg.dll and select it - the NetFwTypeLib will be created.

Edit the Firewall.cs class to have the following code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using NetFwTypeLib;
using Microsoft.Win32;
namespace FWSetupAction
{
public class Firewall
{
    protected int[] discoPorts = { 0xD100, 0xD101 };
    protected INetFwProfile fwProfile;

    public void openFirewall()
    {
        ///////////// Firewall Authorize Application ////////////
        String imageFilename = getImageFilename();
        setProfile();
        NetFwAuthorizedApplications apps = fwProfile.AuthorizedApplications;
        INetFwAuthorizedApplication app = 
          ( INetFwAuthorizedApplication ) getInstance( "INetAuthApp" );
        app.Name = "Application Name";
        app.ProcessImageFileName = imageFilename;
        apps.Add( app );
        apps = null;

        //////////////// Open Needed Ports /////////////////
        INetFwOpenPorts openports = fwProfile.GloballyOpenPorts;
        foreach( int port in discoPorts )
        {
            INetFwOpenPort openport = 
              ( INetFwOpenPort ) getInstance( "INetOpenPort" );
            openport.Port = port;
            openport.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
            openport.Name = "New Open Port";
            openports.Add( openport );
        }
        openports = null;
    } // openFirewall

    public void closeFirewall()
    {
        String imageFilename = getImageFilename();
        setProfile();
        INetFwAuthorizedApplications apps = fwProfile.AuthorizedApplications;
        apps.Remove( imageFilename );
        apps = null;
        INetFwOpenPorts ports = fwProfile.GloballyOpenPorts;
        ports.Remove( discoPorts[ 0 ], NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP );
        ports.Remove( discoPorts[ 1 ], NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP );
        ports = null;
    }

    protected string getImageFilename()
    {
        // Get install directory from the registry
        RegistryKey pRegKey = Registry.LocalMachine;
        pRegKey = pRegKey.OpenSubKey( "SOFTWARE\\Company Directory\\AppDir" );
        Object insDir = pRegKey.GetValue( "InstallDir" );
        return insDir + "RVP.exe";
    }

    protected void setProfile()
    {
        // Access INetFwMgr
        INetFwMgr fwMgr = ( INetFwMgr ) getInstance( "INetFwMgr" );
        INetFwPolicy fwPolicy = fwMgr.LocalPolicy;
        fwProfile = fwPolicy.CurrentProfile;
        fwMgr = null;
        fwPolicy = null;
    }

    protected Object getInstance( String typeName )
    {
        if( typeName == "INetFwMgr" )
        {
            Type type = Type.GetTypeFromCLSID(
            new Guid( "{304CE942-6E39-40D8-943A-B913C40C9CD4}" ) );
            return Activator.CreateInstance( type );
        }
        else if( typeName == "INetAuthApp" )
        {
            Type type = Type.GetTypeFromCLSID(
            new Guid( "{EC9846B3-2762-4A6B-A214-6ACB603462D2}" ) );
            return Activator.CreateInstance( type );
        }
        else if( typeName == "INetOpenPort" )
        {
            Type type = Type.GetTypeFromCLSID(
            new Guid( "{0CA545C6-37AD-4A6C-BF92-9F7610067EF5}" ) );
            return Activator.CreateInstance( type );
        }
        else return null;
    }

    static void Main( string[] args )
    {
        Firewall fw = new Firewall();
        fw.openFirewall();
        fw.closeFirewall();
    }
}
}

Once compiled, you're ready to test. Set a breakpoint on each of the firewall entry methods - openFirewall() and closeFirewall(), and step through the program. Use a DOS box to verify the operations. The netsh firewall command will verify the operation of the code:

  • netsh fire show allowed - shows the programs that are allowed
  • netsh fire show port - shows the ports that are open

Acknowledgements

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Don Hamson


Member

Occupation: Web Developer
Location: United States United States

Other popular ASP.NET articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 26 (Total in Forum: 26) (Refresh)FirstPrevNext
GeneralNetFwAuthorizedApplications type Pinmembertriplebit7:10 25 Sep '09  
GeneralRe: NetFwAuthorizedApplications type PinmemberDonsw11:36 27 Oct '09  
Generalgood for xp PinmemberDonsw8:00 18 Sep '09  
GeneralDoes it work on vista? PinmemberDavid Engler11:10 29 May '08  
GeneralRe: Does it work on vista? PinmemberJmgxu4:57 21 Dec '08  
GeneralHelp anybody - very peculiar bug PinmemberDave Midgley9:13 28 Nov '07  
GeneralRe: Help anybody - very peculiar bug [modified] PinmemberDon Hamson0:31 29 Nov '07  
GeneralSetting things back to null PinmemberDave Midgley8:16 28 Nov '07  
GeneralRe: Setting things back to null PinmemberDon Hamson23:33 28 Nov '07  
GeneralError checking PinmemberDave Midgley6:40 26 Nov '07  
AnswerRe: Error checking PinmemberDon Hamson17:51 26 Nov '07  
GeneralRe: Error checking PinmemberDave Midgley8:14 28 Nov '07  
GeneralRe: Error checking PinmemberDon Hamson23:19 28 Nov '07  
Questionnecessary privs PinmemberAleRanza6:11 25 May '07  
AnswerRe: necessary privs PinmemberDon Hamson14:48 25 May '07  
GeneralA different way of doing things PinmemberYiogi6:04 11 Jan '07  
GeneralRe: A different way of doing things Pinmembershysan3:29 24 Apr '07  
Generalsecurity caveat Pinmemberkckn4fun3:03 26 Jul '06  
GeneralRe: security caveat PinmemberDon Hamson9:34 26 Jul '06  
GeneralRe: security caveat Pinmembertverweij22:17 26 Jul '06  
GeneralRe: security caveat [modified] PinmemberDon Hamson4:36 27 Jul '06  
GeneralRe: security caveat PinmemberJason Barry14:20 26 Jun '08  
GeneralThis is not a feature, but a security leak [modified] Pinmembertverweij8:04 25 Jul '06  
GeneralRe: This is not a feature, but a security leak PinmemberDon Hamson2:36 26 Jul '06  
GeneralRe: This is not a feature, but a security leak Pinmembertverweij22:20 26 Jul '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 23 Jul 2006
Editor: Smitha Vijayan
Copyright 2006 by Don Hamson
Everything else Copyright © CodeProject, 1999-2009
Web19 | Advertise on the Code Project