Firewall のオープン設定

ファイアウォールを通過させる設定を c# で。

参照設定に COM の NetFwTypeLib が必要。(Vista以降?)OS によって名前違うかも。

private static INetFwMgr GetFirewallManager() {
	Type type = Type.GetTypeFromProgID( "HNetCfg.FwMgr" );
	return (INetFwMgr)Activator.CreateInstance( type );
}

//アプリケーションを指定してファイアウォールを通過させる。
static public void AuthorizeApplication( string title, string filePath ) {
	Type type = Type.GetTypeFromProgID( "HNetCfg.FwAuthorizedApplication" );
	INetFwAuthorizedApplication fwAuth = (INetFwAuthorizedApplication)Activator.CreateInstance( type );
	fwAuth.Name = title;
	fwAuth.ProcessImageFileName = Path.GetFullPath( filePath );
	fwAuth.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
	fwAuth.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY;
	fwAuth.Enabled = true;

	INetFwMgr manager = GetFirewallManager();
	manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add( fwAuth );
}

//ポートを指定してファイアウォールを通過させる。
public void OpenPort( string title, int portNo, NET_FW_IP_PROTOCOL_ protocol ) {
	Type type = Type.GetTypeFromProgID( "HNetCfg.FWOpenPort" );
	INetFwOpenPort port = (INetFwOpenPort)Activator.CreateInstance( type );
	port.Name = title; port.Port = portNo; port.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
	port.Protocol = protocol;
	port.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY;

	INetFwMgr manager = GetFirewallManager();
	manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add( port );
}

アプリ指定だとなぜかTCPUDP両方指定されるんだけど。片一方ってのはわからん。
INetFwAuthorizedApplication にその設定ないし。