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, ¤tToken);
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, ¤tToken);
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!
Mmm, lo intenté pero sin suerte. Compruebe la actualización 1. –
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
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. –