Cyclotron101 Geschrieben 25. September 2002 Geschrieben 25. September 2002 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 Zitieren
lpd Geschrieben 4. Oktober 2002 Geschrieben 4. Oktober 2002 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. Zitieren
Cyclotron101 Geschrieben 5. Oktober 2002 Autor Geschrieben 5. Oktober 2002 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 Zitieren
bigpac Geschrieben 5. Oktober 2002 Geschrieben 5. Oktober 2002 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 Zitieren
Cyclotron101 Geschrieben 6. Oktober 2002 Autor Geschrieben 6. Oktober 2002 Hi bigpac, Wie ich bereits schrieb: > Auch mit MSDOS-Befehlen kommt man an die Info nicht heran. SET habe ich dabei natürlich auch schon ausprobiert. Diese Angabe wird hier nicht gelistet! Chris Zitieren
MarcG Geschrieben 7. Oktober 2002 Geschrieben 7. Oktober 2002 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 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 ... (?) Zitieren
Cyclotron101 Geschrieben 10. Oktober 2002 Autor Geschrieben 10. Oktober 2002 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 Zitieren
Cyclotron101 Geschrieben 10. Oktober 2002 Autor Geschrieben 10. Oktober 2002 Die Tippfehler bitte freundlicherweise übersehen :-) Zitieren
lpd Geschrieben 10. Oktober 2002 Geschrieben 10. Oktober 2002 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. Zitieren
Cyclotron101 Geschrieben 11. Oktober 2002 Autor Geschrieben 11. Oktober 2002 > 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 Zitieren
Empfohlene Beiträge
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.