C++: GetUserName() cuando el proceso se ejecuta como administrador
windows-7 windows-xp (2)
Creo que la pregunta que desea hacerle a Windows es "qué usuario ha iniciado sesión en la sesión actual".
Para hacer esto, llame a ProcessIdToSessionId() con la ID de su propio proceso para determinar la ID de sesión actual.
Luego llame a
WTSQuerySessionInformation()
con la opción
WTSUserName
para obtener el nombre de usuario.
Tengo un programa simple de C ++ que solicita el nombre de usuario
#include <windows.h>
#include <Lmcons.h>
#include <winbase.h>
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
::GetUserName(username, &username_len);
MessageBox(NULL, username, NULL, 1);
return 1;
}
GetUserName() funciona como se espera en las cuentas de administrador, lo que significa imprimir el nombre de usuario real.
Sin embargo, cuando se ejecuta como administrador en una cuenta que no es de administrador , obtengo el nombre del administrador y no el usuario real registrado.
Creo que se espera este comportamiento ya que está documentado en
GetUserName()
:
Si el hilo actual se hace pasar por otro cliente, la función GetUserName devuelve el nombre de usuario del cliente que se hace pasar por el hilo.
Pregunta
¿Hay alguna manera de obtener el usuario real que ha iniciado sesión (el que no es administrador), incluso si el proceso se ejecuta como administrador?
El problema no es un hilo que está suplantando. Está ejecutando toda la aplicación con el inicio de sesión de administrador. Es por eso que Windows le pidió que inicie sesión con una cuenta de administrador, cuando lo inició desde una cuenta que no es de administrador.
Por lo tanto, el resultado que obtiene de
GetUserName()
es correcto.
Ese nombre es el verdadero usuario registrado de su aplicación.
Si desea el otro nombre, la solución estándar es comenzar como un usuario normal y tener un botón "elevar" que reinicia su aplicación con privilegios elevados. Mire como Administrador de tareas, lo hace si desea ver todos los procesos en ejecución. En este punto, por supuesto, puede pasar todo lo que desee al nuevo proceso, incluido ese nombre de usuario.