ho qualche codice, con il quale sto cercando di ottenere la corrente token dell'utente sessione:Come posso ottenere il token utente corrente per la sessione fisica?
#include <Wtsapi32.h>
DWORD activeSessionId = WTSGetActiveConsoleSessionId();
HANDLE currentToken;
BOOL queryRet = WTSQueryUserToken(activeSessionId, ¤tToken);
if (!queryRet) {
DWORD err = GetLastError();
return 0;
}
valore di err è 1314.
Update 1
Nessuna fortuna finora, provato per garantire il processo corrente SE_TCB_NAME - ma si ottiene comunque lo stesso errore da 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;
}
Aggiornamento 2:
Aggiunto un po 'di informazioni di debug, ma prevState.PrivilegeCount è 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;
}
Soluzione:
Sembra WTSQueryUserToken può essere utilizzato solo quando in esecuzione come LocalSystem, il che significa che dovrò essere eseguito come servizio e debug da lì ... Doh!
Hmm, provato ma senza fortuna. Verificare l'aggiornamento 1. –
Da MSDN: Il token non dispone di uno o più privilegi specificati nel parametro NewState. La funzione può avere successo con questo valore di errore anche se non sono stati regolati i privilegi. Il parametro PreviousState indica i privilegi che sono stati modificati. Sembra che questa funzione possa avere successo ma non abilitare i privilegi. – Michael
Aha, posso confermare che GetLastError() restituisce ERROR_NOT_ALL_ASSIGNED, ma il valore di adjustRet è TRUE. Quindi, ho compilato una struttura TOKEN_PRIVILEGES, ma il valore di PrivilegeCount è 0 ... Ciò significa che non è stato modificato nulla? Vedere l'aggiornamento 2. –