C ++ – GetUserName () cuando el proceso se ejecuta como administrador

Tengo un progtwig simple de C ++ que solicita el nombre de usuario

#include  #include  #include  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 que imprime 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 el hilo está suplantando.

Pregunta

¿Hay alguna manera de obtener el usuario real conectado (el que no es de administrador), incluso si el proceso se ejecuta como administrador?

Creo que la pregunta que desea hacer a Windows es “qué usuario está conectado a la sesión actual”.

Para hacer esto, llame a ProcessIdToSessionId () con el ID de su propio proceso para determinar el ID de sesión actual.

A continuación, llame a WTSQuerySessionInformation () con la opción WTSUserName para buscar el nombre de usuario.

El problema no es un hilo que está personificando. Está ejecutando toda la aplicación bajo el inicio de sesión del administrador. Es por eso que Windows le solicitó que inicie sesión con una cuenta de administrador cuando la inició desde una cuenta que no es de administrador.

Por lo tanto, el resultado que obtienes de GetUserName() es correcto. Ese nombre es el usuario real 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, puede, por supuesto, pasar todo lo que desee al nuevo proceso, incluido ese nombre de usuario.