Benutzer aus der Registry auslesen
-
Hallo,
wenn ich normalerweise Daten für den angemeldeten User der aktuellen Windowssitzung aus der Registry auslesen möcht schau ich unter "HKEY_CURRENT_USER" nach. Jetzt ist es aber so, das mein Programm auch andere Daten aus der Registry liest für die Administratorrechte notwendig sind. Aus diesem Grund habe ich ein Manifest mit kompiliert und mein Programm wird im Administratormodus gestartet. Leider zeigt dann "HKEY_CURRENT_USER" nicht mehr auf den angemeldeten User, sondern auf den Administrator. Unter "HKEY_USERS" finde ich nun alle angemeldeten User in folgender Form
S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-1001 S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-1003 S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-1004
wobei 1001 der Administratoraccount (zum ausführen des Programms), 1003 ein weiterer angemeldeter Account (per Benutzer wechseln, im Augenblick im Hintergrund), 1004 mein Account (im Vordergrund angemeldet) ist. Wie kann ich generell die Zuordnung treffen, welcher Account nun dem im Vordergrund angemeldeten User zuzuordnen ist?
-
Vllt. wäre der Weg über WMI statt über Registry brauchbar?
http://www.codeproject.com/Articles/22800/Enumerating-Users-using-WMI-NET-and-C (WMI+Winapi sollte sich hier im Forum was finden lassen, wobei das vermutlich auch Admin-Rechte benötigt...)Ansonsten verlager das Auslesen der Benutzer in einen Subprozess, der mit Admin-Rechten gestartet wird und lass den das Ergebnis dem Hauptprozess übermitteln.
-
Danke für die Mühe. Das hilft mir aber nicht wirklich, da ich nicht weiss was ich damit anfangwen soll. Vieleicht hat ja sonst jemand einen Vorschlag für mich?
-
Hallo
Wenn du dich für die SID das aktuell angemeldeten Benutzers interessierst hätte ich eine Idee. Ich kann zwar nicht garantieren, dass der folgende Weg funktioniert (habs nie ausprobiert), aber diese APIs würde ich verwenden (Voraussetzung: Dein Prozess läuft elevated):
GetShellWindow gibt dir ein Fenster, dass dem explorer-Prozess (oder einer anderen Shell) gehört, welcher als normaler User läuft.
GetWindowThreadProcessId gibt dir die Prozess-ID der Shell
OpenProcess öffnet nun den Prozess der Shell
OpenProcessToken liest den Token des Shell-Prozesses
GetTokenInformation mit TokenUser gibt die SID des User-Accounts zurück, mit dem die Shell läuft
ConvertSidToStringSid gibt die SID als String aus, so wie du sie in der Registry siehst.Also viel Spaß beim Ausprobieren
cu
-
Das war ein sehr guter Vorschlag. Genau so klappts, vielen Dank nochmals.