1

给定 - 带有 SP2 和多个网络适配器的 .Net 2.0 XP 机器

是否有可用于检查网络适配器是否有防火墙的 API?

OneGuyInDC

4

2 回答 2

6

试试下面的这个 c# 代码。它适用于 Windows 7 (& Vista) 和 XP。这将获取当前配置文件的状态,并启用/禁用 Windows 防火墙,例如:家庭/域/公共访问网络。

用法:

获取防火墙状态()
  --> 是否启用/禁用 Windows 防火墙返回 true/false。

设置防火墙状态(新状态)
  --> 将防火墙启用/禁用设置为传入的真/假值
      例如,启用防火墙:
         设置防火墙状态(真)

getCurrPolicy()  
  --> 被其他两种方法使用

是WinXP()
  --> 返回 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) // 如果操作系统不是 Vista 或 Windows7
   {
       返回真;
   }
   别的
   {
       返回假;
   }
}
私有静态 INetFwPolicy2 getCurrPolicy()
{
    INetFwPolicy2 fwPolicy2;
    类型 tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
    fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
    返回 fwPolicy2;
}
公共布尔 getFirewallStatus()
{
    布尔结果=假;
    开关 (isWinXP())
    {
        情况属实:
            类型 NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
            INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
            结果 = mgr.LocalPolicy.CurrentProfile.FirewallEnabled;
            休息;
        案例错误:
            INetFwPolicy2 fwPolicy2 = getCurrPolicy();
            NET_FW_PROFILE_TYPE2_fwCurrentProfileTypes;
            //读取当前配置文件类型(仅用于提高性能)
            //避免从每个属性访问 CurrentProfileTypes
            fwCurrentProfileTypes = (NET_FW_PROFILE_TYPE2_)fwPolicy2.CurrentProfileTypes;
            结果 = (fwPolicy2.get_FirewallEnabled(fwCurrentProfileTypes));
            休息;
        默认:
            结果=假;// 默认为 Win7
            休息;
    }
    返回结果;
}
公共无效 setFirewallStatus(bool newStatus)
{
    开关 (isWinXP())
    {
        情况属实:
            类型 NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
            INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
            mgr.LocalPolicy.CurrentProfile.FirewallEnabled = newStatus;
            休息;
        案例错误:
            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. 如果您无法进行传出连接,则您的外部接口可能只是关闭了。

但是有一个API 可以查明是否在给定的网络接口上启用了 Windows 防火墙。您将需要使用 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 回答