Autor Beitrag
Pierre
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138

Win 98se und XP prof
D5Pers und D7Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: Mo 05.09.05 21:03 
Ich hatte mir vor einiger Zeit sowas gebastelt
ausblenden volle Höhe Delphi-Quelltext
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
  // list der installierten software erstellen
  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;

  // jetzt nach "firewall" suchen
  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



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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);  // letzten Systemfehler zuruecksetzen
  reg := TRegistry.Create(KEY_READ); // wir wollen nur lesen
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', False) then
    begin
      reg.GetKeyNames(SoftwareList);
    end
    else
      // OpenKey scheint den letzten Systemfehler nicht zu setzen
      // Zugriff verweiger, wenn Pfad stimmt einzige Fehlermoeglichkeit
      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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: 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.