Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie lese Ich Hard- und Software aus? (https://www.delphipraxis.net/3565-wie-lese-ich-hard-und-software-aus.html)

Dray 19. Mär 2003 09:18


Wie lese Ich Hard- und Software aus?
 
Hi Leute
Ich hab da nen mittelprächtiges Problem. Ich soll auf der Firma ne Datenbank programmieren in der die Rechner und Ihre hard und Softwarekonfiguration abgespeichert werden soll. Die <datenbank ist nicht das Problem. Die steht soweit. Mein Problem ist allerdings: Wie lese Ich die Hardwarekomponenten und die Software die auf den Rechnern installiert ist aus? Es darf allerdings nichts mitgeloggt werden was rückschlüsse auf die getane Arbeit der Mitarbeiter zulassen würde(vonwegen Datenschutz und so nen Krempel). Ich würd mich sehr freuen wenn einer von euch mir helfen könnte. :wall:

Dray 20. Mär 2003 08:47

Kann mir denn keiner weiterhelfen??? :firejump:

Luckie 20. Mär 2003 09:37

Also die installierte Software steht in der Registry und bedingt auch Hardware-Infos.

Dray 20. Mär 2003 09:50

Mit der Registry is das grundsätzlich ne recht gute Idee, an die ich auch schon gedacht hatte, wobei es dabei 2 Probleme gibt:

1. Ich bin in Delphi nen ziemlicher Newbie *DUCK* und bekomme das mit der Registry nicht hin!

2. Ich muss das auf sämtlichen Betriebssystemen machen. Daraus ergeben sich dann neue Probleme:

----->>>1. Die Informationen sind in den verschiedenen Registrys (Win2000, Win 98 etc. ) unterschiedlich eingetragen

----->>>2. Wie funzt die Sache dann unter Linux/Unix/Novell oder geht das mit Delphi überhaupt nicht?

Dray 20. Mär 2003 09:54

Achja. Ich hatte da noch die Idee die Software aus der Systemsteuerung auszulesen. geht das? und wenn dann wie?

Luckie 20. Mär 2003 09:59

Das Software-Applet aus der Systemsteuerung holt es auch nur aus der Registry. Und um die Unterscheidung Win9x und den NT-basierenden System wirst du nicht drumrumkommen.

Achso unter Linux/Unix mußt du mit Kylix arbeiten und dir was anderes einfallen lassen, da es die Registry ja nicht gibt. Ich würde dafür ein gänzlich neues Programm schreiben.

janjan 20. Mär 2003 10:10

Da haste dir aber viel vorgenommen, vor allem wenn du noch ein "ziemlicher Newbie" bist.

Das Problem bei der Software ist einfach das es kein standardisiertes Konzept, wie z.B. bei einem Debian Linux gibt. Bei dem Debian Linux ist ein Programm dabei das alle installierten Pakete/Programme verwaltet/auflistet und ändern kann.

Sowas fehlt bei Winodws. Die einen schreiben ihre Einstellungen in die Registry, die anderen in .ini Dateien usw.. Es gibt soweit ich weiß keinen Bereich wo jede Software dem Betriebssystem mitteilen kann: "Hallo, hier bin ich, nimm mich in deine Liste auf". Auf meinem System sind viele Programme und Spiele die in der Registry oder in irgendwelchen .ini Dateien aufgeführt sind (z.b. DScaler, Quake1-3, HL,...). Diese Programme zu erkennen wird sehr schwer.

Das einzige was du machen könntest ist eine Liste von wahrscheinlich installierten Programmen zu erstellen und diese gezielt zu suchen. So sollte es zum Beispiel möglich sein, festzustellen ob ein MS Office oder AutoCad installiert ist.

Jede Anwendung auf einem Rechner zu finden und zu bestimmen ist meiner Meinung nach ziemlich unmöglich, du musst dich halt auf ein paar Programme beschränken.


Genau das gleiche bei der Hardware: alles zu identifizieren dürfte unmöglich sein, ein paar Sachen sollten aber ohne größeren Aufwand machbar sein (z.B. CPU/Festplatte)

Luckie 20. Mär 2003 10:18

Falsche alle Windows-Programme, die sich ordentöich installieren und eien Uninstall-Routine mitbringen tragen sich im Schlüssel:
HKLM\Software\Microsoft\Windows\Currentversion\Uni nstall
Dann noch unter dem gleichen Schlüssel in HKCU kucken und man sollte 9% der installierten Software haben.

janjan 20. Mär 2003 10:41

Zitat:

Zitat von Luckie
Falsche alle Windows-Programme, die sich ordentöich installieren und eien Uninstall-Routine mitbringen tragen sich im Schlüssel:
HKLM\Software\Microsoft\Windows\Currentversion\Uni nstall
Dann noch unter dem gleichen Schlüssel in HKCU kucken und man sollte 9% der installierten Software haben.

Das ist mir schon bekannt, nur meiner Erfahrung nach klappt das nicht so toll wie es eigentlich sein könnte. Jedes Programm sollte sich beim installieren da eintragen, aber ob es das auch wirklich tut?...


Ich denke mal die 9% sollten eigentlich 90% heißen, oder?

Luckie 20. Mär 2003 11:00

Öhm ja, die 9% sollten 90% heißen. :mrgreen:

Dray 20. Mär 2003 11:05

So Leute erst mal danke für eure Hilfe. ich werde den Fall mal ausprobieren.

Und zu "Da hast du dir aber was vorgenommen": Das hab ich mir nicht vorgenommen, das is mir vorgenommen worden von meinem chef!

Luckie 20. Mär 2003 11:17

Na dann wollne wir mal deinen Chef glücklich machen:
Delphi-Quellcode:
uses Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  reg : TRegistry;
begin
  reg := TRegistry.Create(KEY_READ);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('Software\Microsoft\Windows\Currentversion\Uninstall', FALSE) then
    begin
       reg.GetKeyNames(Listbox1.Items);
    end
    else
      RaiselastOSError();
  finally
    reg.Free;
  end;
end;
Und das nächste mal sagst du ihm, die paar Zeilen kann er selber schreiben. :mrgreen:

MathiasSimmack 20. Mär 2003 11:37

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von janjan
Auf meinem System sind viele Programme und Spiele die in der Registry oder in irgendwelchen .ini Dateien aufgeführt sind (z.b. DScaler, Quake1-3, HL,...).

Ich will nichts unterstellen, aber meine Versionen von Quake und Half-Life besitzen einen vernünftigen Installer. Quake 1 ist sogar ein noch ein DOS-Programm, dessen Ordner sich also ohne Risiko löschen lässt.
Das Problem mit den übrig bleibenden Dateien (Konfigs, INIs, usw.) lässt sich auf die damals benutzten Installer-Versionen schieben. Die haben nur das entfernt, was sie installiert haben. Dateien, die zur Laufzeit hinzukamen, stehen nicht im Install-Log und werden daher nicht beachtet. Seitdem aber auch InstallShield und Wise zunehmend auf das MSI-Modul von Microsoft setzen, bestünde die Möglichkeit, zusätzliche Dateien zu spezifizieren, die bei der Deinstallation ebenfalls gelöscht werden. Es liegt also im Ermessen des Entwicklers bzw. Installer-Machers, wie er die Mittel nutzt.

Zitat:

Zitat von Luckie
Schlüssel:
HKLM\Software\Microsoft\Windows\Currentversion\Uni nstall
Dann noch unter dem gleichen Schlüssel in HKCU kucken ...

Verwechselst du da möglicherweise was mit dem Autostart von Programmen? Den Uninstall-Schlüssel gibt es nur unter HKEY_LOCAL_MACHINE. Ich spreche jetzt zwar nur für Win 95, 98 und XP, aber das sollte auch bei NT, ME und 2000 nicht anders sein. Und zumindest für XP kann ich mit Gewissheit sagen, dass nur Admins und Hauptbenutzer Software installieren können. Und beide Benutzergruppen haben Zugriff auf HKLM. Ohne diese Rechte schlägt (bei mir) die Installation von Software fehl.

Zitat:

Zitat von janjan
Das ist mir schon bekannt, nur meiner Erfahrung nach klappt das nicht so toll wie es eigentlich sein könnte. Jedes Programm sollte sich beim installieren da eintragen, aber ob es das auch wirklich tut?

Mitnichten muss sich jedes Programm eintragen. Es gibt ein paar Systemupdates von Microsoft (das SP2 für MS-XML 3 fällt mir da z.B. ein), die zwar auch normale Installationsdateien sind, bei denen aber die Uninstall-Funktion deaktiviert ist. Damit sind sie eben nur einspielbar aber nicht entfernbar. In manchen Fällen macht das ja auch Sinn.

Wie ich anfangs schon andeutete: es ist die Aufgabe des Entwicklers, eine vernünftige Deinstallation zu planen. Wer sein Programm z.B. ohne Installer veröffentlicht, der sollte zumindest eine Möglichkeit anbieten, Registryschlüssel o.ä. beim Beenden des Programms löschen zu lassen.
Und dass man seine INIs, DLLs, usw. nicht mehr im Windows- oder im Systemordner ablegen darf, das sollte eigentlich auch bekannt sein.


Aber zurück zu einem der Themen -
Zitat:

Zitat von Dray
Ich hatte da noch die Idee die Software aus der Systemsteuerung auszulesen. geht das? und wenn dann wie?

Im Anhang findest du die alte VCL-Version meines Tools "UnInstall Secrets". Alt deshalb, weil ich mich auf die NonVCL-Version konzentriert habe. Aber zur Ansicht mag die VCL-Version reichen. Außerdem zeigt sie alle Programme an. Auch die, die in der Systemsteuerung/Software gar nicht zu sehen sind. 8)
Die NonVCL-Version des Tools gibt es übrigens in den Win32-API-Tutorials. (Damit wäre die monatliche Werbung dafür auch erledigt. :wink:)

