2013-12-02 7 views
0

Я пытаюсь написать функцию, которая может определить, заблокирован ли порт правилами брандмауэра, до сих пор я нашел что-то, но он не работает ... bAllowed и bRestricted переменные остаются всегда равными false.Delphi проверяет, не заблокирован ли порт брандмауэром

Я пропустил что-то здесь, или, может быть, есть другой (лучший) способ найти, заблокирован ли порт брандмауэром?

Заранее благодарен!

+0

Это будет невозможно. Кто сказал, что брандмауэр Windows является единственным брандмауэром. Существуют и другие программные брандмауэры. А как насчет возможности брандмауэров маршрутизатора? Почему вам даже нужно знать? –

+0

Используйте «WordBool» для этих параметров. Но так или иначе, это может произойти, если у вас нет разрешенного или ограниченного порта, который вы указываете для всех приложений для протокола TCP. – TLama

+0

@DavidHeffernan: Некоторые клиенты, которые используют наши службы, не могут подключиться к ним, поэтому мне нужно написать инструмент, который может сказать, что порт используется другим приложением или заблокирован брандмауэром (из того, что я знаю, у них нет другого программного обеспечения брандмауэр рядом с брандмауэром Windows) –

ответ

0

я, наконец, удалось заставить его работать, я должен был использовать OleVariant типа для bAllowed и bRestricted переменных, также я удалил try ... except блок и проверил статус возврата из IsPortAllowed в @mjn мотивационные.

Вот обновленная версия, которая работает:

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; 
2
  • Вы не проверяете результат вызова API метода IsPortAllowed. Проверьте, является ли это одним из документированных кодов ошибок.

  • и я думаю, что p_sAddress: string должен быть отправлен на PChar в вызове API.

  • код имеет пустой except блок, то это должно быть либо удалены, либо исключение должны, по крайней мере, быть авторизованы - может быть, есть исключение брошено здесь, который проглотил


IsPortAllowed метод API documentation также говорит, что

[... Для Windows Vista, а затем использовать в брандмауэре Windows в режиме повышенной безопасности A Рекомендуется PI.]

+0

Привет, я добавил чек, он возвращает S_OK, но все же те же значения для 'bAllowed' и' bRestricted' –

 Смежные вопросы

  • Нет связанных вопросов^_^