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 Registry wird nur teilweise ausgelesen (https://www.delphipraxis.net/139356-registry-wird-nur-teilweise-ausgelesen.html)

Angel4585 27. Aug 2009 10:04


Registry wird nur teilweise ausgelesen
 
Hallo,

folgender Fall unter Windows XP(auf anderen noch nicht getestet):

Dienst startet Programm.exe vor Login des Benutzers, aber mit dessen Benutzdaten.

Programm.exe soll die vorhandenen Netzlaufwerke wiederherstellen um eine Datei dort abzulegen.

Um die Netzlaufwerke wiederherzustellen lese ich die aus HKEY_CURRENT_USER\Network aus.
Ist der Benutzer eingeloggt funzt dies auch ohne Probleme. Aber wenn der Benutzer nicht eingeloggt ist, kann Network nicht gefunden/gelesen werden. Wenn ich mir die Liste der Keys von HKEY_CURRENT_USER dann ausgebe, werden

Network
SessionInformation
Volatile Environment

nicht ausgegeben.

An was kann das liegen? An der Art wie ich das Programm aus dem Dienst starte?(Dienst läuft als Localsystem)
Das Programm wird per CreateProcessAsUser gestartet und wie gesagt, wenn der Benutzer sich einloggt funktioniert es auf einmal wunderprächtig.
Oder lese ich die Laufwerke an der falschen Stelle aus?

Luckie 27. Aug 2009 10:08

Re: Registry wird nur teilweise ausgelesen
 
In welchem Kontext läuft Programm.exe?

Angel4585 27. Aug 2009 10:16

Re: Registry wird nur teilweise ausgelesen
 
wie meinst Kontext?

Es läuft als der Benutzer der sich sonst auch angemeldet und unter dem das Netzlaufwerk existiert.

Die LogonUser sieht so aus:

Delphi-Quellcode:
LogonUser(PAnsiChar(LUser),PAnsiChar(LDomain),PAnsiChar(LPassword),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,ltoken)
anstatt LOGON32_LOGON_NETWORK hatte ich auch schon LOGON32_LOGON_INTERACTIVE hat aber beides keinen Effekt.



Edit: Wenn ich mich nach einloggen wo es funktioniert und alles gelesen werden kann wieder auslogge, geht es wieder nicht.

Edit2: Was spricht dagegen die Netzlaufwerke per Eintrag in die Registry einfach selbst zu erzeugen und nicht mit den WNetAddConnection2 Methoden?

Angel4585 31. Aug 2009 11:49

Re: Registry wird nur teilweise ausgelesen
 
So nach genauerer Analyse scheint es so abzulaufen, dass in dem Network-schlüssel nur die aktuell vorhandenen Netzlaufwerke abgelegt sind, die werden nach Logout auch wieder gelöscht.

Bleibt für mich natürlich die Frage: Wie kann ich die Netzlaufwerke aus nem Programm verwenden, welches als Benutzer aus nem Dienst heraus gestartet wird, bevor sich ein Benutzer selbst anmeldet?

Edith fragt wer hier die Seite so breit macht das horizontale Scrollbalken kommen? Der LogonUser-Code? dann pls en leerzeichen reineditieren, ich darf da nixmehr machen :duck:

Angel4585 1. Sep 2009 09:08

Re: Registry wird nur teilweise ausgelesen
 
So mal die Hilfe bissl durchforstet(unter D2005, so verzweifelt bin ich schon :pale: )

Ich starte den prozess der die Registry auslesen soll mit CreateProcessAsUser. Damit das Profil geladen wird wird vorher noch LoadUserProfile aufgerufen. In der Hilfe steht dazu:

Zitat:

Upon successful return, the hProfile member of PROFILEINFO is a registry key handle opened to the root of the user's hive. It has been opened with full access (KEY_ALL_ACCESS). If a service that is impersonating a user needs to read or write to the user's registry file, use this handle instead of HKEY_CURRENT_USER. Do not close the hProfile handle. Instead, pass it to the UnloadUserProfile function. This function closes the handle. You should ensure that all handles to keys in the user's registry hive are closed. If you do not close all open registry handles, the user's profile fails to unload. For more information, see Registry Key Security and Access Rights and Registry Hives.
Die Registry lese ich bisher mit der TRegistry Klasse aus. Wenn ich den Text aus der Hilfe lese würde ich vermuten, dass ich wenn ich mit dem Handle arbeite anstatt dem Schlüssel, mehr sehen kann.
Aber wie benutze ich denn das Handle anstatt dem HKEY_CURRENT_USER?

Ich könnte dann nämlich vermutlich die Netzlaufwerke im Dienst wiederherstellen anstatt im Programm, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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