Luckie 20. Mär 2003 11:41

Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von Luckie
Schlüssel:
HKLM\Software\Microsoft\Windows\Currentversion\Uni nstall
Dann noch unter dem gleichen Schlüssel in HKCU kucken ...

Verwechselst du da möglicherweise was mit dem Autostart von Programmen? Den Uninstall-Schlüssel gibt es nur unter HKEY_LOCAL_MACHINE. Ich spreche jetzt zwar nur für Win 95, 98 und XP, aber das sollte auch bei NT, ME und 2000 nicht anders sein. Und zumindest für XP kann ich mit Gewissheit sagen, dass nur Admins und Hauptbenutzer Software installieren können. Und beide Benutzergruppen haben Zugriff auf HKLM. Ohne diese Rechte schlägt (bei mir) die Installation von Software fehl.

War nur ein Schuß ins Blaue, ich war zu faul zu kucken und habe es einfach mal so hingeschrieben. :oops:

janjan 20. Mär 2003 11:48

Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von janjan
Auf meinem System sind viele Programme und Spiele die in der Registry oder in irgendwelchen .ini Dateien aufgeführt sind (z.b. DScaler, Quake1-3, HL,...).

Ich will nichts unterstellen, aber meine Versionen von Quake und Half-Life besitzen einen vernünftigen Installer. Quake 1 ist sogar ein noch ein DOS-Programm, dessen Ordner sich also ohne Risiko löschen lässt.

