Access Token des angemeldeten Benutzers ermitteln
-
Hallo Community
Folgende Problemstellung:
Ein User meldet sich am System an (über Windows Anmeldebildschirm) und startet ein Programm mit Adminrechten (Ausführen als...).Wie kann ich innerhalb des aufgerufenen Programms den Access Token des Users ermitteln, der sich am System angemeldet hat?
OpenProcessToken kann ich in diesem Fall vergessen, da der Prozess ja mit einem AdminAccount gestartet wurde.thx for reply
-
-
Hallo Martin,
danke erst mal für die schnelle Antwort.
Nur möchte ich nicht überprüfen, ob der User Adminrechte hat - die hat er definitiv, da das Programm unter Adminrechten gestartet wird.
Es geht mir darum, dass Access Token des Users zu ermitteln, der sich an Windows angemeldet hat, damit ich die Pfade dieses Userprofils (mit SHGetFolderPath) ermitteln kann.
WTSQueryUserToken hilft mir in diesem Fall nicht weiter, da dieses auch unter Windows 2000 laufen soll.
Meine Überlegung wäre, das ProzessHandle einer Datei, die unter UserAccount läuft (z.B. explorer.exe) zu ermitteln und über OpenProcessToken dann das Token des Users zu holen.
Gibt es hier evtl. einen anderern Weg das Token des Users zu ermitteln?Falls du mir hier einen Wink mit dem Zaunpfahl gegeben hast, hau noch mal richtig hinterher

-
Du solltest Dir die Samples ansehen.
Zumindest das eine ermittelt den Token.
-
Sorry, hatte nur bei deinem geposteten Link geschaut.
Aber vielleicht kannst du mir noch sagen, ob für das Holen des 'User'-Tokens noch spezielle Privilegien gesetzt werden müssen, da ich beim Holen des Tokens immer eine Meldung Zugriff verweigert bekomme.
BOOL setPrivileges(LPCTSTR lpName) { HANDLE hToken; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { ShowErrorMessage(GetLastError()); return FALSE; } LUID luid; if(!LookupPrivilegeValue(NULL, lpName, &luid)) { ShowErrorMessage(GetLastError()); CloseHandle(hToken); return FALSE; } TOKEN_PRIVILEGES tpNew; tpNew.PrivilegeCount = 1; tpNew.Privileges[0].Luid = luid; tpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tpNew, sizeof(tpNew), NULL, NULL); DWORD dwle = GetLastError(); CloseHandle(hToken); if(dwle != ERROR_SUCCESS) { ShowErrorMessage(dwle); return FALSE; } return TRUE; } BOOL getUserToken() { if(setPrivileges(SE_DEBUG_NAME)) { DWORD nPID = getProcessID(TEXT("explorer.exe")); if(nPID) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, nPID); if(!hProcess) { ShowErrorMessage(GetLastError()); return FALSE; } HANDLE hToken; // hier: Zugriff verweigert if(!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { ShowErrorMessage(GetLastError()); return FALSE; } CloseHandle(hToken); CloseHandle(hProcess); MessageBox(NULL, TEXT("Token successfully received"), TEXT("NOTE"), MB_ICONINFORMATION | MB_OK); return TRUE; } } return FALSE; }
-
Was soll dieser Code?
Du bist vermutlich kein Admin und hast die Rechte nicht...
-
Was soll dieser Code?
Gegenfrage: Was soll dieses Frage

Meine Frage war ja, ob es noch eine andere Möglichkeit gibt den Token zu ermittlen.Du bist vermutlich kein Admin und hast die Rechte nicht...
Dazu hatte ich bereits schon etwas in den Beiträgen davor geschrieben.
Ansonsten teste doch mal dieses Beispiel (http://win32.mvps.org/security/opt_gti.html), dass ich unter dem angegebenen Link gefunden habe (das Verfahren ist allerdings nichts anders, als ich es verwende). Das Ergebnis ist das selbe - Zugriff verweigert beim Holen des Tokens.