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?
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à.
Il existe un moyen plus simple de procéder:
using System.DirectoryServices.AccountManagement;
UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;
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 ).
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.