![]() |
Windows Firewall - Eintrag erstellen / löschen / ändern
HeikoAdams stellt dazu folgenden Code zur Verfügung. Dieser entstand durch Weiterentwicklung eines Code-Schnipsels, den smallsmoker gepostet hatte:
Hinweise: Der Code scheint nur unter Windows XP zu funktionieren. Vor dem Anlegen oder Löschen einer Ausnahme wird erst einmal geprüft, ob die Firewall überhaupt aktiviert ist, ob Ausnahmen zugelassen sind und ob der Firewall-Dienst läuft.
Delphi-Quellcode:
Ein Beispielaufruf könnte so aussehen:
unit FirewallTools;
interface procedure AddToWinFirewall(const ApplicationFilename, NameOnExeptionlist: string; Enabled: Boolean); procedure DeleteFromWinFirewall(const ApplicationFilename: string); function IsFirewallServiceActive: Boolean; function IsFirewallActive: Boolean; implementation uses ComObj, Variants, WINSVC; const NET_FW_SCOPE_ALL = 0; NET_FW_IP_VERSION_ANY = 2; FW_MGR_CLASS_NAME = 'HNetCfg.FwMgr'; FW_AUTHORIZEDAPPLICATION_CLASS_NAME = 'HNetCfg.FwAuthorizedApplication'; function IsFirewallServiceActive: Boolean; var SCM, hService: LongWord; sStatus: TServiceStatus; dwStat: Cardinal; begin dwStat := SERVICE_RUNNING; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); hService := OpenService(SCM, PChar('SharedAccess'), SERVICE_ALL_ACCESS); if (hService > 0) then if (QueryServiceStatus(hService, sStatus)) then dwStat := sStatus.dwCurrentState; CloseServiceHandle(hService); Result := (SERVICE_RUNNING = dwStat); end; function IsFirewallActive: Boolean; var fwMgr: Variant; Profile: Variant; begin fwMgr := CreateOleObject(FW_MGR_CLASS_NAME); Profile := fwMgr.LocalPolicy.CurrentProfile; Result := Profile.FirewallEnabled; Profile := Unassigned; fwMgr := Unassigned end; function FirewallExceptionsAllowed: Boolean; var fwMgr: Variant; Profile: Variant; begin fwMgr := CreateOleObject(FW_MGR_CLASS_NAME); Profile := fwMgr.LocalPolicy.CurrentProfile; Result := not Profile.ExceptionsNotAllowed; Profile := Unassigned; fwMgr := Unassigned end; procedure AddToWinFirewall(ApplicationFilename, NameOnExeptionlist: string; Enabled: Boolean); var fwMgr: Variant; Profile: Variant; App: Variant; FirewallActive: Boolean; ServiceActive: Boolean; ExceptionsAllowed: Boolean; begin FirewallActive := IsFirewallActive; ServiceActive := IsFirewallServiceActive; ExceptionsAllowed := FirewallExceptionsAllowed; if not ServiceActive or not FirewallActive or (FirewallActive and not ExceptionsAllowed) then Exit; fwMgr := CreateOleObject(FW_MGR_CLASS_NAME); Profile := fwMgr.LocalPolicy.CurrentProfile; App := CreateOleObject(FW_AUTHORIZEDAPPLICATION_CLASS_NAME); App.ProcessImageFileName := applicationfilename; App.Name := NameOnExeptionlist; App.Scope := NET_FW_SCOPE_ALL; App.IpVersion := NET_FW_IP_VERSION_ANY; App.Enabled := enabled; Profile.AuthorizedApplications.Add(App); App := Unassigned; Profile := Unassigned; fwMgr := Unassigned; end; procedure DeleteFromWinFirewall(ApplicationFilename: string); var fwMgr: Variant; Profile: Variant; FirewallActive: Boolean; ServiceActive: Boolean; ExceptionsAllowed: Boolean; begin FirewallActive := IsFirewallActive; ServiceActive := IsFirewallServiceActive; ExceptionsAllowed := FirewallExceptionsAllowed; if not ServiceActive or not FirewallActive or (FirewallActive and not ExceptionsAllowed) then Exit; fwMgr := CreateOleObject(FW_MGR_CLASS_NAME); Profile := fwMgr.LocalPolicy.CurrentProfile; Profile.AuthorizedApplications.Remove(ApplicationFilename); Profile := Unassigned; fwMgr := Unassigned; end; end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var spathtoapp : string; begin spathtoapp := paramstr(0); addtowinfirewall(spathtoapp,'meinprogrammname',true); //add to Windows Firewall Exeption List enabled addtowinfirewall(spathtoapp,'meinprogrammname',false); //change to disabled deletefromwinfirewall(spathtoapp); //delete from Windows Firewall Exeption List end; |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Ich würde die Unit so ändern, dass die Funktionen IsFirewallServiceActive und IsFirewallActive im Interface Abschnitt der Unit liegen, denn das könnte durchaus für den Aufrufer von Interesse sein.
Ich habe noch weitere Änderungen gemacht und kommentiert und würde vorschlagen diese Änderungen (ohne meine Kommentare) im orginalen Sourcecode vorzunehmen.
Delphi-Quellcode:
unit FirewallTools;
interface procedure AddToWinFirewall(const {<-} ApplicationFilename, NameOnExeptionlist: string; Enabled: Boolean); procedure DeleteFromWinFirewall(const {<-} ApplicationFilename: string); function IsFirewallServiceActive: Boolean; function IsFirewallActive: Boolean; implementation uses ComObj, Variants, WINSVC; // verlagert von Interface nach hier const // die Konstanten brauchen nicht veröffentlicht werden NET_FW_SCOPE_ALL = 0; NET_FW_IP_VERSION_ANY = 2; FW_MGR_CLASS_NAME = 'HNetCfg.FwMgr'; FW_AUTHORIZEDAPPLICATION_CLASS_NAME = 'HNetCfg.FwAuthorizedApplication'; |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Hi!
Stimmt, da hast du recht! Werde das gleich oben ergänzen - Danke. Ciao, Frederic |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Zitat:
Ich würde noch ein if(SCM > 0) then hinzufügen Was geschieht, wenn hService <= 0 zurückgibt? Muss dann wirklich CloseServiceHandle aufgerufen werden? |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Hallo,
na ich will mich ja nicht einmischen aber ![]() Gruß Axel |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Zitat:
Danke für den Hinweis. Meine Fragen waren eher dazu da, damit man den Source-Code anpassen kann. (Waren nicht wirklich echte Fragen) |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Zitat:
Das ist besser wie jede Win. Firewall Hilfe. Axel |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Zitat:
Es gibt keine Unit zum Ansteuern der Firewall sondern eine Anwendung, die so verzahnt ist, dass man kaum etwas davon extrahieren kann. Es werden völlig unnötigerweise Threads eingesetzt. Alle Manipulationen finden über die Registry statt; die Firewall API von Microsoft wird nicht benützt. |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Zitat:
thx PS. Also das hier funkz bei mir: ![]() |
Re: Windows Firewall - Eintrag erstellen / löschen / ändern
Hi!
Ein erster Test unter Vista Ultimate 64-bit veranlasste ihn hier
Delphi-Quellcode:
zum Exit - natürlich bei laufender Firewall und Ausnahmen zugelassen.
if not ServiceActive
or not FirewallActive or (FirewallActive and not ExceptionsAllowed) then Exit; Ciao, Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz