Como obtenho o nome de usuário atual no .NET usando C #?

606

Como obtenho o nome de usuário atual no .NET usando C #?

Yves
fonte

Respostas:

897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
juan
fonte
96
Como isso é diferente Environment.UserName?
21310 Sam Samwell
59
@SimonGillbee, isso está errado, Environment.UserNameretornará o usuário "RunAs".
Bolu
5
Para verificar .... MessageBox.Show(Environment.UserName);colocar isso em seu window_loadedevento, e executá-lo usando RunAs ....
Bolu
4
Isso retorna Domain\Username. Como posso obter o nome associado ao nome de usuário?
SearchForKnowledge
325

Se você estiver em uma rede de usuários, o nome de usuário será diferente:

Environment.UserName
- Will Display format : 'Username'

ao invés de

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

Escolha o formato que você deseja.

Margulies de Israel
fonte
7
Você pode usar Environment.UserDomainName + "\\" + Environment.UserNamepara obter aparentemente o mesmo resultado que System.Security.Principal.WindowsIdentity.GetCurrent().Name. Agora, qual é a diferença, você pergunta ... não tenho certeza.
Gutblender
9
Eu precisava para obter o usuário executar o aplicativo, em vez de quem está conectado (Environment.UserName não é o que eu quero), então eu fiz o seguinte para retirar o domínio: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix
Você precisa adicionar ToArray()depois Splitantes de chamarLast()
codenamezero
1
@codenamezero Não ToArray()é necessário. Você precisaria using System.Linq;embora.
TheSoftwareJedi
112

Experimente a propriedade: Environment.UserName.

JaredPar
fonte
5
Ou:string userName = Environment.UserName;
Donut
10
Cuidado: como Simon Gillbee mencionado nos comentários da resposta aceita, Environment.UsernNamefornece o nome da conta logada, mas WindowsIdentity.GetCurrent().Nameestá retornando o nome da conta em que o aplicativo está sendo executado.
Gerwald 14/10
5
@leo: Cuidado: Essa informação também parece aparentemente incorreta, veja a resposta de Bolu . :-)
TJ Crowder
NÃO o use com o ASP.NET. docs.microsoft.com diz: "Se um aplicativo ASP.NET for executado em um ambiente de desenvolvimento, a propriedade UserName retornará o nome do usuário atual. Em um aplicativo ASP.NET publicado, essa propriedade retornará o nome da conta do pool de aplicativos ( como AppPool padrão) ".
feihoa
28

A documentação para Environment.UserName parece um pouco conflitante:

Propriedade Environment.UserName

Na mesma página, diz:

Obtém o nome de usuário da pessoa que está atualmente conectada ao sistema operacional Windows.

E

exibe o nome de usuário da pessoa que iniciou o encadeamento atual

Se você testar Environment.UserName usando RunAs, ele fornecerá o nome da conta de usuário RunAs, não o usuário originalmente conectado ao Windows.

Kobus
fonte
24

Sou totalmente a segunda das outras respostas, mas gostaria de destacar mais um método que diz

String UserName = Request.LogonUserIdentity.Name;

O método acima retornou o nome de usuário no formato: DomainName \ UserName . Por exemplo, EUROPE \ UserName

O que é diferente de:

String UserName = Environment.UserName;

Que exibido no formato: UserName

E finalmente:

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

que forneceu: NT AUTHORITY\IUSR(durante a execução do aplicativo no servidor IIS) e DomainName\UserName(durante a execução do aplicativo em um servidor local).

Shivam657
fonte
Qual namespace é necessário para usar a "Solicitação"?
TK-421
1
O @ TK-421 Requestfunciona apenas se você for um aplicativo da web. É um exemplo deSystem.Web.HttpRequest
Gerardo Grignoli 26/02
22

Usar:

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

Esse será o nome do logon.

John Cuckaroo
fonte
11

Você também pode tentar usar:

Environment.UserName;

Como isso...:

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

Espero que isso tenha sido útil.

jay_t55
fonte
11

Eu tentei várias combinações de respostas existentes, mas elas estavam me dando

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Acabei usando

string vUserName = User.Identity.Name;

O que me deu apenas o nome de usuário do domínio dos usuários reais.

Daniel E.
fonte
Excelente. Também recebi apenas a identidade do pool de aplicativos. Mas seu código resolveu meu problema. Muito obrigado.
SuryaKavitha
Parece que você queria o nome de usuário do usuário fazendo uma solicitação, acho que para um controlador MVC ou Web API. Isso é diferente do nome de usuário sob o qual o processo está sendo executado.
Ben Aaronson
@BenAaronson A pergunta não diz nada sobre o nome de usuário que está executando um processo. Eu precisava do nome de usuário do domínio atualmente conectado e uma pesquisa me levou a esta página; esse código acabou me dando o que eu precisava.
Daniel E.
11
String myUserName = Environment.UserName

