Zum Inhalt springen

Windows Registry - Schlüssel auslesen - Problem


Cyclotron101

Empfohlene Beiträge

Hallo,

folgendes Problem:

Ich muss aus der Windows-Registry einen Schlüsselwert auslesen. Eine entsprechende DLL hierfür habe ich zwar, das Problem ist aber: Dieser Schlüssel ist in jeder Windows-Version an einer anderen Stelle abgelegt und meine DLL benötigt als Über-

gabeparameter eben den entsprechenden Pfad, in dem der Schlüssel abegelegt ist!

Die Möglichkeit, mit einer CASE-Anweisung zu arbeiten, die je nach erkanntem Betriebssystem den entsprechenden Pfad übergibt, hatte ich auch schon in betracht gezogen. Das Problem hierbei ist allerdings, daß ich natürlich nicht alle verfügbaren Windows- Versionen ab Win 95 habe, um die entsprechend verwendeten Pfade auszulesen (vom Installations- und Konfigurationsaufwand mal ganz abgesehen). Außerdem müsste dann natürlich auch bei jeder neu erschienen Windows-Version

das Programm auch um einen neue CASE-Fall erweitert werden. Keine gute Idee.

Ich bräuchte hierfür also so etwas wie eine Registry-Suchmaschine, die nach eben diesem Schlüssel sucht und dann den Schlüsselwert zurückliefert. Gibt es da evtl. eine fertige (kostenlose?) DLL-Datei, die diese Aufgabe übernehmen kann? Ich konnte da bislang leider nichts im Web finden. Ich arbeite mit Microsoft Visual FoxPro 7,

falls das noch von interesse sein sollte.

Thanx 4 answer

Chris

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Eine DLL, die diese Aufgabe übernimmt, habe ich leider nicht gefunden. Du kannst sie dir allerdings auch selber schreiben. Du müsstest ja wissen, wie der Schlüssel heißt, und wenn der von dir gesuchte Schlüssel immer in einem bestimmten Hauptverzeichnis der Registry zu finden ist (z.B. HKEY_LOCAL_MACHINE), dann kannst du dieses durchsuchen & den Schlüsselpfad & den Schlüsselwert in Variablen speichern.

Du könntest daraus eine DLL mit entsprechenden Schnittstellen machen, so dass du diese Funktion auch von außerhalb nutzen kannst.

Möglicherweise gibt es aber auch API-Funktionen von Windows, die das ermöglichen; da müsste ich nochmal nachschauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo lpd,

ich werde aus Deinem Beitrag nicht so ganz schlau...

> Du kannst sie dir allerdings auch selber schreiben.

Soll das eine Aufmunterung sein? *g* Wenn ichs wirklich könnte, dann hätte ich diesen Thread hier sicherlich nicht eröffnet, oder?

> Du müsstest ja wissen, wie der Schlüssel heißt, und wenn der von dir gesuchte Schlüssel immer in einem bestimmten Hauptverzeichnis der Registry zu finden ist (z.B. HKEY_LOCAL_MACHINE),

Die Schlüssel liegen je nach Betriebssystem in einem anderen Unterverzeichnis. Was nützt es mir da, wenn das Hauptverzeichnis evtl. immer gleich ist? Gesucht werden muss so oder so. Die von Microsoft mitgelieferte DLL funktioniert nur, wenn man den

kompletten Pfad (also Hauptverzeichnis plus Unterverzeichnisse) und den Schlüsselnamen übergibt. Eine Suche ist hiermit nicht möglich.

> dann kannst du dieses durchsuchen & den Schlüsselpfad & den Schlüsselwert in Variablen speichern.

Stimmt. Nur wenn ich das könnte, gäbe es dieses Problem nicht. Ich weiß ja noch nicht mal, wo die Registry auf der Platte abgelegt ist. Sie ist ja keine Datenbank-Datei oder sowas, sonder steckt irgendwo in den Untiefen des Betriebssystems. Ohne API, fertige

DLL oder sonstige Wundermittel kommt man das sicherlich nicht so ohne weiteres ran. Und da habe ich bislang nichts finden können. Eine Volltextsuche über die Platte bspw. liefert keine Treffer. Auch mit MSDOS-Befehlen kommt man an die Info nicht heran.

Um konkreter zu werden: Ich suche den Namen der verwendeten Netzwerk-Domain bzw. Netzwerk-Arbeitsgruppe. Unter Windows 2000 ist der Domainname hier zu finden:

Hauptpfad:

HKEY_CURRENT_USER

Unterpfad:

Software\Microsoft\Windows\CurrentVersion\Explorer

Schlüsselname:

Last Domain

Schlüsselwert:

0,2,DERDOMAINNAME

sowie

Hauptpfad:

HKEY_USERS

Unterpfad:

S-1-5-21-1708537768-842925246-1060284298-1000\

Software\Microsoft\Windows\CurrentVersion\Explorer

Schlüsselname:

