我正在尝试编写一个可以确定某个端口是否被防火墙规则阻止的功能,到目前为止我找到了一些东西,但它似乎不起作用...... bAllowed
和{{1}变量始终设置为false。
bRestricted
我在这里遗漏了什么,或者可能还有另一种(更好的)方法来查找端口是否被防火墙阻止了?
提前致谢!
答案 0 :(得分:2)
您根本没有检查IsPortAllowed方法API调用的结果。检查它是否是记录的错误代码之一。
我想在API调用中必须将p_sAddress: string
转换为PChar。
代码有一个空except
块,应该删除,或至少应该记录异常 - 也许这里抛出了一个被吞下的异常
IsPortAllowed方法API documentation也说
[...对于Windows Vista及更高版本,请使用 建议使用具有高级安全性API的Windows防火墙。]
答案 1 :(得分:0)
我最终设法使其工作,我必须使用OleVariant
类型用于bAllowed
和bRestricted
变量,同时我删除了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;