给定 - 带有 SP2 和多个网络适配器的 .Net 2.0 XP 机器
是否有可用于检查网络适配器是否有防火墙的 API?
OneGuyInDC
给定 - 带有 SP2 和多个网络适配器的 .Net 2.0 XP 机器
是否有可用于检查网络适配器是否有防火墙的 API?
OneGuyInDC
试试下面的这个 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); 休息; } }
一般不可能知道(例如是否有外部防火墙),原因如下:
但是有一个API 可以查明是否在给定的网络接口上启用了 Windows 防火墙。您将需要使用 COM 互操作来获取 INetFwProfile(用于全局防火墙状态)和 INetSharingConfiguration(用于特定网络接口)接口,并检查 INetFwProfile.FirewallEnabled 和 INetSharingConfiguration.InternetFirewallEnabled。
有关链接以及如何使用这些结果来确定有效的防火墙状态,请参阅http://msdn.microsoft.com/en-us/library/aa364717%28VS.85%29.aspx 。(它是用 VBScript 编写的,但应该可以翻译成 C#。)