I have some code, with which I'm trying to get the current session user token:
#include DWORD activeSessionId = WTSGetActiveConsoleSessionId(); HANDLE currentToken; BOOL queryRet = WTSQueryUserToken(activeSessionId, ¤tToken); if (!queryRet) { DWORD err = GetLastError(); return 0; }
Value of err is 1314.
Update 1
No luck so far, tried to grant the current process SE_TCB_NAME - but still get same error from WTSQueryUserToken (1314).
HANDLE process = GetCurrentProcess(); HANDLE processToken; BOOL openTokenRet = OpenProcessToken( process, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken); if (!openTokenRet) { DWORD err = GetLastError(); return 0; } TOKEN_PRIVILEGES tokenPrivs; BOOL lookupRet = LookupPrivilegeValue( NULL, SE_TCB_NAME, &tokenPrivs.Privileges[0].Luid); if (!lookupRet) { DWORD err = GetLastError(); return 0; } tokenPrivs.PrivilegeCount = 1; tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; BOOL adjustRet = AdjustTokenPrivileges( processToken, FALSE, &tokenPrivs, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (!adjustRet) { DWORD err = GetLastError(); return 0; } // get the user in the active session HANDLE currentToken; BOOL queryRet = WTSQueryUserToken(activeSessionId, ¤tToken); if (!queryRet) { DWORD err = GetLastError(); return 0; }
Update 2:
Added some more debug info, but prevState.PrivilegeCount is 0...
TOKEN_PRIVILEGES prevState; DWORD prevStateLen = 0; BOOL adjustRet = AdjustTokenPrivileges( processToken, FALSE, &tokenPrivs, sizeof(TOKEN_PRIVILEGES), &prevState, &prevStateLen); DWORD adjustErr = GetLastError(); if (!adjustRet) { return 0; }
Solution:
Looks like WTSQueryUserToken can only be used when running as LocalSystem, which means I'll have to run as a service and debug from there... Doh!