Delphi检查端口是否未被防火墙阻止

时间:2013-12-02 09:59:00

标签: delphi windows-firewall windows-firewall-api

我正在尝试编写一个可以确定某个端口是否被防火墙规则阻止的功能,到目前为止我找到了一些东西,但它似乎不起作用...... bAllowed和{{1}变量始终设置为false。

bRestricted

我在这里遗漏了什么,或者可能还有另一种(更好的)方法来查找端口是否被防火墙阻止了?

提前致谢!

2 个答案:

答案 0 :(得分:2)

  • 您根本没有检查IsPortAllowed方法API调用的结果。检查它是否是记录的错误代码之一。

  • 我想在API调用中必须将p_sAddress: string转换为PChar。

  • 代码有一个空except块,应该删除,或至少应该记录异常 - 也许这里抛出了一个被吞下的异常


IsPortAllowed方法API documentation也说

  

[...对于Windows Vista及更高版本,请使用   建议使用具有高级安全性API的Windows防火墙。]

答案 1 :(得分:0)

我最终设法使其工作,我必须使用OleVariant类型用于bAllowedbRestricted变量,同时我删除了try ... except块并检查了返回状态IsPortAllowed为@mjn sugested。

以下是适用的更新版本:

function IsTCPPortAllowed(p_nPort: Integer; p_sAddress: string): Boolean;
var
  bAllowed, bRestricted: OleVariant;
  oFwMgr               : OleVariant;
  oResult              : HRESULT;
begin
  bAllowed    := False;
  bRestricted := False;
  Result      := False;

  CoInitialize(nil);
  try
    oFwMgr  := CreateOLEObject('HNetCfg.FwMgr');
    oResult := oFwMgr.IsPortAllowed('', NET_FW_IP_VERSION_V4, p_nPort, p_sAddress, NET_FW_IP_PROTOCOL_TCP, bAllowed, bRestricted);
    if oResult = S_OK then
      Result := bAllowed and not bRestricted;
  finally
    oFwMgr    := VarNull;
    CoUninitialize;
  end;
end;