Das die Spiele nicht mehr in der Registry stehen liegt daran, dass ich ab und an mal meine SystemPartition formatiere. Da gehen dann bekanntermaßen alle Uninstall Informationen verloren. Da die Spiele auch ohne diese ganzen Sachen laufen, seh ich garnicht ein die nochmal neu zu isntallieren.

Zu dem Quake 1: Ich hab das aus einer Quake Collection die unter Windows installiert wird, unter anderem ist da auch QuakeGL dabei...

Dray 20. Mär 2003 12:06

So Leute da Ihr mir so gut Geholfen habt erst noch mal ein dickes DANKE!

Aber ich hab natürlich direkt noch ne Frage. Ich hab ja oben schon geschrieben das ich auch Hardware auslesen soll. Darauf is gefallen das die teilweise in der Registry stehen. Wisst ihr zufällig auch wo da?


P.S.: Chef is schon halbwegs glücklich das der Softwarekram schon mal funzt!

Luckie 20. Mär 2003 12:19

Zitat:

Zitat von Dray
P.S.: Chef is schon halbwegs glücklich das der Softwarekram schon mal funzt!

da warst du aber schnell. :shock: Ich hoffe mal, du hast da selbst was entwickelt und ihm nicht nur das programm vom Mathias vorgesetzt. :roll:

Dray 20. Mär 2003 12:25

Zitat:

Zitat von Luckie
da warst du aber schnell. :shock: Ich hoffe mal, du hast da selbst was entwickelt und ihm nicht nur das programm vom Mathias vorgesetzt. :roll:

