Как я могу получить имя моего имени с С# в моей системе (вход в Windows с именем и паролем Active Directory)?
Можно ли это сделать, не обращаясь к AD?
Как я могу получить имя моего имени с С# в моей системе (вход в Windows с именем и паролем Active Directory)?
Можно ли это сделать, не обращаясь к AD?
Если вы используете .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;
}
Примечание: вам на самом деле не нужен принципал, если у вас уже есть имя пользователя, но если вы работаете в контексте пользователя, вытащить его оттуда также просто.
Существует более простой способ сделать это:
using System.DirectoryServices.AccountManagement;
UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;
Это решение не сработало для меня, но эта функция отлично работала:
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);
(нашел здесь).
Проблема с утвержденным ответом состоит в том, что если у вас есть политика "Фамилия, Имя", то 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;
}
Это дало бы требуемую форму "Джон Смит", как того требует оригинальный постер.
Отметьте это сообщение:
Как получить полное имя пользователя во входе в систему?
возможно, это помогает. Перейти к этому ответу:
Как получить полное имя пользователя во входе в систему?
также интересен принятый ответ.
Самый быстрый способ - привязать их к объекту 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
.
Была такая же проблема. После некоторых исследований и просмотра документов Microsoft, я нашел решение.
Сначала установите пакет System.DirectoryServices.AccountManagement с помощью диспетчера пакетов Nuget.
Затем при вызове метода GetUserNameWithoutDomain в качестве параметров передайте следующее:
GetUserNameWithoutDomain(UserPrincipal.Current.GivenName, UserPrincipal.Current.Surname);
Это должно определенно работать!