1

与えられた - SP2 と複数のネットワーク アダプターを備えた .Net 2.0 XP マシン

ネットワーク アダプタがファイアウォールで保護されているかどうかを確認するために使用できる API はありますか?

OneGuyInDC

4

2 に答える 2

6

以下の c# コードを試してみてください。Windows 7 (および Vista) および XP で動作します。これは、現在のプロファイルのステータスを取得し、Windows ファイアウォールを有効/無効にします。例: ホーム/ドメイン/パブリック アクセス ネットワーク。

使用法:

getFirewallStatus()
  --> Windows ファイアウォールが有効か無効かを true/false で返します。

setFirewallStatus(newStatus)
  --> ファイアウォールの有効/無効を、渡された true/false 値に設定します
      たとえば、ファイアウォールを有効にするには:
         setFirewallStatus(真)

getCurrPolicy()  
  --> 他の 2 つの方法で使用

isWinXP()
  --> Windows のバージョンが WinXP/2000 以降かどうかを返します。つまり、Vista/Win7 です。
      使用するコードを決定するために他のメソッドによって使用されます。

コード:

NetFwTypeLib を使用します。
// (参照に追加することを忘れないでください。COM タブの下にあります)

パブリックブール isWinXP()
{
   オペレーティング システム os = Environment.OSVersion;
   int majorVersion = os.Version.Major;
   // http://msdn.microsoft.com/en-us/library/ms724832(v=vs.85).aspx を参照
   if (majorVersion < 6) // OSがVistaでもWindows7でもない場合
   {
       true を返します。
   }
   そうしないと
   {
       false を返します。
   }
}
プライベート スタティック INetFwPolicy2 getCurrPolicy()
{
    INetFwPolicy2 fwPolicy2;
    Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
    fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
    fwPolicy2 を返します。
}
public bool getFirewallStatus()
{
    ブール結果 = false;
    スイッチ (isWinXP())
    {
        真:
            Type NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
            INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
            結果 = mgr.LocalPolicy.CurrentProfile.FirewallEnabled;
            壊す;
        ケース false:
            INetFwPolicy2 fwPolicy2 = getCurrPolicy();
            NET_FW_PROFILE_TYPE2_ fwCurrentProfileTypes;
            // 現在のプロファイル タイプを読み取ります (パフォーマンスを向上させるためのみ)
            // 各プロパティからの CurrentProfileTypes へのアクセスを回避します
            fwCurrentProfileTypes = (NET_FW_PROFILE_TYPE2_)fwPolicy2.CurrentProfileTypes;
            結果 = (fwPolicy2.get_FirewallEnabled(fwCurrentProfileTypes));
            壊す;
        デフォルト:
            結果 = false; // デフォルトで Win7 を想定
            壊す;
    }
    結果を返します。
}
public void setFirewallStatus(bool newStatus)
{
    スイッチ (isWinXP())
    {
        真:
            Type NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
            INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
            mgr.LocalPolicy.CurrentProfile.FirewallEnabled = newStatus;
            壊す;
        ケース false:
            NET_FW_PROFILE_TYPE2_ fwCurrentProfileTypes;
            INetFwPolicy2 currPolicy = getCurrPolicy();
            // 現在のプロファイル タイプを読み取ります (パフォーマンスを向上させるためのみ)
            // 各プロパティからの CurrentProfileTypes へのアクセスを回避します
            fwCurrentProfileTypes = (NET_FW_PROFILE_TYPE2_)currPolicy.CurrentProfileTypes;
            currPolicy.set_FirewallEnabled(fwCurrentProfileTypes, newStatus);
            壊す;
        デフォルト:
            NET_FW_PROFILE_TYPE2_ fwCurrentProfileTypes1;
            INetFwPolicy2 currPolicy1 = getCurrPolicy();
            // 現在のプロファイル タイプを読み取ります (パフォーマンスを向上させるためのみ)
            // 各プロパティからの CurrentProfileTypes へのアクセスを回避します
            fwCurrentProfileTypes1 = (NET_FW_PROFILE_TYPE2_)currPolicy1.CurrentProfileTypes;
            currPolicy1.set_FirewallEnabled(fwCurrentProfileTypes1, newStatus);
            壊す;
    }
}
于 2011-03-31T09:34:08.247 に答える
2

次の理由により、一般的に(たとえば、外部ファイアウォールがあるかどうか)知ることはできません。

  1. 着信接続を受信して​​いない場合は、外部インターフェイスがダウンしている可能性があります。
  2. 発信接続を確立できない場合は、外部インターフェイスがダウンしている可能性があります。

ただし、特定のネットワークインターフェイスでWindowsファイアウォールが有効になっているかどうかを確認するためのAPIがあります。COM相互運用機能を使用してINetFwProfile(グローバルファイアウォールステータス用)およびINetSharingConfiguration(特定のネットワークインターフェイス用)インターフェイスを取得し、INetFwProfile.FirewallEnabledおよびINetSharingConfiguration.InternetFirewallEnabledを確認する必要があります。

リンクおよびこれらの結果を使用して有効なファイアウォールステータスを判断する方法については、http://msdn.microsoft.com/en-us/library/aa364717%28VS.85%29.aspxを参照してください。(VBScriptで記述されていますが、C#に翻訳可能である必要があります。)

于 2009-11-02T22:09:45.523 に答える