0

我正在尝试编写一个可以确定端口是否被防火墙规则阻止的函数,到目前为止,我发现了一些东西,但它似乎不起作用...... bAllowedandbRestricted变量始终设置为 false。

function IsTCPPortAllowed(p_nPort: Integer; p_sAddress: string): Boolean;
var
  bAllowed, bRestricted: Boolean;
  oFwMgr               : OLEVariant;
  oResult              : HRESULT;
begin
  bAllowed    := False;
  bRestricted := False;
  CoInitialize(nil);
  try
    try
      oFwMgr  := CreateOLEObject('HNetCfg.FwMgr');
      oResult := oFwMgr.IsPortAllowed('', NET_FW_IP_VERSION_V4, p_nPort, p_sAddress, NET_FW_IP_PROTOCOL_TCP, bAllowed, bRestricted);
    except
    end;
  finally
    oFwMgr       := VarNull;
    CoUninitialize;
  end;

  if oResult = S_OK then
    Result := bAllowed and not bRestricted;
end;

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

提前致谢!

4

2 回答 2

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

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

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


IsPortAllowed 方法API 文档还说

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

于 2013-12-02T12:55:26.767 回答
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;
于 2013-12-03T17:40:06.400 回答