web-dev-qa-db-fra.com

Comment obtenir le prénom et le nom de famille de l'utilisateur Windows connecté?

Comment puis-je obtenir mon prénom nom de famille avec c # dans mon système (connexion dans Windows avec nom d'utilisateur et passe Active Directory)?

Est-il possible de le faire sans aller à l'AD?

38
Data-Base

Si vous utilisez .Net 3.0 ou supérieur, il y a une belle bibliothèque qui fait que cela s'écrit pratiquement tout seul. System.DirectoryServices.AccountManagement a un objet UserPrincipal qui obtient exactement ce que vous recherchez et vous n'avez pas à jouer avec LDAP ou à passer aux appels système pour le faire. Voici tout ce qu'il faudrait:

Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal principal = (WindowsPrincipal)Thread.CurrentPrincipal;
// or, if you're in Asp.Net with windows authentication you can use:
// WindowsPrincipal principal = (WindowsPrincipal)User;
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, principal.Identity.Name);
    return up.DisplayName;
    // or return up.GivenName + " " + up.Surname;
}

Remarque: vous n'avez pas réellement besoin du principal si vous avez déjà le nom d'utilisateur, mais si vous exécutez dans le contexte des utilisateurs, il est tout aussi facile de le retirer de là.

55
Jacob Proffitt

Il existe un moyen plus simple de procéder:

using System.DirectoryServices.AccountManagement;

UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;

enter image description here

48
Shivakant Upadhyay

Cette solution n'a pas fonctionné pour moi, mais cette fonction a très bien fonctionné:

public static string GetUserFullName(string domain, string userName)
        {
            DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domain + "/" + userName + ",User");
            return (string)userEntry.Properties["fullname"].Value;
        }

Vous devriez l'appeler ainsi:

GetUserFullName(Environment.UserDomainName, Environment.UserName);

(Trouvé ici ).

9
ParPar

Le problème avec la réponse approuvée est que si vous avez une politique de nom, prénom en place, alors DisplayName donne Smith, John, pas John Smith. Il existe deux façons d'obtenir le formulaire correct, la propriété userPrincipal.Name contient "John Smith (jsmith1)" afin que vous puissiez l'utiliser, et juste string.Split sur "(". Ou utilisez ce qui suit:

private string ConvertUserNameToDisplayName(string currentSentencedByUsername)
    {
        string name = "";
        using (var context = new PrincipalContext(ContextType.Domain))
        {
            var usr = UserPrincipal.FindByIdentity(context, currentSentencedByUsername);
            if (usr != null)
                name = usr.GivenName+" "+usr.Surname;
        }
        if (name == "")
            throw new Exception("The UserId is not present in Active Directory");
        return name;
    }

Cela donnerait le formulaire requis "John Smith" tel que requis par l'affiche originale.

2
user5292841