3

Windows 10 のファイアウォールの例外を設定しようとしています。多数の検索を行った後、次のコードをまとめました。

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 ファイアウォールにファイアウォール規則が配置されますが、規則のプロファイルはパブリックに設定されます。プロファイルがパブリックに設定されていると、ファイアウォールはデータがポートを通過することを許可しません。

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

また、port.Scope を NET_FW_SCOPE_.NET_FW_SCOPE_LOCAL_SUBNET に設定してみました。プロファイルはまだ「公開」に設定されています。

4

1 に答える 1

5

GloballyOpenPorts への追加が機能しませんでした。次のコードは、Stack Overflow によって提案された回答に基づいて機能しました。

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 の誰かがこれを読んだ場合、これらの関数の使用方法に関するドキュメントがあると役立ちます。オンライン ドキュメントは非常に貧弱です。

于 2016-12-14T22:14:36.200 に答える