web-dev-qa-db-ja.com

ログインしたWindowsユーザーの名と姓を取得するにはどうすればよいですか?

システムでc#を使用して姓と名を取得する方法(Active Directoryユーザー名とパスを使用してWindowsにログインする)

ADに行くことなくそれを行うことは可能ですか?

38
Data-Base

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

注:既にユーザー名を持っている場合、実際にはプリンシパルは必要ありませんが、ユーザーコンテキストで実行している場合、そこからプルするのは簡単です。

55
Jacob Proffitt

これを行う簡単な方法があります:

using System.DirectoryServices.AccountManagement;

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

enter image description here

48

この解決策は私にとってはうまくいきませんでしたが、この機能はうまく働きました:

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

(それを見つけた ここ )。

9
ParPar

承認された答えの問題は、名字、名字のポリシーがある場合、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」が得られます。

2
user5292841