给定 - 带有 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#。)