8

ちょっとした背景: 基本的に、プライベート ネットワークとパブリック ネットワークの両方にプログラム ファイアウォール アクセス ルールを追加したいと考えています。

私はこれを使用していました-「netsh firewall add allowedprogram program= "Path .." name=AppName ENABLE scope=ALL profile=CURRENT」

しかし、今は COM オブジェクトを使用してプロセスを少し自動化したいと考えています。この光沢のあるコードを見つけました - http://web.archive.org/web/20070707110141/http://www.dot.net.nz/Default.aspx?tabid=42&mid=404&ctl=Details&ItemID=8

そして、私が使用しようとしていたクラスを実装した後- FirewallHelper.Instance.GrantAuthorization(@"Path... ","AppName ",NET_FW_SCOPE_.NET_FW_SCOPE_ALL,NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY);

私が直面している問題は、GrantAuthorization メソッドはパブリック ネットワークまたはプライベート ネットワークのルールのみを追加するのに対し、古い netsh コマンドはネットワークごとに 1 つのルールを 2 つ追加することです。

コマンドは実際には非常に似ているように見えるので、ちょっと困惑しています。

では... 両方のネットワーク ルールを追加するにはどうすればよいでしょうか。

ショーン

4

4 に答える 4

15

私の答えは David's answer からのものですが、より詳細です。また、Localports の設定に関する問題を修正しました。Localports を設定する前に Protocol を設定する必要があります。詳細は次のとおりです。

まず、参照 FirewallAPI.dll をインポートする必要があります。「C:\Windows\System32\FirewallAPI.dll」にあります。

using NetFwTypeLib;

コードを次の場所に挿入します。

        Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
        INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
        var currentProfiles = fwPolicy2.CurrentProfileTypes;

        // Let's create a new rule
        INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
        inboundRule.Enabled = true;
        //Allow through firewall
        inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
        //Using protocol TCP
        inboundRule.Protocol = 6; // TCP
        //Port 81
        inboundRule.LocalPorts = "81";
        //Name of rule
        inboundRule.Name = "MyRule";
        // ...//
        inboundRule.Profiles = currentProfiles;

        // Now add the rule
        INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
        firewallPolicy.Rules.Add(inboundRule);
于 2015-12-01T10:25:45.537 に答える
8

あなたの最善の策は、 Advanced Security API を使用して Windows Firewall と話すことだと思います。

「C# INetFwRule2」を Google で検索すると、ファイアウォール ルールを登録または更新する方法の例が多数表示されます。

パブリック ポリシーとプライベート ポリシーの両方に追加するために、次のようなものを使用しました。

Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
var currentProfiles = fwPolicy2.CurrentProfileTypes;

// Let's create a new rule

INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
inboundRule.Enabled = true;
inboundRule.LocalPorts = "1234";
inboundRule.Protocol = 6; // TCP
// ...
inboundRule.Profiles = currentProfiles;

// Now add the rule

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(inboundRule);
于 2013-03-14T17:48:52.700 に答える