Как я могу получить имя и фамилию вошедшего в Windows пользователя? - PullRequest
37 голосов
/ 13 августа 2010

Как я могу получить свое имя, фамилию с помощью c # в моей системе (вход в Windows с именем пользователя и паролем Active Directory)?

Можно ли это сделать, не заходя в AD?

Ответы [ 5 ]

54 голосов
/ 13 августа 2010

Если вы используете .Net 3.0 или выше, есть прекрасная библиотека, которая делает это практически пишущим. System.DirectoryServices.AccountManagement имеет UserPrincipal объект, который получает именно то, что вы ищете, и вам не нужно связываться с LDAP или переходить к системным вызовам, чтобы сделать это. Вот все, что нужно:

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;
}

Примечание: на самом деле вам не нужен принципал, если у вас уже есть имя пользователя, но если вы работаете в контексте пользователя, его так же легко извлечь из него.

48 голосов
/ 11 февраля 2014

Есть более простой способ сделать это:

using System.DirectoryServices.AccountManagement;

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

enter image description here

9 голосов
/ 15 января 2014

Это решение не сработало для меня, но эта функция прекрасно работала:

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

Вы должны назвать это так:

GetUserFullName(Environment.UserDomainName, Environment.UserName);

(нашел здесь ).

2 голосов
/ 14 августа 2018

Проблема с утвержденным ответом состоит в том, что если у вас есть политика «Фамилия, Имя», то DisplayName дает Смиту, Джону, а не Джону Смиту.Есть два способа получить правильную форму, свойство userPrincipal.Name содержит «John Smith (jsmith1)», так что вы можете использовать это, и просто string.Split on »(". Или использовать следующее:

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;
    }

Это даст необходимую форму "Джон Смит", как того требует оригинальный плакат.

0 голосов
/ 17 января 2019

Была такая же проблема.После некоторых исследований и просмотра документов Microsoft я нашел решение.

Сначала установите пакет System.DirectoryServices.AccountManagement с помощью диспетчера пакетов Nuget.

Затем при вызове метода GetUserNameWithoutDomain передайте следующее какпараметры:

GetUserNameWithoutDomain(UserPrincipal.Current.GivenName, UserPrincipal.Current.Surname); Это определенно должно работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...