Last Domain

Schlüsselwert:

0,2,DERDOMAINNAME

Je nach Windows-Version und ob Domain oder Arbeitsgruppe ist der Schlüssel jedoch an einer anderen Stelle abgelegt.

Ein Teufelskreis, liebe Talkfreunde...

Chris

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wenn ich das richtig verstanden habe und du wirklich nur den Domain- bzw. Arbeitsgruppennamen suchst, warum liesst du Ihn dann nicht aus der Windowsvariablen aus, da müsste das eigentlich drin stehen, auch bei den alten versionen.

Einfach mal "set |more" in der Eingabeaufforderung eingeben.

Cu

Alex

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Cyclotron101

Hallo lpd,

iIch weiß ja noch nicht mal, wo die Registry auf der Platte abgelegt ist. Sie ist ja keine Datenbank-Datei oder sowas, sonder steckt irgendwo in den Untiefen des Betriebssystems.

Das ist recht einfach, es ist garnicht so tief im System ;) die Infos aus HKEY_CURRENT_USER z.B. findest du unter Win2000 im Verzeichnis C:\Dokumente und Einstellungen\BENUTZERNAME\NTUSER.dat :D

die anderen Teile (die Registry besteht aus mehreren Dateien) findest du auch irgendwo, weiss aber nicht genau wo...

Ausserdem könntest du doch die Win Version abfragen und dann entsprechend mit den Pfaden die DLL-Funktion aufrufen ... (?)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry für die lange Antwortzeit, hatte keine im den letzten Tage keine Zeit mich um das Thema zu kümmern.

> Das ist recht einfach, es ist garnicht so tief

> im System die Infos aus HKEY_CURRENT_USER z.B.

> findest du unter Win2000 im Verzeichnis

> C:\Dokumente und Einstellungen\BENUTZERNAME\NTUSER.dat

Der Tipp ist schon mal gut, aber:

Ich wüsste nicht, wie ich in dieser Binär-Datei etwas auslesen soll. Da bräuchte ich dann auch wohl wieder ein Extra-Programm für, oder?

Die Datei des aktuellen Benutzers ist gesperrt. Eine Möglichkeit wäre es vielleicht, eine Liste der im System registrierten Nutzer zu ermitteln, um dann mit dem Namen eines gerade nichtangemeldeten Nutzers den Dateipfad als Variable zu generieren und dann bei diesem den Schlüssel auszulesen. Aber darüber denke ich besser gar nicht nach :-)

Bei älteren Windows-Versionen wurden Benutzerdaten noch im Windows-Pfad unter Profiles abgespeichert, jetzt in Dokumente und Einstellungen und bei den kommenden Versionen? Ich wollte ja gerne ein Programm haben, das möglichst unabhängig von der BS-Version läuft. Daher suche ich ja auch nach einer Registry-Suchmaschine.

> Ausserdem könntest du doch die Win Version

> abfragen und dann entsprechend mit den Pfaden die > DLL-Funktion aufrufen ... (?)

Siehe meine Ausführungen zu Beginn des Threads.

Wenns alles nichts hilft, muss ich diesen Feature eben wieder aus dem Programm rausnehmen.

Chris

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Cyclotron101

Soll das eine Aufmunterung sein? *g* Wenn ichs wirklich könnte, dann hätte ich diesen Thread hier sicherlich nicht eröffnet, oder?

Doch, natürlich. Im Normalfall schaue ich zum Beispiel immer erst im Internet nach, ob für ein Problem, das ich habe, bereits eine Lösung existiert, die ich verwenden kann, bevor ich selbst eine schreibe. Das spart nämlich Zeit & meinem Arbeitgeber damit auch Geld. ;)

Die Schlüssel liegen je nach Betriebssystem in einem anderen Unterverzeichnis. Was nützt es mir da, wenn das Hauptverzeichnis evtl. immer gleich ist? Gesucht werden muss so oder so. Die von Microsoft mitgelieferte DLL funktioniert nur, wenn man den

kompletten Pfad (also Hauptverzeichnis plus Unterverzeichnisse) und den Schlüsselnamen übergibt. Eine Suche ist hiermit nicht möglich.

Ja, ich verstehe dein Problem durchaus. Nur; ich habe bisher keine fertige Lösung gefunden, die genau das kann, was du möchtest.

Deswegen sage ich ja, dass du ggf. selbst eine schreiben / programmieren musst.

Gut, wenn du dir das nicht zutraust, ist das etwas anderes.

Ohne API, fertige DLL oder sonstige Wundermittel kommt man das sicherlich nicht so ohne weiteres ran.

Viele Entwicklungsumgebungen haben Klassen & APIs für den Registry-Zugriff bereits implementiert, die du verwenden kannst. Du müsstest dann wirklich nur noch ein Programm dafür schreiben. Methoden für den Registry-Zugriff, Schreiben, Lesen, Löschen von Schlüsseln, etc. gibt es z.B. in Delphi (Weiß leider im Moment nicht, ab welcher Ausführung).

