我正在检查防火墙。以下代码很容易检查默认 Windows 防火墙的状态:
INetFwMgr manager = GetFireWallManager();
bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;
if (isFirewallEnabled == false)
{
Console.WriteLine("Firewall is not enabled.");
}
else
{
Consoe.WriteLine("Firewall is enabled.");
}
Console.ReadLine();
private static INetFwMgr GetFireWallManager()
{
Type objectType = Type.GetTypeFromCLSID(new Guid(firewallGuid));
return Activator.CreateInstance(objectType) as INetFwMgr;
}
那么问题就变成了:如何找到非 Windows 防火墙的状态?如果防火墙已正确集成,上述检查是否会正常工作,还是有更好的方法来做到这一点?我已经检查了这篇文章:C# Windows 安全中心设置和这篇文章:C# - 如何检查是否启用了外部防火墙?但事实证明两者都相对无济于事。
我一直在研究 WMI API,但到目前为止它非常令人困惑,而且通过 MSDN 提供的文档也不太乐观。我也尝试过使用SelectQuery,但到目前为止我一直没有成功。任何人都可以帮助我在一个新的起点或我可以找到关于第 3 方防火墙的更好的文档/说明的地方吗?
编辑:目前我正在进一步探索 WMI,特别FirewallProduct
是帖子建议的课程。
更新 2:我一直在测试以下代码段:
string wmiNameSpace = "SecurityCenter2";
ManagementScope scope;
scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", wmiNameSpace), null);
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM FirewallProduct");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
但是运行它会导致以下错误:
Exception Invalid namespace
它指向第 39 行 ( scope.Connect()
)。如果我只是错过了一个参数或格式不正确,我一点也不感到惊讶,我只是不知道它是什么。
更新 3 从SecurityCenter2
to切换SecurityCenter
仍然会产生相同的invalid namespace
错误。
更新 4 我将控制台应用程序移到另一个盒子(win7 不是 winserver08r2),它按预期正确报告。所以这可能是我目前正在测试的虚拟机的问题。下一步是解析活动/非活动状态
更新 5 它在另一个 Server08 机器上进行了测试,并且invalid namespace
出现了相同的错误。使用SecurityCenter
代替SecurityCenter2
不能解决问题。是否有一些 Windows Server OS 用于防止篡改防火墙的底层安全功能,或者 Server OS 是否不附带特定的 WMI 功能密钥集?