2009-08-06 20 views

Respuesta

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

¿En qué se diferencia esto de 'Environment.UserName'? –

+4

esto no funcionará en Windows 8, ¿alguna idea de cómo? –

+0

Esta pregunta ya se discutió en este enlace ...... puede ser una pregunta repetida. http://stackoverflow.com/questions/5218778/how-to-get-currently-logged-username-from-windows-service-in-net –

96

Pruebe la propiedad: Environment.UserName.

+4

O,' string userName = Environment.UserName; ' – Donut

+6

Atención: como Simon Gillbee mencionado en los comentarios de la respuesta aceptada,' Environment.UsernName' da el Nombre de cuenta registrado, pero 'WindowsIdentity.GetCurrent(). Name' devuelve el nombre de cuenta con el que la aplicación se está ejecutando. – Gerwald

+3

@leo: Precaución: Esa información también es aparentemente incorrecta, consulte [Respuesta de Bolu] (http://stackoverflow.com/questions/1240373/how-do-i-get-the-current-username-in-net-using -C# comment34794502_1240379). :-) –

20

Uso:

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

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

+0

No si el hilo se está ejecutando en modo elevado. – maxp

9

También puede intentar usar:

Environment.UserName; 

Así ...:

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

Espero que esto haya sido de ayuda.

243

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

Environment.UserName 
- Will Display format : 'Username' 

en lugar de

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

Elija el formato que desee.

+5

Puede usar 'Environment.UserDomainName +" \\ "+ Environment.UserName' para obtener aparentemente el mismo resultado que' System.Security.Principal.WindowsIdentity.GetCurrent(). Name'.Ahora, ¿cuál es la diferencia, preguntas ... no estoy seguro. – Gutblender

+6

Necesitaba que el usuario ejecutara la aplicación en lugar de quién está conectado (Environment.UserName no es lo que quiero), así que hice lo siguiente para quitar el dominio: 'System.Security.Principal.WindowsIdentity.GetCurrent () .Name.Split ('\\') .Last(); ' – thehelix

+0

Tiene que agregar' ToArray() 'después de' Split' antes de llamar 'Last()' – codenamezero

21

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

Environment.UserName Property

En la misma página que dice:

obtiene el nombre de usuario de la persona que es actualmente inició sesión en el sistema operativo de Windows.

Y

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

Si el resultado es Environment.UserName usando EjecutarComo, se le dará el nombre de la cuenta de usuario, EjecutarComo no el usuario inició sesión originalmente en Windows.

7

Use System.Windows.Forms.SystemInformation.UserName para el usuario que realmente inició sesión como Environment.UserName devuelve la cuenta utilizada por el proceso actual.

+0

Gracias por compartir, también vea: System.Windows .Forms.SystemInformation.UserDomainName –

4

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; 
    } 
} 
9

He intentado varias combinaciones de respuestas existentes, pero me estaban dando

DefaultAppPool 
IIS APPPOOL 
IIS APPPOOL\DefaultAppPool 

terminé usando

string vUserName = User.Identity.Name; 

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

+0

Excelente. También recibí la identidad del grupo de aplicaciones solamente. Pero tu código resolvió mi problema. Muchas gracias. – SuryaKavitha

+0

Parece que quería el nombre de usuario del usuario que realiza una solicitud, supongo que a un controlador MVC o Web API. Eso es diferente del nombre de usuario con el que se ejecuta el proceso en –

+0

@BenAaronson. La pregunta no dice nada sobre qué nombre de usuario ejecuta un proceso. Necesitaba el nombre de usuario del dominio actualmente conectado y una búsqueda me llevó a esta página, este código terminó dándome lo que necesitaba. –

20

estoy totalmente de segundas 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: dominio \ usuario. Por ejemplo, Nombre de usuario EUROPA \

que es diferente de:

String UserName = Environment.UserName; 

¿Qué aparece en el formato: Nombre de usuario

Y, por último:

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 erver).

1

Obtener 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); 
    } 
} 
+0

Mi sitio web usa IIS pero cuando visito la página desde otra computadora dentro de la red, sigo viendo "Servicio de red" como nombre de usuario. Probé todas las opciones diferentes pero no me da el usuario conectado que está viendo la página. ¿Alguna idea? – Si8

4

He intentado todas las respuestas anteriores y encontré la respuesta en MSDN después ninguno de ellos trabajó para mí. Ver 'UserName4' para el correcto para mí.

estoy después de la Usuario conectado, como se muestra por:

<asp:LoginName ID="LoginName1" runat="server" /> 

He aquí una pequeña función que escribí para probarlas todas. 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 <ASP:Login />) 
    string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM 
    return UserName4; 
} 

Al llamar a esta función, se devuelve el nombre de usuario registrado al regresar.

Actualización: Me gustaría señalar que al 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.

+0

Mi sitio web usa IIS pero cuando visito la página desde otra computadora dentro de la red, sigo viendo "Servicio de red" como nombre de usuario. Probé todas las opciones diferentes pero no me da el usuario conectado que está viendo la página. ¿Alguna idea? – Si8

+2

NOTA: No está claro, pero el ejemplo anterior se aplica en el contexto de una aplicación web que se ejecuta en IIS, donde varios de ellos mostrarán el nombre de la cuenta de Windows del servidor que ejecuta el grupo de aplicaciones ASP.Net. Si se ejecuta como un programa interactivo o servicio de Windows, el de HttpContext no estará disponible, y uno de los otros se debe usar para buscar la cuenta bajo la cual se ejecuta el proceso. –

2

Para una aplicación de Windows Forms que iba a distribuirse a varios usuarios, muchos de los cuales inician sesión en vpn, probé varias formas que funcionaron para las pruebas de mi 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; 
     } 
    } 
} 
2

probar esto

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

ahora que se ve mejor

1

Sólo en caso de que alguien está buscando el usuario Mostrar nombre en contraposición a Nombre de Usuario, como yo .

Aquí está el placer:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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

Cuestiones relacionadas