确定IP是否被阻止

有谁知道是否有可能可靠地确定(程序上C / C ++ …)在Windows PC上是否安装了防火墙或IP过滤软件? 我需要检测主机操作系统是否在客户端软件中阻止某个服务器IP。

在这种情况下,我不必担心外部硬件火警,因为我完全可以控制这个。 我只关心软件防火墙。 我的希望是我可以迭代Windowsnetworking堆栈或NDIS接口,并确定这一点

在阅读你的一些评论以回答其他答案之后,我想这实际上可能更接近你正在寻找的东西。 它可能无法捕捉到所有类型的防火墙,但任何主要的防火墙厂商都应该在安全中心进行注册,并使用此方法进行检测。 你也可以把这个和其他一些答案结合起来给自己一个第二级的验证。

在Windows中检测正在运行的防火墙

这是一个专家的交流帖子,所以你可能无法读取线程。 以防万一,我已经复制并粘贴了相关信息。 它在VBScript中,但是它应该指向你正确的方向,就你可以使用的WMI命名空间而言。

KemalRouge :我刚刚在一位同事的帮助下解决了这个问题。 他指出我的知识库文章的方向,指出这些信息存储在WMI数据库中

基本上,可以通过几行代码来查询WMI,以确定安全中心正在监视哪些防火墙/防病毒软件,以及该软件的状态(即是否启用)。

无论如何,如果你有兴趣,这里有一些我用来测试的VB代码(你需要参考“Microsoft WMI Scripting V1.2 Library”):

Private Sub DumpFirewallInfo() Dim oLocator As WbemScripting.SWbemLocator Dim oService As WbemScripting.SWbemServicesEx Dim oFirewalls As WbemScripting.SWbemObjectSet Dim oFirewall As WbemScripting.SWbemObjectEx Dim oFwMgr As Variant Set oFwMgr = CreateObject("HNetCfg.FwMgr") Debug.Print "Checking the Windows Firewall..." Debug.Print "Windows Firewal Enabled: " & oFwMgr.LocalPolicy.CurrentProfile.FirewallEnabled Debug.Print "" Set oFwMgr = Nothing Debug.Print "Checking for other installed firewalls..." Set oLocator = New WbemScripting.SWbemLocator Set oService = oLocator.Connectserver(".", "root\SecurityCenter") oService.Security_.ImpersonationLevel = 3 Set oFirewalls = oService.ExecQuery("SELECT * FROM FirewallProduct") ' This could also be "AntivirusProduct" For Each oFirewall In oFirewalls Debug.Print "Company: " & vbTab & oFirewall.CompanyName Debug.Print "Firewall Name: " & vbTab & oFirewall.DisplayName Debug.Print "Enabled: " & vbTab & Format$(oFirewall.Enabled) Debug.Print "Version: " & vbTab & oFirewall.versionNumber Debug.Print "" Next oFirewall Set oFirewall = Nothing Set oFirewalls = Nothing Set oService = Nothing Set oLocator = Nothing End Sub 

如果你可以假设如下,那么可能会有一些黑客行为:

  1. 传出的HTTP连接是允许的

  2. 您可以在侦听端口80的另一台服务器上运行您自己的服务之一

将您的服务编码为接受IP [和端口或可能是网址]。 它必须返回是否能够连接到IP。

这样你就可以知道实际的服务器是否正在运行。 如果服务器不能直接使用,则可以断定它正在被防火墙阻止。

如果您不想编码/运行自己的服务,则可以使用互联网上提供的一种网络状态Web服务。

如果该IP在其外部防火墙硬件上被阻止? 说出为什么给定的主机无法访问是绝对不可能的。

一种可能的解决方案是利用防火墙不会阻止对端口80的访问,但会阻止对其他端口的访问。 所以你可以尝试连接到80端口,如果成功,通过一个通常阻塞的端口进行连接( 请参阅此处的示例列表 )

你不能真正知道一个IP是否被阻止,至少不知道你正在寻找什么防火墙软件,并专门检查。 一些想法:

  • 检查是否启用特定的防火墙(如Windows防火墙)或阻止您的服务器
  • 检查主机文件中是否存在阻止您的服务器IP的条目
  • 通过代理或代理连接,看看他们是否可以访问IP,如果你的客户端不能。
  • 测试服务器,看它是否可以访问(毕竟,这就是你真正要测试的东西,对吗?看看服务器是否可以与之通信?)。 在服务器端出现实际中断的情况下,多次/定期测试也是有意义的。

你必须从C#翻译,但这篇博客文章解释了如何检查Windows防火墙是否启用: http : //www.shafqatahmed.com/2008/01/controlling-win.html

我会建议在netsh上做一些“expect”风格的编程,但通常当有这样一个命令行应用程序时,它后面有一个库。

看看Windows防火墙API 。 我不能说这会解决你的具体问题,但似乎是可能的。

用于检查是否允许特定端口的示例代码 …显示所需标题的一个很好的示例 。

尝试调用Ping。