Respuestas:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
devolverá el usuario "RunAs".
MessageBox.Show(Environment.UserName);
coloque esto en su window_loaded
evento y ejecútelo usando RunAs ....
Domain\Username
. ¿Cómo puedo obtener el nombre asociado con el nombre de usuario?
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.
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.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
después Split
antes de llamarLast()
ToArray()
se necesita. using System.Linq;
Aunque lo necesitarías .
Trate de la propiedad: Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
proporciona el nombre de cuenta registrado, pero WindowsIdentity.GetCurrent().Name
devuelve el nombre de cuenta con el que se ejecuta la aplicación.
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.
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).
Request
solo funciona si es una aplicación web. Es una instancia deSystem.Web.HttpRequest
Utilizar:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Ese será el nombre de inicio de sesión.
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.
String myUserName = Environment.UserName
Esto le dará salida - your_user_name
Úselo System.Windows.Forms.SystemInformation.UserName
para el usuario que realmente Environment.UserName
inició sesión, ya que aún devuelve la cuenta que está utilizando el proceso actual.
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.
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.
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<ManagementBaseObject>().First()["UserName"];
ahora se ve mejor
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;
}
}
}
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 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().Name
sin embargo, terminé usando Environment.UserName;
para iniciar sesión en el usuario de Windows y sin la porción de dominio.
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
Environment.UserName
?