2016-12-14 3 views
2

を使用したWindows 10でのポートのファイアウォールの例外を設定すると、私は一緒にこのコードを置く:は、私は、多くの検索を行った後のWindows 10用のファイアウォールの例外を設定しようとしているC#

private const string PROGID_OPEN_PORT = "HNetCfg.FWOpenPort"; 
private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; 
private NetFwTypeLib.INetFwMgr GetFirewallManager() 
{ 
    Type objectType = Type.GetTypeFromCLSID(
     new Guid(CLSID_FIREWALL_MANAGER)); 
    return Activator.CreateInstance(objectType) 
     as NetFwTypeLib.INetFwMgr; 
} 

INetFwMgr manager = GetFirewallManager(); 

Type type = Type.GetTypeFromProgID(PROGID_OPEN_PORT); 
INetFwOpenPort port = Activator.CreateInstance(type) as INetFwOpenPort; 
port.Name = "MyPortRule"; 
port.Port = 9600; 
port.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL; 
port.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; 
port.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY; 

manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(port); 

これは、ファイアウォールルールプットを取得していますセキュリティが強化されたWindowsファイアウォールに追加されますが、ルールのプロファイルはパブリックに設定されます。 Profileをpublicに設定すると、ファイアウォールはポートを介してデータを送信しません。

Windows UIを使用してルールを変更すると、データを通過させるためにプロファイルを「プライベート」または「任意」に設定する必要があると判断されました。 NET.FW_SCOPE_.NET_FW_SCOPE_ALLに設定されたport.Scopeが、プロファイルをAnyに設定しないのはなぜですか?ファイアウォールルールのプロファイルを非公開に設定するにはどうすればよいですか?

また、port.ScopeをNET_FW_SCOPE_.NET_FW_SCOPE_LOCAL_SUBNETに設定しようとしました。プロファイルはまだ 'public'に設定されています。

+1

コピー:http://stackoverflow.com/questions/8488227/create-firewall-rule-to-open-port-per-application-programmatically-in-c-sharp#8505066 – maximdumont

答えて

2

GloballyOpenPortsへの追加が機能しませんでした。スタックオーバーフローによって提案された答えに基づいて、次のコードが機能しました。

INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(
    Type.GetTypeFromProgID("HNetCfg.FWRule")); 
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW; 
firewallRule.Description = "Enables eATM REST Web Service adapter  
    traffic."; 
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN; 
firewallRule.Enabled = true; 
firewallRule.InterfaceTypes = "All"; 
firewallRule.Name = "MyPort"; 
firewallRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; 
firewallRule.LocalPorts = "9600"; 
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(
    Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); 
firewallPolicy.Rules.Add(firewallRule); 

そう...あなたはポートルールのプロファイル値を設定することができなかったためINetFwMgr GloballyOpenPortsがうまくいかなかったところfirewallPolicyとfirewallRuleが働いていました。

Microsoftの誰かがこれを読んでいれば、これらの機能をどのように使用することができるかに関するドキュメントを用意すると役に立ちます。オンライン文書は非常に貧弱です。

関連する問題