是否有人知道是否可以可靠地确定(编程C / C ++ ...)Windows PC上是否安装了防火墙或IP过滤软件?我需要检测主机操作系统是否在我的客户端软件中阻止某个服务器IP。
在这种情况下,我不需要担心外部硬件防火墙,因为我可以完全控制它。我只关心它的软件防火墙。我希望我可以迭代Windows网络堆栈或NDIS接口并确定这个
答案 0 :(得分:3)
在阅读了一些回复其他答案的评论后,我认为这可能实际上更接近您所寻找的内容。它可能无法捕获所有类型的防火墙,但任何主要的防火墙供应商都应该在安全中心注册,因此可以使用此方法进行检测。您还可以将此与其他一些答案结合起来,为自己提供第二级验证。
这是专家的交流帖子,因此您可能无法阅读该帖子。为了以防万一,我复制并粘贴了相关信息。它在VBScript中,但它应该指向正确的方向,直到您可以使用的WMI命名空间。
KemalRouge :我刚从a的一些帮助中解决了这个问题 同事。他指出我的知识库文章的方向, 它指出这些信息存储在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 :(得分:2)
如果您可以假设以下内容,可能会出现黑客攻击:
允许传出HTTP连接
您可以在另一台侦听端口80的服务器上运行您自己的服务
将您的服务编码为接受IP [和端口或网址]。它必须返回是否能够连接到IP。
通过这种方式,您可以了解实际服务器是否已启动并正在运行。如果服务器不直接可用,您可以断定它被防火墙阻止。
如果您不想编码/运行自己的服务,则可以使用互联网上提供的网络状态网络服务之一。
答案 2 :(得分:1)
如果该IP在其外部防火墙硬件上被阻止? 为什么某个主机无法访问是绝对不可能的。
答案 3 :(得分:1)
一种可能的解决方案是利用防火墙不会阻止访问端口80但阻止访问其他端口这一事实。因此,您可以尝试连接到端口80,如果成功,则通过通常阻塞的端口(see here for an example list)进行连接
答案 4 :(得分:1)
你无法确定IP是否被阻止,至少不知道你正在寻找什么防火墙软件并专门检查它。一些想法:
答案 5 :(得分:0)
您必须从C#翻译,但此博客文章介绍了如何检查Windows防火墙是否已启用: http://www.shafqatahmed.com/2008/01/controlling-win.html
答案 6 :(得分:0)
我打算建议在netsh上做一些'期待'式的编程......但通常当有这样的命令行应用程序时,它背后有一个库。
查看Windows Firewall API。我不能说这会解决你的具体问题,但似乎很可能。
Sample code用于检查是否允许特定端口... A good example显示所需的标头。
答案 7 :(得分:-4)
尝试调用Ping。