Подтвердить что ты не робот

Как я могу получить имя и фамилию вошедшего в Windows пользователя?

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

Можно ли это сделать, не обращаясь к AD?

4b9b3361

Ответ 1

Если вы используете .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;
}

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

Ответ 2

Существует более простой способ сделать это:

using System.DirectoryServices.AccountManagement;

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

enter image description here

Ответ 3

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

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

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

Ответ 4

Проблема с утвержденным ответом состоит в том, что если у вас есть политика "Фамилия, Имя", то 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;
    }

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

Ответ 6

Самый быстрый способ - привязать их к объекту AD напрямую, используя их SID, который у вас уже есть. Например:

var user = new DirectoryEntry($"LDAP://<SID={WindowsIdentity.GetCurrent().User.Value}>");

//Ask for only the attributes you want to read.
//If you omit this, it will end up getting every attribute with a value,
//which is unnecessary.
user.RefreshCache(new [] { "givenName", "sn" });

var firstName = user.Properties["givenName"].Value;
var lastName = user.Properties["sn"].Value;

Если вы используете ASP.NET и проверку подлинности Windows, вы извлекаете SID из ((WindowsIdentity) HttpContext.Current.User.Identity).User.Value.

Ответ 7

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

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

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

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