2009-08-17 11 views
5

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, &currentToken); 

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, &currentToken); 

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!

risposta

8

Errore 1314 è ERROR_PRIVILEGE_NOT_HELD. È necessario il privilegio SE_TCB_NAME per chiamare WTSQueryUserToken.

Questo privilegio è generalmente riservato solo al codice in esecuzione come sistema locale. Se questo privilegio è presente nel token, ma disabilitato, è possibile utilizzare AdjustTokenPrivileges per abilitarlo. Poiché SE_TCB_NAME è un privilegio potenzialmente molto pericoloso, devi disattivarlo di nuovo immediatamente dopo averlo utilizzato. Un modo semplice per vedere se si dispone di questo privilegio è con Process Explorer nella tabella Security della finestra delle proprietà del processo.

Per Aggiornamento 1: il valore di AdjustTokenPrivileges restituisce correttamente, ma GetLastError() è impostato su ERROR_NOT_ALL_ASSIGNED? MSDN indica che potrebbe restituirlo se i privilegi non fossero abilitati. Puoi verificare che il tuo processo abbia il privilegio SE_TCB_NAME, ma è disabilitato? In quale account viene eseguito il tuo processo?

+0

Hmm, provato ma senza fortuna. Verificare l'aggiornamento 1. –

+0

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

+0

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. –

Problemi correlati