2016-07-11 5 views
1

Ich möchte überprüfen, ob ein Port in der Windows-Firewall geöffnet ist.Wie überprüfe ich eine Regel in der Windows Firewall?

ich auf diese Weise unter Verwendung von netsh gefunden:

netsh advfirewall firewall show rule name="My rule" 

, die zurückkehren wird, wenn die Regel existiert oder nicht ...

Aber je nach Windows-Sprache, wird dies verschiedene Nachrichten zurückzukehren. Ich versuche das besser zu lösen. Ich hätte gerne ein Ergebnis Yes oder No, True oder False, keine lokalisierte Zeichenfolge.

Haben Sie irgendwelche Tipps ??

+0

Was wäre, wenn es einen Monitor eines Drittanbieters geben würde? auch "Advfirewall" AFAIR wird in Vista oder Win7 eingeführt, in 2000/XP gab es keinen solchen Befehl AFAIR –

+0

Es gibt eine API. Hast du danach gesucht? –

+0

Probieren Sie dies aus [Verwenden der Windows-Firewall mit erweiterter Sicherheits-Skript-API und Delphi] (https://theroaddodelphi.com/2013/11/21/using-the-windows-firewall-with-advanced-security-scripting-api-and) -delphi /) – RRUZ

Antwort

3

AS: Der Befehl "advfirewall" und der zugrunde liegende Dienst wurden in Windows Vista eingeführt. Windows 2000/XP hat es nicht und um es zu unterstützen, sollten Sie verschiedene Schnittstellen verwenden.

Gleiches gilt für Computer, auf denen Drittanbieter-Firewalls installiert sind, die nicht von Microsoft stammen (z. B. als Teil der Antivirus-Suite).

Im Allgemeinen unter Vista + sollten Sie COM-Objekt INetFwRules erhalten, dann alle Regeln darin auflisten, und überprüfen Sie jede Regel, wenn es den Port abdeckt, über den Sie sich befinden.

Folgt Beispiel der Regeln https://theroadtodelphi.com/2013/11/21/using-the-windows-firewall-with-advanced-security-scripting-api-and-delphi/#Enumerating Firewall-Regeln

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 mit statischer Bindung statt OleVariant sollte schneller und zuverlässiger sein, zu erhalten und zu zählen Überprüfen Sie https://github.com/yypbd/yypbd-Delphi-HeaderPorting/tree/master/example/FirewallExample

Verwandte Themen