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

606

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

Yves
la source

Réponses:

897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
juan
la source
96
En quoi est-ce différent de Environment.UserName?
Sam Harwell
59
@SimonGillbee, c'est faux, Environment.UserNamerenverra l'utilisateur "RunAs".
Bolu
5
Pour vérifier .... MessageBox.Show(Environment.UserName);mettez ceci dans votre window_loadedévénement, et exécutez-le en utilisant RunAs ....
Bolu
4
Cela revient Domain\Username. Comment puis-je obtenir le nom associé au nom d'utilisateur?
SearchForKnowledge
325

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

Israël Margulies
la source
7
Vous pouvez utiliser Environment.UserDomainName + "\\" + Environment.UserNamepour 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.
Gutblender
9
J'avais besoin que l'utilisateur exécute l'application plutôt que qui est connecté (Environment.UserName n'est pas ce que je veux), j'ai donc fait ce qui suit pour System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
supprimer
Vous devez ajouter ToArray()après Splitavant d'appelerLast()
codenamezero
1
@codenamezero Non ToArray()est nécessaire. Vous auriez besoin using System.Linq;cependant.
TheSoftwareJedi du
112

Essayez la propriété: Environment.UserName.

JaredPar
la source
5
Ou,string userName = Environment.UserName;
Donut
10
Attention: comme Simon Gillbee l'a mentionné dans les commentaires de la réponse acceptée, Environment.UsernNamedonne le nom de compte connecté, mais WindowsIdentity.GetCurrent().Namerenvoie le nom de compte sous lequel l'application s'exécute.
Gerwald
5
@leo: Attention: Ces informations sont également apparemment incorrectes, voir la réponse de Bolu . :-)
TJ Crowder
Ne l'utilisez PAS avec ASP.NET. docs.microsoft.com dit: "Si une application ASP.NET s'exécute dans un environnement de développement, la propriété UserName renvoie le nom de l'utilisateur actuel. Dans une application ASP.NET publiée, cette propriété renvoie le nom du compte du pool d'applications ( comme Default AppPool). "
feihoa
28

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.

Kobus
la source
24

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

Shivam657
la source
Quel espace de noms est requis pour utiliser la «demande»?
TK-421
1
@ TK-421 Requestne fonctionne que si vous êtes une application Web. C'est un exemple deSystem.Web.HttpRequest
Gerardo Grignoli
22

Utilisation:

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

Ce sera le nom de connexion.

John Cuckaroo
la source
11

Vous pouvez également essayer d'utiliser:

Environment.UserName;

Comme ça...:

string j = "Your WindowsXP Account Name is: " + Environment.UserName;

J'espère que cela vous a été utile.

jay_t55
la source
11

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.

Daniel E.
la source
Excellent. J'ai également reçu uniquement l'identité du pool d'applications. Mais votre code a résolu mon problème. Merci beaucoup.
SuryaKavitha
Il semble que vous vouliez le nom d'utilisateur de l'utilisateur qui fait une demande, je suppose à un contrôleur MVC ou API Web. C'est différent du nom d'utilisateur sous lequel le processus s'exécute
Ben Aaronson
@BenAaronson La question ne dit rien sur le nom d'utilisateur qui exécute un processus. J'avais besoin du nom d'utilisateur du domaine actuellement connecté et une recherche m'a amené sur cette page, ce code m'a finalement donné ce dont j'avais besoin.
Daniel E.
11
String myUserName = Environment.UserName

Cela vous donnera une sortie - votre_nom_utilisateur

Shivam Bharadwaj
la source
9

Utiliser System.Windows.Forms.SystemInformation.UserNamepour l'utilisateur réellement connecté car Environment.UserNamerenvoie toujours le compte utilisé par le processus en cours.

Rémy
la source
Merci du partage, voir aussi: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh
9

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.AccountManagementdans votre projet.

Bhramar
la source
6

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.

FlashTrev
la source
Mon site Web utilise IIS, mais lorsque je visite la page à partir d'un autre ordinateur du réseau, je vois toujours "Service réseau" comme nom d'utilisateur. J'ai essayé toutes les options différentes, mais cela ne me donne pas l'utilisateur connecté qui consulte la page. Une idée?
Si8
3
REMARQUE: ce n'est pas clair, mais l'exemple ci-dessus s'applique dans le contexte d'une application Web exécutée dans IIS, où plusieurs d'entre eux afficheront le nom du compte Windows du serveur qui exécute le pool d'applications ASP.Net. Si vous exécutez en tant que programme interactif ou service Windows, celui de HttpContext ne sera pas disponible et l'un des autres doit être utilisé pour trouver le compte sous lequel le processus s'exécute.
Oskar Berggren
4

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;
    }
}
Michael B
la source
Supposons que l'on réponde en C #
Shivam Bharadwaj
4

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

priyesh jaiswal
la source
2

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;
        }
    }
}
john rains
la source
1

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);
    }
}
Ali Eshghi
la source
Mon site Web utilise IIS, mais lorsque je visite la page à partir d'un autre ordinateur du réseau, je vois toujours "Service réseau" comme nom d'utilisateur. J'ai essayé toutes les options différentes, mais cela ne me donne pas l'utilisateur connecté qui consulte la page. Une idée?
Si8
1

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().Namemais j'ai fini par utiliser Environment.UserName;pour obtenir l'utilisateur Windows connecté et sans la partie domaine.

Doreen
la source
Merci @doreen, vous l'avez trouvé utile.
Shivam Bharadwaj
0

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

Alonzzo2
la source