0

ポートがファイアウォール ルールによってブロックされているかどうかを判断できる関数を作成しようとしていbAllowedますbRestricted

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 呼び出しの結果をまったくチェックしていません。文書化されたエラー コードの 1 つであるかどうかを確認します。

  • p_sAddress: stringAPI呼び出しでPCharにキャストする必要があると思います。

  • コードに空のexceptブロックがあります。これを削除するか、少なくとも例外をログに記録する必要があります。おそらく、ここでスローされた例外が飲み込まれている可能性があります


IsPortAllowed メソッドのAPI ドキュメントにも、次のように記載されています。

[... Windows Vista 以降では、セキュリティが強化された Windows ファイアウォール API の使用を推奨します。]

于 2013-12-02T12:55:26.767 に答える