8

ファイアウォール製品が有効になっているかどうかを (C# で記述された Windows フォーム アプリケーションから) 検出するにはどうすればよいですか?

ここに私のコードがあり、INetFwMgr で型または名前空間が見つからないというエラーが発生しています

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; 

       INetFwMgr manager = GetFireWallManager();
       bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;



       private static INetFwMgr GetFireWallManager()
       {
           Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
           return Activator.CreateInstance(objectType) as INetFwMgr;
       }
        private void button1_Click(object sender, EventArgs e)
        {



            if (isFirewallEnabled == false)
           {
                MessageBox.Show("Firewall is not enabled.");
           }
           else
           {
                MessageBox.Show("Firewall is enabled.");
           }

        }
    }
}
4

6 に答える 6

3
NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); 
INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
bool Firewallenabled = mgr.LocalPolicy.CurrentProfile.FirewallEnabled;

詳細はリンク先をご覧ください。

http://technet.microsoft.com/en-us/library/cc737845%28WS.10%29.aspx

http://blogs.msdn.com/b/securitytools/archive/2009/08/21/automating-windows-firewall-settings-with-c.aspx

于 2012-12-10T05:18:42.637 に答える
2

Windows 2003 サーバーおよび 2008 サーバー 2003 サーバー R2 および 2008 サーバー R2 にインストールされているウイルス対策を検出する方法については、こちらの質問を参照してください。WMI または C++ のその他の WMI をWSC_SECURITY_PROVIDER_FIREWALL使用して、同じ API 呼び出しを使用して、列挙型を使用してファイアウォール設定を検出できます。その質問に対する答えは実際には間違っていますが、サーバー以外のコンピューターの答えが得られます。そのコードは C++ で書かれていますが、必要なのは Windows API 呼び出しだけです。C# からも呼び出すことができます。

于 2012-12-10T05:15:28.133 に答える
1

これは古い投稿であることは知っていますが、素晴らしい解決策を見つけました!
次の場所にあるファイアウォール ステータスのレジストリ キーを読み取ります。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

キー: EnableFirewall

public static bool isFirewallEnabled() {
        try {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile")) {
                if (key == null) {
                    return false;
                } else { 
                    Object o = key.GetValue("EnableFirewall");
                    if (o == null) {
                        return false;
                    } else {
                        int firewall = (int)o;
                        if (firewall == 1) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                }
            }
        } catch {
            return false;
        }
    }

また、DomainProfile、PublicProfile、および StandardProfile の値を取得できます。FirewallRules も取得できます。

これが役立つことを願っています:)

于 2015-12-13T18:12:17.757 に答える
1

まず、次のコンポーネントをプロジェクトに追加する必要があります

  • INetFwMgr

次に、Home Networking Configuration Manager CLSID からオブジェクト タイプを取得します。これは{304CE942-6E39-40D8-943A-B913C40C9CD4}にリンクされてC:\WINDOWS\system32\hnetcfg.dllおりHKEY_CLASSES_ROOT\CLSID\{304CE942-6E39-40D8-943A-B913C40C9CD4}、収集されたタイプを使用して、タイプのデフォルト コンストラクターを使用してインスタンスを作成しますINetFwMgr。が有効になっているか、使用INetFwMgr.LocalPolicy.CurrentProfile.FirewallEnabledされていないbool

private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; //This is the CLSID of Home Networking Configuration Manager. We'll use this to detect whether the Firewall is enabled or not
private static NetFwTypeLib.INetFwMgr GetHNCMType()
{
    Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER)); //Creates a new GUID from CLSID_FIREWALL_MANAGER getting its type as objectType
    return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr; //Creates an instance from the object type we gathered as an INetFwMgr object
}
static void Main(string[] args)
{
    INetFwMgr manager = GetHNCMType(); //Initializes a new INetFwMgr of name manager from GetHNCMType
    if (manager.LocalPolicy.CurrentProfile.FirewallEnabled == false) //Continue if the firewall is not enabled
    {
        //The firewall is not enabled
        Console.WriteLine("OFF"); //Writes OFF to the Console in a new line
    }
    else //Otherwise:
    {
        //The fire wall is enabled
        Console.WriteLine("ON"); //Writes ON to the Console in a new line
    }
}

ありがとう、
これがお役に立てば幸いです:)


プロジェクトにコンポーネントを追加するには、

  • プロジェクト名の下のソリューション エクスプローラーから[参照] を右クリックし、[参照の追加... ] を選択します。
  • タブCOMの下で、追加するコンポーネントを選択し、[ OK ] をクリックします。
于 2012-12-10T05:29:19.883 に答える
0

古い W​​indows バージョン (XP)にはFwMgrを使用し、Vista 以降では Advanced Security APIを備えた Windows ファイアウォールを使用できます。

ファイアウォール設定を取得する例を次に示します。

于 2012-12-10T05:21:18.767 に答える