2009-08-17 15 views
5

que tienen algo de código, con el que estoy tratando de conseguir la actual señal de sesión de usuario:¿Cómo puedo obtener el token de usuario actual para la sesión física?

#include <Wtsapi32.h> 

DWORD activeSessionId = WTSGetActiveConsoleSessionId(); 

HANDLE currentToken; 
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); 

if (!queryRet) { 
    DWORD err = GetLastError(); 
    return 0; 
} 

Valor de err es 1314.

Actualización 1

No hubo suerte hasta el momento, intentó para otorgar el proceso actual SE_TCB_NAME, pero aún obtener el mismo error de 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; 
} 

Actualización 2:

añadido algo de información de depuración más, pero prevState.PrivilegeCount es 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; 
} 

Solución:

Parece que WTSQueryUserToken sólo se puede utilizar cuando ejecutándose como LocalSystem, lo que significa que tendré que ejecutarlo como servicio y depurar desde allí ... ¡Doh!

Respuesta

8

El error 1314 es ERROR_PRIVILEGE_NOT_HELD. Necesita el privilegio SE_TCB_NAME para llamar a WTSQueryUserToken.

Este privilegio normalmente solo lo tiene el código que se ejecuta como Sistema local. Si este privilegio está presente en su token, pero está deshabilitado, puede usar AdjustTokenPrivileges para habilitarlo. Como SE_TCB_NAME es un privilegio potencialmente muy peligroso, debe volver a desactivarlo inmediatamente después de usarlo. Una forma fácil de ver si tiene este privilegio es con Process Explorer en la tabla de seguridad de la ventana de propiedades del proceso.

Por actualización 1 - ¿AdjustTokenPrivileges devuelve éxito, pero GetLastError() está establecido en ERROR_NOT_ALL_ASSIGNED? MSDN indica que podría devolver esto si los privilegios no estuvieran habilitados. ¿Puedes verificar que tu proceso tiene el privilegio SE_TCB_NAME, pero está deshabilitado? ¿En qué cuenta se está ejecutando su proceso?

+0

Mmm, lo intenté pero sin suerte. Compruebe la actualización 1. –

+0

Desde MSDN: El token no tiene uno o más de los privilegios especificados en el parámetro NewState. La función puede tener éxito con este valor de error incluso si no se ajustaron los privilegios. El parámetro PreviousState indica los privilegios que se ajustaron. Parece que esta función podría tener éxito pero no habilitar privilegios. – Michael

+0

Aha, puedo confirmar que GetLastError() da ERROR_NOT_ALL_ASSIGNED, pero el valor de adjustRet es VERDADERO. Por lo tanto, he llenado una estructura TOKEN_PRIVILEGES, pero el valor de PrivilegeCount es 0 ... ¿Esto significa que no se cambió nada? Ver actualización 2. –

Cuestiones relacionadas