¿Cómo obtengo el nombre de usuario actual en .NET usando C #?

¿Cómo obtengo el nombre de usuario actual en .NET usando C #?

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

Si se encuentra en una red de usuarios, el nombre de usuario será diferente:

 Environment.UserName - Will Display format : 'Username' 

más bien que

 System.Security.Principal.WindowsIdentity.GetCurrent().Name - Will Display format : 'NetworkName\Username' 

Elija el formato que desee.

Pruebe la propiedad: Environment.UserName .

La documentación para Environment.UserName parece ser un poco conflictiva:

Environment.UserName Property

En la misma página dice:

Obtiene el nombre de usuario de la persona que actualmente inicia sesión en el sistema operativo Windows.

Y

muestra el nombre de usuario de la persona que inició el hilo actual

Si prueba Environment.UserName utilizando RunAs, le dará el nombre de la cuenta de usuario de RunAs, no el usuario que inició sesión originalmente en Windows.

Utilizar:

 System.Security.Principal.WindowsIdentity.GetCurrent().Name 

Ese será el nombre de inicio de sesión.

Totalmente en segundo lugar las otras respuestas, pero me gustaría destacar un método más que dice

 String UserName = Request.LogonUserIdentity.Name; 

El método anterior me devolvió el nombre de usuario en el formato: DomainName \ UserName . Por ejemplo, EUROPE \ UserName

Que es diferente de:

 String UserName = Environment.UserName; 

Que se muestra en el formato: Nombre de usuario

Y finalmente:

 String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

que dio: NT AUTHORITY\IUSR (mientras se ejecuta la aplicación en el servidor IIS) y DomainName\UserName (mientras se ejecuta la aplicación en un servidor local).

También puede intentar usar:

 Environment.UserName; 

Me gusta esto…:

 string j = "Your WindowsXP Account Name is: " + Environment.UserName; 

Espero que esto haya sido de ayuda.

Intenté varias combinaciones de respuestas existentes, pero me estaban dando

 DefaultAppPool IIS APPPOOL IIS APPPOOL\DefaultAppPool 

Terminé usando

 string vUserName = User.Identity.Name; 

Lo cual me dio el nombre de usuario del dominio de usuario real solamente.

Use System.Windows.Forms.SystemInformation.UserName para el usuario realmente conectado como Environment.UserName aún devuelve la cuenta que está utilizando el proceso actual.

Probé todas las respuestas anteriores y encontré la respuesta en MSDN después de que ninguna de ellas funcionó para mí. Ver ‘UserName4’ para el correcto para mí.

Estoy detrás del usuario conectado , como se muestra por:

  

Aquí hay una pequeña función que escribí para probarlos todos. Mi resultado está en los comentarios después de cada fila.

 protected string GetLoggedInUsername() { string UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Gives NT AUTHORITY\SYSTEM String UserName2 = Request.LogonUserIdentity.Name; // Gives NT AUTHORITY\SYSTEM String UserName3 = Environment.UserName; // Gives SYSTEM string UserName4 = HttpContext.Current.User.Identity.Name; // Gives actual user logged on (as seen in ) string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM return UserName4; } 

Llamar a esta función devuelve el nombre de usuario registrado a cambio.

Actualización: me gustaría señalar que ejecutar este código en mi instancia de servidor local me muestra que Username4 devuelve “” (una cadena vacía), pero UserName3 y UserName5 devuelven el usuario registrado. Solo algo de lo que tener cuidado.

Aquí está el código (pero no en C #):

 Private m_CurUser As String Public ReadOnly Property CurrentUser As String Get If String.IsNullOrEmpty(m_CurUser) Then Dim who As System.Security.Principal.IIdentity = System.Security.Principal.WindowsIdentity.GetCurrent() If who Is Nothing Then m_CurUser = Environment.UserDomainName & "\" & Environment.UserName Else m_CurUser = who.Name End If End If Return m_CurUser End Get End Property 

Aquí está el código (ahora también en C #):

 private string m_CurUser; public string CurrentUser { get { if(string.IsNullOrEmpty(m_CurUser)) { var who = System.Security.Principal.WindowsIdentity.GetCurrent(); if (who == null) m_CurUser = System.Environment.UserDomainName + @"\" + System.Environment.UserName; else m_CurUser = who.Name; } return m_CurUser; } } 

prueba esto

 ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem"); ManagementObjectCollection collection = searcher.Get(); string username = (string)collection.Cast().First()["UserName"]; 

ahora se ve mejor

Para una aplicación de Windows Forms que iba a distribuirse a varios usuarios, muchos de los cuales se conectaban a través de vpn, había intentado varias formas que funcionaron para mi prueba de máquina local pero no para otras. Encontré un artículo de Microsoft que adapté y que funciona.

 using System; using System.Security.Principal; namespace ManageExclusion { public static class UserIdentity { // concept borrowed from // https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx public static string GetUser() { IntPtr accountToken = WindowsIdentity.GetCurrent().Token; WindowsIdentity windowsIdentity = new WindowsIdentity(accountToken); return windowsIdentity.Name; } } } 

En caso de que alguien esté buscando el nombre para mostrar del usuario en lugar del nombre de usuario , como yo.

Aquí está el regalo:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Agregue referencia a System.DirectoryServices.AccountManagement en su proyecto.

Obtenga el nombre de usuario actual de Windows:

 using System; class Sample { public static void Main() { Console.WriteLine(); // <-- Keep this information secure! --> Console.WriteLine("UserName: {0}", Environment.UserName); } } 

En caso de que sea útil para otros, cuando actualicé una aplicación desde la aplicación c # .net 3.5 a Visual Studio 2017 esta línea de código User.Identity.Name.Substring(4); lanzó este error ” startIndex no puede ser más grande que la longitud de la cadena ” (no tocó antes).

Fue feliz cuando lo cambié a System.Security.Principal.WindowsIdentity.GetCurrent().Name Sin embargo, terminé usando Environment.UserName; para obtener el usuario de Windows conectado y sin la porción de dominio.