Delphi проверить, не заблокирован ли порт брандмауэром
Я пытаюсь написать функцию, которая может определить, заблокирован ли порт правилами брандмауэра, пока я нашел что-то, но это, похоже, не работает... bAllowed
а также bRestricted
переменные всегда остаются равными 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;
Я что-то здесь упускаю, или, может быть, есть другой (лучший) способ узнать, заблокирован ли порт брандмауэром?
Заранее спасибо!
2 ответа
Мне наконец удалось заставить это работать, я должен был использовать 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;
Вы вообще не проверяете результат вызова API метода IsPortAllowed. Проверьте, не является ли это одним из документированных кодов ошибок.
и я думаю, что
p_sAddress: string
должен быть приведен к PChar в вызове API.код пуст
except
блок, это должно быть либо удалено, либо исключение должно быть, по крайней мере, зарегистрировано - может быть, здесь выдается исключение, которое проглатывается
В документации API метода IsPortAllowed также сказано, что
[... Для Windows Vista и более поздних версий рекомендуется использовать брандмауэр Windows с расширенной защитой API.]