Comment obtenir le nom d'utilisateur actuel dans .NET en utilisant C #?
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Si vous êtes dans un réseau d'utilisateurs, le nom d'utilisateur sera différent:
Environment.UserName
- Will Display format : 'Username'
plutôt que
System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'
Choisissez le format que vous voulez.
Essayez la propriété: Environment.UserName
.
La documentation pour Environment.UserName semble être un peu en conflit:
propriété Environment.UserName
Sur la même page, il est écrit:
Obtient le nom d'utilisateur de la personne actuellement connectée au système d'exploitation Windows.
ET
affiche le nom d'utilisateur de la personne qui a démarré le fil actuel
Si vous testez Environment.UserName à l'aide de RunAs, le nom de compte d'utilisateur RunAs vous sera attribué, et non l'utilisateur à l'origine connecté à Windows.
J'adhère totalement aux autres réponses, mais je voudrais mettre en évidence une autre méthode qui dit
String UserName = Request.LogonUserIdentity.Name;
La méthode ci-dessus m'a renvoyé le nom d'utilisateur au format: NomDomaine\NomUtilisateur. Par exemple, EUROPE\UserName
Ce qui est différent de:
String UserName = Environment.UserName;
Qui a affiché dans le format: serName
Et enfin:
String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
qui donnait: NT AUTHORITY\IUSR
(lors de l'exécution de l'application sur le serveur IIS) et DomainName\UserName
(lors de l'exécution de l'application sur un serveur local).
Utilisation:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Ce sera le nom de connexion.
Vous voudrez peut-être aussi essayer d’utiliser:
Environment.UserName;
Comme ça...:
string j = "Your WindowsXP Account Name is: " + Environment.UserName;
J'espère que cela a été utile.
J'ai essayé plusieurs combinaisons de réponses existantes, mais elles me donnaient
DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool
J'ai fini par utiliser
string vUserName = User.Identity.Name;
Ce qui m'a donné le nom d'utilisateur du domaine réel des utilisateurs uniquement.
Utilisez System.Windows.Forms.SystemInformation.UserName
pour l'utilisateur actuellement connecté en tant que Environment.UserName
renvoie toujours le compte utilisé par le processus en cours.
J'ai essayé toutes les réponses précédentes et j'ai trouvé la réponse sur MSDN après qu'aucune de ces solutions n'ait fonctionné pour moi. Voir 'UserName4' pour le correct pour moi.
Je suis après le tilisateur connecté, tel qu'affiché par:
<asp:LoginName ID="LoginName1" runat="server" />
Voici une petite fonction que j'ai écrite pour toutes les essayer. Mon résultat est dans les commentaires après chaque ligne.
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;
}
L'appel de cette fonction renvoie le nom d'utilisateur connecté par retour.
Mise à jour: j'aimerais souligner que l'exécution de ce code sur mon instance de serveur local me montre que Username4 renvoie "" (une chaîne vide), mais UserName3 et UserName5 renvoient l'utilisateur connecté. Juste quelque chose à se méfier de.
Juste au cas où quelqu'un cherche un utilisateur Nom complet par opposition à Nom d’utilisateur , comme moi.
Voici le régal:
System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName
Ajoutez une référence à System.DirectoryServices.AccountManagement
dans votre projet.
String myUserName = Environment.UserName
Cela vous donnera une sortie - votre_nom_utilisateur
essaye ça
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
maintenant ça a l'air mieux
Voici le code (mais pas 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
Voici le code (maintenant aussi 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;
}
}
Pour une application Windows Forms qui devait être distribuée à plusieurs utilisateurs, dont beaucoup se connectent via vpn, j'avais essayé plusieurs méthodes qui fonctionnaient toutes pour les tests de ma machine locale mais pas pour les autres. Je suis tombé sur un article de Microsoft que j'ai adapté et qui fonctionne.
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;
}
}
}
Au cas où cela serait utile aux autres, lorsque j'ai mis à niveau une application de c # .net 3.5 vers Visual Studio 2017, cette ligne de code User.Identity.Name.Substring(4);
a lancé cette erreur "startIndex ne peut pas dépasser la longueur de la chaîne "(il n'a pas hésité avant).
C'était heureux quand je l'ai changé en System.Security.Principal.WindowsIdentity.GetCurrent().Name
mais j'ai fini par utiliser Environment.UserName;
pour obtenir l'utilisateur connecté sous Windows et sans la partie domaine.
Obtenez le nom d'utilisateur Windows actuel:
using System;
class Sample
{
public static void Main()
{
Console.WriteLine();
// <-- Keep this information secure! -->
Console.WriteLine("UserName: {0}", Environment.UserName);
}
}