Respostas:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
retornará o usuário "RunAs".
MessageBox.Show(Environment.UserName);
colocar isso em seu window_loaded
evento, e executá-lo usando RunAs ....
Domain\Username
. Como posso obter o nome associado ao nome de usuário?
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.
Environment.UserDomainName + "\\" + Environment.UserName
para obter aparentemente o mesmo resultado que System.Security.Principal.WindowsIdentity.GetCurrent().Name
. Agora, qual é a diferença, você pergunta ... não tenho certeza.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
depois Split
antes de chamarLast()
ToArray()
é necessário. Você precisaria using System.Linq;
embora.
Experimente a propriedade: Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
fornece o nome da conta logada, mas WindowsIdentity.GetCurrent().Name
está retornando o nome da conta em que o aplicativo está sendo executado.
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.
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).
Request
funciona apenas se você for um aplicativo da web. É um exemplo deSystem.Web.HttpRequest
Usar:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Esse será o nome do logon.
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.
String myUserName = Environment.UserName
Isso fornecerá a saída - your_user_name
Use System.Windows.Forms.SystemInformation.UserName
para o usuário realmente conectado, pois Environment.UserName
ainda retorna a conta que está sendo usada pelo processo atual.
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.AccountManagement
no seu projeto.
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.
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;
}
}
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
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;
}
}
}
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);
}
}
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().Name
no entanto, acabei usando Environment.UserName;
para obter o usuário conectado do Windows e sem a parte do domínio.
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
Environment.UserName
?