2010-10-28 73 views
8

¿Cómo obtengo el nombre de usuario actual conectado en Windows 7 (es decir, el usuario que está físicamente conectado a la consola en la que se ejecuta el programa que estoy iniciando).Obtener el nombre de usuario conectado en C#

Por ejemplo, si estoy conectado como "Usuario principal" y ejecuto mi aplicación de consola (que mostrará el nombre de usuario conectado) como "Usuario secundario", entonces el programa solo devuelve "Usuario secundario" como el usuario actualmente conectado.

Utilicé las siguientes 2 técnicas para obtener el nombre de usuario. Ambos no me están dando lo que quiero.

System.Environment.GetEnvironmentVariable("USERNAME") 
System.Security.Principal.WindowsIdentity.GetCurrent().User; 

Tenga en cuenta que, sin embargo, este código VBScript devuelve el nombre de usuario conectado con independencia de la cuenta de usuario desde el que se ejecuta este script:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set compsys_arr = objWMIService.ExecQuery _ 
    ("Select * from Win32_ComputerSystem") 
For Each sys in compsys_arr 
    Wscript.Echo "username: " & sys.UserName 
Next 

Cualquier forma es posible en C#?

+1

Compruebe http://forums.whirlpool.net.au/archive/793434. Supongo que podría cambiar el código para que se ajuste exactamente a su VBScript. – weismat

+1

Ese VBScript no funciona para mí (ejecutándose contra un servidor Win2003). Además, si el usuario ha elegido ejecutar su programa en una cuenta de usuario diferente, * ¿por qué * desea ignorarlo? –

+0

@Damien, necesito tomar decisiones en el programa en función del usuario que ha iniciado sesión, ¡por eso! – Santhosh

Respuesta

6

Creo que simplemente convertir las llamadas de WMI a C# funciona bien para mí.

  ConnectionOptions oConn = new ConnectionOptions(); 
      System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\\\localhost", oConn); 


      System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select * from Win32_ComputerSystem"); 
      ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery); 
      ManagementObjectCollection oReturnCollection = oSearcher.Get(); 

      foreach (ManagementObject oReturn in oReturnCollection) { 
       Console.WriteLine(oReturn["UserName"].ToString().ToLower()); 
      } 
2

Aunque no entiendo si desea obtener el nombre de usuario, quién está conectado en el sistema o el nombre de usuario con el que se está ejecutando la consola, quizás podría intentar usar System.Environment.UserName - MSDN afirma que muestra el nombre de usuario conectado.

+0

Quiero el nombre de usuario que está conectado al sistema. System.Environment.UserName solo devuelve el nombre de usuario con el que se ejecuta el programa. – Santhosh

5

Creo que tendrías que ir por una ruta de P/invocar. Debe averiguar en qué ventana se está ejecutando su proceso y luego determinar el propietario de esa WindowStation. No creo que haya una API .NET para determinar estas cosas.

Las API de Win32 que debe consultar son, probablemente, GetProcessWindowStation y GetUserObjectSecurity para encontrar el propietario.

+1

Esto está mal. El descriptor de seguridad de la estación de ventana no tiene nada que ver con el usuario que inició sesión. Cualquier relación es una coincidencia y tiene que ver con el hecho de que el usuario necesita tener acceso a la estación de ventana. – wj32

Cuestiones relacionadas