Um konkreter zu werden: Ich suche den Namen der verwendeten Netzwerk-Domain bzw. Netzwerk-Arbeitsgruppe. Unter Windows 2000 ist der Domainname hier zu finden:

Hauptpfad:

HKEY_CURRENT_USER

Unterpfad:

Software\Microsoft\Windows\CurrentVersion\Explorer

Schlüsselname:

Last Domain

Schlüsselwert:

0,2,DERDOMAINNAME

sowie

Hauptpfad:

HKEY_USERS

Unterpfad:

S-1-5-21-1708537768-842925246-1060284298-1000\

Software\Microsoft\Windows\CurrentVersion\Explorer

Schlüsselname:

Last Domain

Schlüsselwert:

0,2,DERDOMAINNAME

Je nach Windows-Version und ob Domain oder Arbeitsgruppe ist der Schlüssel jedoch an einer anderen Stelle abgelegt.

Daraus bleibt bei mir nur eine Frage übrig : Heißt der Schlüssel bei jeder Windowsversion gleich ? Wenn das der Fall ist, wäre es programmiertechnisch nicht weiter schwierig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

> Doch, natürlich. Im Normalfall schaue ich zum Beispiel immer erst

> im Internet nach, ob für ein Problem, das ich habe, bereits eine

> Lösung existiert, die ich verwenden kann, bevor ich selbst eine

> schreibe. Das spart nämlich Zeit & meinem Arbeitgeber

> damit auch Geld.

Hehe, mach ich doch auch so. Warum das Rad jedesmal neu erfinden ;-)

> Ja, ich verstehe dein Problem durchaus. Nur; ich habe bisher

> keine fertige Lösung gefunden, die genau das kann, was du

> möchtest. Deswegen sage ich ja, dass du ggf. selbst eine

> schreiben / programmieren musst. Gut, wenn du dir das nicht

> zutraust, ist das etwas anderes.

FoxPro ist kein C++... Und meine Berufsschul-C/C++-Kenntnisse reichen hierfür wohl kaum aus. Mit FoxPro-eigenen Mitteln scheint das auch nicht realisierbar zu sein. Die Experten in der offiziellen FoxPro-Newsgroup wussten auch nicht wie das geht. Es wundert mich wirklich, das für ein solches Problem, das sicherlich sehr häufig auftritt, noch keine fertige Lösung verfügbar ist. Evtl. poste ich noch mal in die Englische FoxPro-Newsgroup.

> Viele Entwicklungsumgebungen haben Klassen & APIs für den

> Registry-Zugriff bereits implementiert, die du verwenden kannst.

> Du müsstest dann wirklich nur noch ein Programm dafür

> schreiben.

Wie gesagt: Wird ja auch von FoxPro mitgeliefert, leistet aber nicht genug...

> Daraus bleibt bei mir nur eine Frage übrig : Heißt der Schlüssel

> bei jeder Windowsversion gleich ? Wenn das der Fall ist, wäre es

> programmiertechnisch nicht weiter schwierig.

Nein, leider nicht. Diese Infos habe ich inzwischen ermitteln können:

Windows 2000: Bei Domain: Schlüsselname: Last Domain

Windows 2000: Bei Arbeitsgruppe: Schlüsselname: Last Domain

Windows 98: Bei Domain: Schlüsselname: Nicht gefunden !?!

Windows 98: Bei Arbeitsgruppe: Schlüsselname: Workgroup

Windows NT 4: Bei Arbeitsgruppe: Schlüsselname: Nicht gefunden !?!

Windows XP: Bei Arbeitsgruppe Schlüsselname: DhcpDomain

Z.t. sind die Schlüsselwerte noch in anderen Pfaden/Schlüsseln abgelegt, aber nie in einer "Kombination" die bei alle gleich ist. Von allen anderen Versionen (95, 95B, 98SE, ME, sowie NT4 mit Domain, XP mit Domain) kann ich diese Infos nicht ermitteln, weil mir diese Betriebssysteme (so) nicht zur Verfügung stehen. Aber auch hier werden die Schlüssel wahrscheinlich wieder anders heißen...

Und wie ich schon schrieb: Wenn ich die Schlüsselpfade- und Namen von allen genannten Betriebssystemen kennen würde, könnte ich ja auch eine CASE-Anweisung bemühen, die je nach erkanntem Betriebssystem den entsprechenden Schlüsselpfad & Schlüssel verwendet. Allerdings müsste das Programm dann bei jeder neuen Windows-Version um einen neue CASE-Fall erweitert werden.

Also: Wenn es da wirklich keine brauchbare Lösung gibt, dann muss ich dieses Feature (mehr ist es letztendlich auch nicht) eben weglassen oder nur für Windows 2000 Nutzer implementieren. Das haben sowieso angeblich die meisten unserer Kunden installiert.

Chris

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...