Entwickler-Ecke

Internet / Netzwerk - Firewall auf dem Rechner vorhanden und welche?


Pierre - Mo 05.09.05 19:36
Titel: Firewall auf dem Rechner vorhanden und welche?
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 - 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).


Harry M. - Mo 05.09.05 21:03

Ich hatte mir vor einiger Zeit sowas gebastelt

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;


Delete - 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:

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. - 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).


BenBE - 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 ;-)


Harry M. - So 11.09.05 21:31

Wer möchte kann sich den Code ja noch erweitern - für meine Zwecke ware er jedenfalls ausreichend.