Nein hab ich natürlich nicht! Ich hab das ganze natürlich abgeändert zu meinem Zwecke und einen Filter eingebaut, da das Proggi mehr ausspuckte wie nötig war. Ausserdem musste ich das ganze ja in mein Clientproggi einbinden

Trouble_Maker 20. Mär 2003 12:43

hihio...
ich hab auch grad mal den Code von Luckie ausprobiert!
Funktioniert super, doch spuckt er echt zu viel aus!
Sowas wie : {0c82904........}

wie filter ich sowas raus... weil es ja nix zum deinstallieren ist !?!

Danke

Trouble_Maker

Luckie 20. Mär 2003 13:03

Such doch in der Listbox nach "{" in einem Eintrag und löscht ihn.

Dray 20. Mär 2003 13:03

So mit Diesem Proggi sollte nur noch deine wirkliche Software gescannt werden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegIniFile;
  List: TStringList;
  I: Integer;
  S: String;
begin
  Memo1.Lines.Clear;
  reg := TRegIniFile.Create;
  List := TStringList.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('Software\Microsoft\Windows\Currentversion\Uninstall', FALSE) then begin
      reg.ReadSections(List);
      for I := 0 to List.Count - 1 do begin
        S := Reg.ReadString(List[I], 'DisplayName', '');
        if S <> '' then
          Memo1.Lines.Add(S);
      end;
    end;
  finally
    List.Free;
    reg.Free;
  end;
end;
Ich hoffe bei euch funzt es auch. Ich hatte bisher nur die Möglichkeit das unter Win98 zu Testen.

Wenn Ich jetzt noch die Hardware ausgelesen bekomme dann bin Ich super zufrieden und mein Chef super glücklich!

Luckie 20. Mär 2003 13:12

Diese Zeile:
Delphi-Quellcode:
reg := TRegistry.Create(KEY_READ);
hatte bei mir schon einen tieferen Sinn. :roll:
Delphi-Quellcode:
reg := TRegistry.Create;
Dieser Code öffnet den Schlüssel mit ALL_ACCESS also mit Lese- und Schreibrechten. Unter HKLM auf NT-basierenden Systemen hat aber nicht jeder Schreibrechte in diesem Schlüssel. Bei einem normalen Benutzer dürfte dein Code also keine Ergebnisse liefern. :?

MathiasSimmack 20. Mär 2003 19:38

Zwei Fliegen mit einer Klatsche: So ist es!

1. Die Rechtefrage unter NT wird leider sehr oft vernachlässigt. Was passieren kann, hat Luckie ja erwähnt. Wer dazu noch das try/finally/end vergisst, wird mit einer Fehlermeldung belohnt.

2. Windows orientiert sich auch nur am Vorhandensein eines Displaynamens und zeigt nur dann ein Programm an. Ist eine schöne Methode, bestimmte Programme zu verstecken, damit man sie nicht versehentlich deinstalliert. Das war übrigens die Intention für mein Programm. :)

< ------ >

@Trouble_Maker: Das sind GUIDs von MSI-Installation. Aus dem Grund liest man ja auch den Displaynamen oder den "QuietDisplayname" aus, da er den Namen der Software im Klartext enthält.

Dödel 22. Jul 2003 14:43

Re: Wie lese Ich Hard- und Software aus?
 
Und wie liest man einzelne "Dinge" (weiß et wie ichs ausdrücken soll) aus den Schlüsseln aus? :?:
Da in den Schlüsseln immer der Eintrag 'UninstallString' vorhanden ist, welcher die UnInstall-EXE beinhaltet, möchte ich diesen auch auslesen lassen. :spin:

Dödel

Christian Seehase 22. Jul 2003 14:51

Re: Wie lese Ich Hard- und Software aus?
 
Moin Dödel,

Zitat:

Zitat von Dödel
Da in den Schlüsseln immer der Eintrag 'UninstallString' vorhanden ist

Der ist nicht immer vorhanden.

Zitat:

Zitat von Dödel
Und wie liest man einzelne "Dinge" (weiß et wie ichs ausdrücken soll) aus den Schlüsseln aus?

Weiter oben im Thread ist ein Beispiel für DisplayName. Gehört ja auch zu den einzelnen "Dingen".

Dödel 23. Jul 2003 17:28

Re: Wie lese Ich Hard- und Software aus?
 
THX. Ich sollte mir den Code VORM kopieren mal genauer anschauen *schäm*
:oops:

Dödel


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz