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

606

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

Yves
fuente

Respuestas:

897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
juan
fuente
96
¿Cómo es esto diferente de Environment.UserName?
Sam Harwell
59
@SimonGillbee, esto está mal, Environment.UserNamedevolverá el usuario "RunAs".
Bolu
55
Para verificar ... MessageBox.Show(Environment.UserName);coloque esto en su window_loadedevento y ejecútelo usando RunAs ....
Bolu
44
Esto vuelve Domain\Username. ¿Cómo puedo obtener el nombre asociado con el nombre de usuario?
SearchForKnowledge
325

Si está 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'

Elige el formato que quieras.

Israel Margulies
fuente
77
Puede usar Environment.UserDomainName + "\\" + Environment.UserNamepara obtener aparentemente el mismo resultado que System.Security.Principal.WindowsIdentity.GetCurrent().Name. Ahora, cuál es la diferencia, preguntas ... No estoy seguro.
Gutblender
99
Necesitaba que el usuario ejecutara la aplicación en lugar de quién inició sesión (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
Debe agregar ToArray()después Splitantes de llamarLast()
codenamezero
1
@codenamezero No ToArray()se necesita. using System.Linq;Aunque lo necesitarías .
TheSoftwareJedi
112

Trate de la propiedad: Environment.UserName.

JaredPar
fuente
55
Ostring userName = Environment.UserName;
Donut
10
Precaución: como Simon Gillbee mencionó en los comentarios de la respuesta aceptada, Environment.UsernNameproporciona el nombre de cuenta registrado, pero WindowsIdentity.GetCurrent().Namedevuelve el nombre de cuenta con el que se ejecuta la aplicación.
Gerwald
55
@leo: Precaución: esa información también es aparentemente incorrecta, vea la respuesta de Bolu . :-)
TJ Crowder
NO lo use con ASP.NET. docs.microsoft.com dice: "Si una aplicación ASP.NET se ejecuta en un entorno de desarrollo, la propiedad UserName devuelve el nombre del usuario actual. En una aplicación ASP.NET publicada, esta propiedad devuelve el nombre de la cuenta del grupo de aplicaciones ( como el grupo de aplicaciones predeterminado) ".
feihoa
28

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

Propiedad Environment.UserName

En la misma página dice:

Obtiene el nombre de usuario de la persona que está actualmente conectada al sistema operativo Windows.

Y

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

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

Kobus
fuente
24

Apoyo totalmente 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;

El cual se muestra en el siguiente 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).

Shivam657
fuente
¿Qué espacio de nombres se requiere para usar la "Solicitud"?
TK-421
1
@ TK-421 Requestsolo funciona si es una aplicación web. Es una instancia deSystem.Web.HttpRequest
Gerardo Grignoli
22

Utilizar:

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

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

John Cuckaroo
fuente
11

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.

jay_t55
fuente
11

Intenté varias combinaciones de las respuestas existentes, pero me dieron

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Terminé usando

string vUserName = User.Identity.Name;

Lo que me dio solo el nombre de usuario del dominio de los usuarios reales.

Daniel E.
fuente
Excelente. También recibí solo la identidad del grupo de aplicaciones. Pero su código resolvió mi problema. Muchas gracias.
SuryaKavitha
Parece que quería el nombre de usuario del usuario que realiza una solicitud, supongo que para un controlador MVC o API web. Es diferente al nombre de usuario con el que se ejecuta el proceso
Ben Aaronson,
@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 trajo a esta página, este código terminó dándome lo que necesitaba.
Daniel E.
11
String myUserName = Environment.UserName

Esto le dará salida - your_user_name

Shivam Bharadwaj
fuente
9

Úselo System.Windows.Forms.SystemInformation.UserNamepara el usuario que realmente Environment.UserNameinició sesión, ya que aún devuelve la cuenta que está utilizando el proceso actual.

Remy
fuente
Gracias por compartir, también vea: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh
9

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.AccountManagementen su proyecto.

Bhramar
fuente
6

Intenté todas las respuestas anteriores y encontré la respuesta en MSDN después de que ninguna de estas me funcionó. Ver 'UserName4' para el correcto para mí.

Estoy detrás del usuario conectado , como lo muestra:

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

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 <ASP:Login />)
    string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM
    return UserName4;
}

Llamar a esta función devuelve el nombre de usuario conectado por retorno.

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 conectado. Solo algo de lo que tener cuidado.

FlashTrev
fuente
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. Intenté todas las opciones, pero no me da el usuario conectado que está viendo la página. ¿Alguna idea?
Si8
3
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 debe usarse para encontrar la cuenta bajo la cual se ejecuta el proceso.
Oskar Berggren
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;
    }
}
Michael B
fuente
Supongamos que hay una respuesta en C #
Shivam Bharadwaj
4

prueba esto

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

ahora se ve mejor

priyesh jaiswal
fuente
2

Para una aplicación de Windows Forms que se distribuiría a varios usuarios, muchos de los cuales inician sesión a través de VPN, había intentado varias formas que funcionaron para mis pruebas de máquinas locales, pero no para otras. Encontré un artículo de Microsoft que adapté y 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;
        }
    }
}
John llueve
fuente
1

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);
    }
}
Ali Eshghi
fuente
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. Intenté todas las opciones, pero no me da el usuario conectado que está viendo la página. ¿Alguna idea?
Si8
1

En caso de que sea útil para otros, cuando actualicé una aplicación de la aplicación c # .net 3.5 a Visual Studio 2017, esta línea de código User.Identity.Name.Substring(4);arrojó este error " startIndex no puede ser mayor que la longitud de la cadena " (no se redujo antes).

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

Doreen
fuente
Gracias @doreen lo encontraste útil.
Shivam Bharadwaj
0

Revisé la mayoría de las respuestas aquí y ninguna de ellas me dio el nombre de usuario correcto.

En mi caso, quería obtener el nombre de usuario conectado, mientras ejecutaba mi aplicación desde un usuario diferente, como cuando shift + clic derecho en un archivo y "Ejecutar como un usuario diferente".

Las respuestas que probé me dieron el 'otro' nombre de usuario.

Esta publicación de blog proporciona una forma de obtener el nombre de usuario registrado, que funciona incluso en mi escenario:
https://smbadiwe.github.io/post/track-activities-windows-service/

Utiliza Wtsapi

Alonzzo2
fuente