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.]

Другие вопросы по тегам