2017-05-24 12 views
1

INetFwPolicy2インターフェイスを使用すると、アプリケーションまたはサービスはファイアウォールポリシーにアクセスできます。私は、Visual Studioを使用していますファイアウォールを有効/無効にする方法は?

質問はこれに関連しているhttps://stackoverflow.com/a/33700472/2451446

コードは少し異なっていると私は防火壁を無効にする問題を抱えています。

ファイアウォールを無効にする前のロジックは問題ありません。

 public Task<StatusCodeResult> ResetFirewallStatus() 
     { 
      Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2"); 
      dynamic mgr = Activator.CreateInstance(netFwPolicy2Type); 

      var fwCurrentProfileTypes = mgr.CurrentProfileTypes; 

      // Get current status 
      bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes); // return true 

      // Disables Firewall 
      mgr.FirewallEnabled(false); //breaks here !!!! 


      return Task.FromResult<StatusCodeResult>(Ok()); 
     } 

エラーメッセージは次のとおりです。

System.ArgumentExceptionの: '値が予想 範囲内に収まっていません。' '' システム.__ ComObject」:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:

は私がある。この場合のエラーでもset_FirewallEnabled(fwCurrentProfileTypes,false);

put_FirewallEnabled(fwCurrentProfileTypes,false)

を使用しようとしました 'set_FirewallEnabled'( 'put_FirewallEnabled' ')の定義が含まれていません


編集

私の解決策:

const int domainProfile = 1; 
const int privateProfile = 2; 
const int publicProfile = 4; 

public bool EnableDisableFirewall(bool enableFirewall) 
{ 
    dynamic mgr = getFwPolicy2(); 

    mgr.FirewallEnabled[domainProfile] = enableFirewall; 
    mgr.FirewallEnabled[privateProfile] = enableFirewall; 
    mgr.FirewallEnabled[publicProfile] = enableFirewall; 

    return enableFirewall; 
} 

public bool IsFirewallOn() 
{ 
    dynamic mgr = getFwPolicy2(); 

    // Get current status 
    var isDomainProfileEnabled = mgr.FirewallEnabled(domainProfile); 
    var isPrivateProfileEnabled = mgr.FirewallEnabled(privateProfile); 
    var isPublicProfileEnabled = mgr.FirewallEnabled(publicProfile); 

    return isDomainProfileEnabled && isPrivateProfileEnabled && isPublicProfileEnabled; 
} 

private object getFwPolicy2() 
{ 
    Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2"); 
    dynamic mgr = Activator.CreateInstance(netFwPolicy2Type); 
    return mgr; 
} 

答えて

2

次の2つの問題を抱えている、遅延バインディングこのコードを書くのは、まさにこの権利を取得するためには役立ちません。 c:\ windows \ system32 \ firewallapi.dllへの参照を追加すると、INetFwPolicy2インターフェイスを直接使用することができます。あなたが争っているのは、FirewallEnabledプロパティがのインデックス付きプロパティであることです。 C#言語には同等のものはありません。 Anyhooは、遅い範囲でそれをやる必要があります:

bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes);

MSDNのドキュメントでは、特にこれについて警告していますが、CurrentProfileTypesによって返される値は使用できません。 specific profileを指定する必要があります。

COM実装のプロパティの特定のケースでは、インデックス付きプロパティに[括弧]を使用できることに注意してください。

mgr.FirewallEnabled(false); //ここで壊れます!!!!

無効にする特定のプロファイルを選択する必要があります。あなたのプログラムが管理者権限を持つ高架実行したときにのみ、ファイアウォールでいじくり回すことができることに注意してください

mgr.FirewallEnabled[profile] = false; 

:適切な構文は次のようになります。まだ完了していない場合はrequired manifestを追加してください。

関連する問題