| Autor |
Beitrag |
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: Mo 05.09.05 19:36
Hallo,
wie kann ich abfragen, ob eine Firewall auf einem Rechner vorhanden ist?
Am besten wäre, ich könnte sogar dem Programmuser sagen, welche Firewall
installiert ist, damit er selbst nachschauen kann, ob ein FTP-Programm
durch seine Firewall beim Transfer mit dem Server blockiert wird.
Häufig bekomme ich Anfragen wie: "Geht nicht?!"
Frage: "Haben Sie eine Firewall?"
Antwort:"Nein!"
Frage:"Haben die xxx,yyy, zzzz oder das SP2 ?"
Anwort:"Das eine sagt mir was, das könnte sein."
Viel besser wäre:
"Starten Sie bitte erst dieses kleine Programm, es überprüft, ob wir was einstellen müssen,
bevor Sie das FTP-Programm starten."
Ich will NICHT wissen, wie man eine Firewall umgehen kann!
Ich will nur sagen können, schauen Sie doch mal in ihrer Firewall xyz nach.
Vielen Dank.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 05.09.05 20:01
Ab WinXP SP2 geht das über die Sicherheitszentrale per WMI auszulesen. Dazu gibt es in der DP einen Source. Link müsste ich raussuchen. (Genau, steht aber erst ab WinXP SP2 zur Verfügung)
Davor kannst Du nur auf geladene Module reagieren (z.B. einen gestarteten "TrueVector Monitor" Service (ZoneAlarm) oder andere bekannte Firewalls. (genau, geht aber nur mit bekannten FWs)
Eine andere Möglichkeit besteht noch darin, die WinSocks.dll statisch zu binden und darin gegenüber der Version von Festplatte (anhand des Modulphfads auslesen) nach Hooks zu suchen. (relativ unsicher und unzuverlässig)
Ansonsten bleibt nurdie Möglichkeit: Programm sowohl localhost als auch eine Adresse im Internet anpingen \ per http connecten lassen. Dauert die erste Abfrage länger als 2 Sekunden ider schlägt fehl, ist eine FW aktiv oder das Netzwerk falsch eingerichtet. Schlägt die zweite fehlt, während die erste geht, ist das Internet oder der Proxy-Server falsch konfiguriert. (Prüft nur Vorhandensein einer FW generell).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Harry M.
      
Beiträge: 754
Win 2000, XP
D2005
|
Verfasst: Mo 05.09.05 21:03
Ich hatte mir vor einiger Zeit sowas gebastelt
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| function GetFirewallName: String; var REGISTRY : TRegistry; KeyList, TempList, SoftwList : TStringList; i : integer; begin TempList := TStringlist.Create; SoftwList := TStringlist.Create;
REGISTRY := TRegistry.create; REGISTRY.Rootkey := HKEY_LOCAL_MACHINE; if REGISTRY.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') then begin KeyList := TStringList.Create; REGISTRY.GetKeyNames(KeyList); for i := 0 to KeyList.count-1 do begin if REGISTRY.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + KeyList[i]) then begin if (REGISTRY.ValueExists('DisplayName'))and(REGISTRY.ValueExists('UninstallString')) then begin SoftwList.Add(REGISTRY.ReadString('DisplayName')); TempList.Add(REGISTRY.ReadString('UninstallString')); end; end; REGISTRY.CloseKey; end; end; KeyList.Free; TempList.Free;
for I := 0 to SoftwList.Count-1 do begin if pos(ansiuppercase('Firewall'), ansiuppercase(SoftwList.Strings[I])) > 0 then begin RESULT := SoftwList.Strings[I]; break; end else RESULT := ''; end;
SoftwList.Free; end;
function IsFirewallInstall: boolean; begin Result := GetFirewallName <> ''; end; |
_________________ Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.09.05 21:46
Und wie stellst du sicher, dass der Begriff Firewall in dem String auftaucht? Btw wird der Windows eigene Firewall dort nicht auftauchen. Und wie stellst du fest, ob der installierte Firewall auch aktiviert ist?
Nachtrag:
Desweiteren ist die Funktion unsauber programmiert: Es fehlen die Ressourcenschutzblöcke und
| Zitat: |
[Warning] Unit1.pas(55): Variable 'KeyList' might not have been initialized
|
Wo wird das Registry Objekt wieder freigegeben?
Du öffnest den Schlüssel lesend und schreibend, damit dürfte die Funktion bei normalen Benutzern fehlschlagen. Ups tust du doch nicht, habs übersehen.
Desweiteren kannst du dir die zweite Schleife sparen. TStringList kennt die Methode IndexOf. Allerdings kann man dann nicht nach nur einem Teilstring suchen.
Bei mir würde das ganze so aussehen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function GetInstalledSoftware(SoftwareList: TStrings): DWORD; var reg : TRegistry; begin SetLastError(0); reg := TRegistry.Create(KEY_READ); try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', False) then begin reg.GetKeyNames(SoftwareList); end else SetLastError(5); finally FreeAndNil(reg); end; result := GetLastError; end;
procedure TForm1.Button1Click(Sender: TObject); var dwRes: DWORD; begin dwRes := GetInstalledSoftware(Listbox1.Items); if dwRes <> 0 then ShowMessage(SysErrorMessage(dwRes)); end;
procedure TForm1.Button2Click(Sender: TObject); begin if ListBox1.Items.IndexOf(Edit1.Text) >= 0 then ShowMessage('Ist installiert'); end; |
Die Funktion gibt einen Fehlerwert zurück, so dass man überprüfen kann, ob sie nicht fehlgeschlagen ist. Ich habe die eigentliche Prpfung nach der installierten Software getrennt, damit ist sie besser universeller einsetzbar. Ich übergebe eine Variable vom Typ TStrings, so dass ich die Liste gleich einer Listbox oder so zuweisen kann.
|
|
Harry M.
      
Beiträge: 754
Win 2000, XP
D2005
|
Verfasst: Mi 07.09.05 02:45
Die Function war schon etwas älter, kann sein das sie einige Fehler enthält (die ich heute nicht mehr machen würde).
_________________ Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 07.09.05 13:51
ZoneAlarm wird übrigens von der Routine nicht erkannt. Von daher ist diese Art der Suche absolut ineffizient. Da kann man auch direkt fragen 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Harry M.
      
Beiträge: 754
Win 2000, XP
D2005
|
Verfasst: So 11.09.05 21:31
Wer möchte kann sich den Code ja noch erweitern - für meine Zwecke ware er jedenfalls ausreichend.
_________________ Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
|
|
|