2010-01-07 15 views
7

Deseo enumerar todos los escritorios en un sistema y obtener el nombre de usuario registrado para ese escritorio. Hasta ahora tengo el snippit de código siguiente como un ejemplo de obtener un identificador HDESK e intentar determinar el nombre de usuario asociado con él (si lo hay), pero la llamada a LookupAccountSid falla con ERROR_NONE_MAPPED ("No se identificó entre los nombres de cuenta y los ID de seguridad hecho").Obtenga el nombre de usuario de Windows asociado con un escritorio

HDESK desk = OpenDesktop("Default", 0, FALSE, READ_CONTROL | DESKTOP_READOBJECTS); 

DWORD size = 4096; 

SID * sid = (SID *)malloc(size); 

GetUserObjectInformation(desk , UOI_USER_SID, sid, size, &size); 

char name[512], domain[512]; 
int namesz = 512, domainsz = 512; 

LookupAccountSid(NULL, sid, &name, &namesz, &domain, &domainsz, &s); 

Puede ser que sea porque estoy sacando un SID de inicio de sesión a través de GetUserObjectInformation en lugar de un usuario SID. Si es así, ¿puedo convertir eso al SID de los usuarios que inician sesión?

¿Alguien puede señalarme en la dirección correcta para obtener el nombre de usuario registrado para un escritorio arbitrario (ya sea por su manejador HDESK o HNWD respectivo o incluso por las estaciones de escritorio HWINSTA)? gracias de antemano.

Respuesta

2

Si lo que quieres es la información del usuario, entonces esto funcionará.

llame a WTSEnumerateSessions para obtener una matriz de estructuras WTS_SESSION_INFO. para cada estructura, pase el miembro SessionId a WTSQuerySessionInformation con el miembro WTSInfoClass establecido en WTSUserName. Esto le dará el nombre del usuario (si hay uno) asociado a la sesión.

Alternativamente, puede configurar la clase WTSInfoClass en WTSSessionInfo y recuperar una estructura WTSINFO. Esto contiene mucha información, incluido el nombre de usuario y el dominio. Observe la definición del archivo de encabezado de WTSINFO aunque la página de MSDN es incorrecta.

Debe llamar a WTSEnumerateSessions dos veces, una para obtener el tamaño de búfer requerido y otra para obtener su información.

Relaciones: uno o más objetos de escritorio se encuentran en una estación de Windows. Una estación de Windows está asociada a una sesión.

+0

Gracias, buena sugerencia, pero después de probarlo. mientras que puedo enumerar las sesiones y sus nombres de usuario asociados (si corresponde) el nombre de la estación de la sesión es siempre el nombre de la sesión RDP, no el nombre de la estación de Windows (consulte la definición de WTSWinStationName en http://msdn.microsoft.com/en-us/library/ aa383861% 28VS.85% 29.aspx). Si pudiera vincular una ID de sesión a una estación de Windows, esta técnica sería perfecta, pero no puedo encontrar cómo hacerlo. – QAZ

+0

@QAZ que no funciona en cada sesión tiene una estación de ventana winsta0 que es la estación de ventana que tiene todos los widnows visibles (la única otra estación de ventana de interés es la deaktop segura para esa sesión). – Joshua

2

El problema es que los escritorios no están asociados a usuarios en absoluto. Intente usar psexec para ejecutar el Bloc de notas en la cuenta SYSTEM. Se está ejecutando en su estación de ventana, en su escritorio. De lo contrario, no podrías verlo.

Pero si desea obtener la sesión asociada a la estación de ventana, entonces sí es posible. Debe llamar al NtQueryObject con ObjectNameInformation para obtener el nombre del objeto. Por ejemplo, esto es lo que obtengo: \Sessions\1\Windows\WindowStations\WinSta0. Ahí está tu ID de sesión.

+0

gracias, buen punto. Sí quiero ser capaz de conectar al usuario al escritorio, si existe, así que esto podría ser útil en combinación con la respuesta de janglin. Voy a probar mañana e informaré. – QAZ

0

Esto no es una solución, pero es una buena descripción de la estación/escritorio. De http://www.microsoft.com/technet/security/bulletin/fq00-020.mspx

¿Qué es una estación de Windows? Una estación de Windows es un contenedor seguro que contiene un portapapeles, cierta información global y un conjunto de uno o más escritorios. Una sesión de Windows 2000 tendrá varias estaciones de Windows, una asignada a la sesión de inicio de sesión del usuario interactivo y otras asignadas al proceso de Winlogon, el proceso de protección de pantalla segura y cualquier servicio que se ejecute en un contexto de seguridad distinto del interactivo. usuario. La estación de ventana interactiva asignada a la sesión de inicio de sesión del usuario interactivo también contiene el teclado, el mouse y el dispositivo de visualización. La estación de ventana interactiva es visible para el usuario y puede recibir información del usuario. Todas las demás estaciones de ventana no son interactivas, lo que significa que no pueden hacerse visibles para el usuario y no pueden recibir la entrada del usuario.

¿Qué es un escritorio? Un escritorio es un objeto de contenedor seguro que se encuentra dentro de una estación de ventana. Puede haber muchos escritorios dentro de una estación de Windows. Un escritorio tiene una superficie de visualización lógica y contiene ventanas, menús y ganchos. Solo los escritorios de la estación de ventana interactiva pueden ser visibles y recibir información del usuario. En la estación de ventana interactiva, solo está activo un escritorio a la vez. Este escritorio activo, también conocido como escritorio de entrada, es el que está actualmente visible para el usuario y que recibe la entrada del usuario.

+0

Significó ayudar a aclarar qué contiene qué y relación el uno con el otro – fupsduck

0

Usted puede extraer desde el extremo del medio ambiente %USERPROFILE% variables

0

nbtstat solía ser capaz de hacer esto desde la línea de comandos, ya sea con un nombre de equipo o la dirección IP. Sin embargo, ha pasado mucho tiempo desde que lo miré.

0

código correcto que trabajó para mí:

TCHAR username[UNLEN + 1]; 
DWORD size = UNLEN + 1; 
GetUserName((TCHAR*)username, &size); 

Estoy usando Visual Studio Express 2012 en Windows 7 x86

Cuestiones relacionadas