web-dev-qa-db-fra.com

Comment obtenir le nom d'utilisateur actuel dans .NET en utilisant C #?

Comment obtenir le nom d'utilisateur actuel dans .NET en utilisant C #?

555
Yves
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
825
juan

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.

297
Israel Margulies

Essayez la propriété: Environment.UserName .

108
JaredPar

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.

27
Kobus

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).

24
Shivam657

Utilisation:

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

Ce sera le nom de connexion.

21
John Cuckaroo

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.

11
jay_t55

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.

9
Daniel E.

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.

9
Remy

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.

5
FlashTrev

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.

5
Bhramar
String myUserName = Environment.UserName

Cela vous donnera une sortie - votre_nom_utilisateur

5
Shivam Bharadwaj

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

3
priyesh jaiswal

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;
    }
}
3
Michael B

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;
        }
    }
}
2
john rains

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.

1
Doreen

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);
    }
}
1
Anaramer