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

在这里查看这个关于防病毒的问题How to detect antivirus installed on windows 2003 server and 2008 server 2003 server R2 and 2008 server R2 using WMI or other then WMI in C++相同的 API 调用可用于使用WSC_SECURITY_PROVIDER_FIREWALL枚举检测防火墙设置。该问题的答案实际上是错误的,但它会为您提供非服务器计算机的答案。该代码在 C++ 中,但它只是您需要的 Windows API 调用,您也可以从 C# 调用它。

于 2012-12-10T05:15:28.133 回答
1

您首先需要将以下组件添加到您的项目中

  • INetFwMgr

然后,从家庭网络配置管理器 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 回答
1

只需从 C://windows/system32/hnetcfg.dll 和 C://windows/system32/FirewallAPI.dll 导入引用

然后使用

using NATUPNPLib;
using NETCONLib;
using NetFwTypeLib;
于 2016-03-21T18:36:43.367 回答
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 回答
0

您可以将FwMgr用于旧的 Windows 版本 (XP),并使用带有高级安全 API 的 Windows 防火墙用于 Vista 及更高版本。

这是一个检索防火墙设置的示例

于 2012-12-10T05:21:18.767 回答