2016-07-11 2 views
1

Я хотел бы проверить, открыт ли порт в брандмауэре Windows.Как проверить правило в брандмауэре Windows?

Я нашел этот путь с помощью Netsh:

netsh advfirewall firewall show rule name="My rule" 

, которая будет возвращать, если существует правило или нет ...

Но, в зависимости от Windows, язык, это будет возвращать различные сообщения. Я пытаюсь решить это лучше. Я хотел бы иметь результат Yes или No, True или False, а не локализованная строка.

У вас есть какие-либо советы?

+0

Что делать, если бы был сторонний монитор? также «advfirewall» AFAIR представлен в Vista или Win7, в 2000/XP такой команды не было. AFAIR –

+0

Существует api. Вы искали его? –

+0

Попробуйте [Использование брандмауэра Windows Firewall с API и Delphi с расширенной безопасностью] (https://theroadtodelphi.com/2013/11/21/using-the-windows-firewall-with-advanced-security-scripting-api-and -Delphi /) – RRUZ

ответ

3

AS: команда «advfirewall» и базовая служба были представлены в Windows Vista. У Windows 2000/XP нет его и для его поддержки вы должны использовать разные интерфейсы.

То же самое касается компьютеров с установленными брандмауэрами сторонних производителей, не относящимися к Microsoft (например, в составе антивирусного пакета).

Как правило, на Vista + вы должны получить COM-объект INetFwRules, затем перечислить все правила в нем и проверить каждое правило, если оно охватывает порт, о котором вы находитесь.

Следит пример получения и перечисления с правилами Правила https://theroadtodelphi.com/2013/11/21/using-the-windows-firewall-with-advanced-security-scripting-api-and-delphi/#Enumerating брандмауэра

var 
CurrentProfiles : Integer; 
fwPolicy2  : OleVariant; 
RulesObject  : OleVariant; 
rule   : OleVariant; 
oEnum   : IEnumvariant; 
iValue   : LongWord; 

    fwPolicy2 := CreateOleObject('HNetCfg.FwPolicy2'); 
    RulesObject := fwPolicy2.Rules; 
    CurrentProfiles := fwPolicy2.CurrentProfileTypes; 

    ..... 

    Writeln('Rules:'); 

    oEnum   := IUnknown(Rulesobject._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, rule, iValue) = 0 do 
    begin 
    if (rule.Profiles And CurrentProfiles)<>0 then 
    begin 
     Writeln(' Rule Name:   ' + rule.Name); 
     Writeln(' ----------------------------------------------'); 
     Writeln(' Description:  ' + rule.Description); 
     Writeln(' Application Name: ' + rule.ApplicationName); 
     Writeln(' Service Name:  ' + rule.ServiceName); 

     if (rule.Protocol = NET_FW_IP_PROTOCOL_TCP) or (rule.Protocol = NET_FW_IP_PROTOCOL_UDP) then 
     begin 
      Writeln(' Local Ports:  ' + rule.LocalPorts); 
      Writeln(' Remote Ports:  ' + rule.RemotePorts); 
      Writeln(' LocalAddresses:  ' + rule.LocalAddresses); 
      Writeln(' RemoteAddresses: ' + rule.RemoteAddresses); 
     end; 

    ..... 

    end; 

OTOH с использованием статического связывания, а не OleVariant должен быть быстрее и надежнее, проверка https://github.com/yypbd/yypbd-Delphi-HeaderPorting/tree/master/example/FirewallExample

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