Isso fornecerá a saída - your_user_name

Shivam Bharadwaj
fonte
9

Use System.Windows.Forms.SystemInformation.UserNamepara o usuário realmente conectado, pois Environment.UserNameainda retorna a conta que está sendo usada pelo processo atual.

Remy
fonte
Obrigado por compartilhar, veja também: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh
9

Apenas no caso de alguém estar procurando pelo Nome para exibição do usuário em vez do Nome do usuário , como eu.

Aqui está o tratamento:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Adicione Referência a System.DirectoryServices.AccountManagementno seu projeto.

Bhramar
fonte
6

Eu tentei todas as respostas anteriores e encontrei a resposta no MSDN depois que nenhuma delas funcionou para mim. Veja 'UserName4' para o correto para mim.

Estou atrás do Usuário Conectado , conforme exibido por:

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

Aqui está uma pequena função que escrevi para experimentá-los todos. Meu resultado está nos comentários após cada linha.

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

A chamada dessa função retorna o nome de usuário conectado por retorno.

Atualização: gostaria de salientar que a execução desse código na minha instância do servidor local mostra que o nome de usuário4 retorna "" (uma sequência vazia), mas o nome de usuário3 e o nome de usuário5 retornam o usuário conectado. Apenas algo para tomar cuidado.

FlashTrev
fonte
Meu site está usando o IIS, mas quando visito a página de outro computador na rede, continuo vendo "Serviço de Rede" como o nome de usuário. Tentei todas as opções diferentes, mas isso não me dá o usuário conectado que está visualizando a página. Qualquer ideia?
Si8
3
NOTA: Não ficou claro, mas o exemplo acima se aplica ao contexto de um aplicativo Web em execução no IIS, onde vários deles exibirão o nome da conta do Windows Server que executa o pool de aplicativos ASP.Net. Se estiver sendo executado como um programa interativo ou serviço do Windows, o do HttpContext ficará indisponível e um dos outros deve ser usado para encontrar a conta na qual o processo é executado.
Oskar Berggren
4

Aqui está o código (mas não em 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

Aqui está o código (agora também em 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
fonte
Suponha que ser a resposta em C #
Shivam Bharadwaj
4

tente isso

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

agora parece melhor

priyesh jaiswal
fonte
2

Para um aplicativo Windows Forms que deveria ser distribuído a vários usuários, muitos dos quais efetuavam login através da VPN, tentei várias maneiras que funcionavam no meu teste de máquina local, mas não em outros. Me deparei com um artigo da Microsoft que eu adaptei e 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 rains
fonte
1

Obtenha o nome de usuário atual do Windows:

using System;

class Sample
{
    public static void Main()
    {
        Console.WriteLine();

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}
Ali Eshghi
fonte
Meu site está usando o IIS, mas quando visito a página de outro computador na rede, continuo vendo "Serviço de Rede" como o nome de usuário. Tentei todas as opções diferentes, mas isso não me dá o usuário conectado que está visualizando a página. Qualquer ideia?
Si8
1

Caso seja útil para outras pessoas, quando atualizei um aplicativo do aplicativo c # .net 3.5 para o Visual Studio 2017, esta linha de código User.Identity.Name.Substring(4);gerou o erro " startIndex não pode ser maior que o comprimento da string " (não era antes).

Fiquei feliz quando mudei para, System.Security.Principal.WindowsIdentity.GetCurrent().Nameno entanto, acabei usando Environment.UserName;para obter o usuário conectado do Windows e sem a parte do domínio.

Doreen
fonte
Obrigado @doreen você achou útil.
Shivam Bharadwaj
0

Examinei a maioria das respostas aqui e nenhuma delas me deu o nome de usuário certo.

No meu caso, eu queria obter o nome de usuário conectado, enquanto executava o aplicativo de um usuário diferente, como quando shift + clique com o botão direito do mouse em um arquivo e em "Executar como um usuário diferente".

As respostas que eu tentei me deram o nome de usuário 'other'.

Esta postagem no blog fornece uma maneira de obter o nome de usuário conectado, que funciona mesmo no meu cenário:
https://smbadiwe.github.io/post/track-activities-windows-service/

Ele usa Wtsapi

Alonzzo2
fonte