Réponses:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
renverra l'utilisateur "RunAs".
MessageBox.Show(Environment.UserName);
mettez ceci dans votre window_loaded
événement, et exécutez-le en utilisant RunAs ....
Domain\Username
. Comment puis-je obtenir le nom associé au nom d'utilisateur?
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 souhaité.
Environment.UserDomainName + "\\" + Environment.UserName
pour obtenir apparemment le même résultat que System.Security.Principal.WindowsIdentity.GetCurrent().Name
. Maintenant, quelle est la différence, demandez-vous ... Je ne suis pas sûr.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
après Split
avant d'appelerLast()
ToArray()
est nécessaire. Vous auriez besoin using System.Linq;
cependant.
Essayez la propriété: Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
donne le nom de compte connecté, mais WindowsIdentity.GetCurrent().Name
renvoie le nom de compte sous lequel l'application s'exécute.
La documentation pour Environment.UserName semble être un peu conflictuelle:
Environment.UserName, propriété
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 de discussion actuel
Si vous testez Environment.UserName à l'aide de RunAs, il vous donnera le nom du compte d'utilisateur RunAs, pas l'utilisateur initialement connecté à Windows.
J'appuie totalement les autres réponses, mais je voudrais souligner 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: DomainName \ UserName . Par exemple, EUROPE \ UserName
Ce qui est différent de:
String UserName = Environment.UserName;
Qui s'affiche au format: UserName
Et enfin:
String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
qui a donné: 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).
Request
ne fonctionne que si vous êtes une application Web. C'est un exemple deSystem.Web.HttpRequest
Utilisation:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Ce sera le nom de connexion.
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 des utilisateurs réels uniquement.
String myUserName = Environment.UserName
Cela vous donnera une sortie - votre_nom_utilisateur
Utiliser System.Windows.Forms.SystemInformation.UserName
pour l'utilisateur réellement connecté car Environment.UserName
renvoie toujours le compte utilisé par le processus en cours.
Juste au cas où quelqu'un cherche le nom d'affichage de l' utilisateur par opposition au 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.
J'ai essayé toutes les réponses précédentes et trouvé la réponse sur MSDN après qu'aucune de ces réponses n'ait fonctionné pour moi. Voir 'UserName4' pour le bon pour moi.
Je suis après l' utilisateur connecté , comme indiqué par:
<asp:LoginName ID="LoginName1" runat="server" />
Voici une petite fonction que j'ai écrite pour les essayer tous. 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: je voudrais 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 dont il faut se méfier.
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;
}
}
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
Pour une application Windows Forms qui devait être distribuée à plusieurs utilisateurs, dont beaucoup se connectaient via vpn, j'avais essayé plusieurs méthodes qui fonctionnaient toutes pour mes tests de machine locale mais pas pour d'autres. Je suis tombé sur un article 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;
}
}
}
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);
}
}
Au cas où cela serait utile à d'autres, lorsque j'ai mis à niveau une application de l'application c # .net 3.5 vers Visual Studio 2017, cette ligne de code a User.Identity.Name.Substring(4);
généré cette erreur " startIndex ne peut pas être plus long que la longueur de la chaîne " (il n'a pas reculé auparavant).
Il était heureux quand je l'ai changé, System.Security.Principal.WindowsIdentity.GetCurrent().Name
mais j'ai fini par utiliser Environment.UserName;
pour obtenir l'utilisateur Windows connecté et sans la partie domaine.
J'ai parcouru la plupart des réponses ici et aucune ne m'a donné le bon nom d'utilisateur.
Dans mon cas, je voulais obtenir le nom d'utilisateur connecté, tout en exécutant mon application à partir d'un autre utilisateur, comme lorsque Maj + clic droit sur un fichier et "Exécuter en tant qu'utilisateur différent".
Les réponses que j'ai essayées m'ont donné le nom d'utilisateur «autre».
Ce billet de blog fournit un moyen d'obtenir le nom d'utilisateur connecté, ce qui fonctionne même dans mon scénario:
https://smbadiwe.github.io/post/track-activities-windows-service/
Il utilise Wtsapi
Environment.UserName
?