システムでc#を使用して姓と名を取得する方法(Active Directoryユーザー名とパスを使用してWindowsにログインする)
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はJohn SmithではなくSmith、Johnを与えることです。正しいフォームを取得するには2つの方法があります。userPrincipal.Nameプロパティには「John Smith(jsmith1)」が含まれているため、これを使用できます。
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;
}
これにより、元のポスターで必要とされる必要なフォーム「John Smith」が得られます。