web-dev-qa-db-ja.com

UserPrincipalクラスで表されていないActiveDirectory属性を取得する方法

つまり、現在System.DirectoryServices.AccountManagementを使用しており、UserPrincipalクラスを使用すると、名前、ミドルネームなどのみが表示されます。

だから私のコードではそれは

UserPrincipal myUser = new UserPrincipal(pc);
myUser.Name = "aaaaaa";
myUser.SamAccountName = "aaaaaaa";
.
.
.
.
myUser.Save();

モバイルや情報などの属性はどのように表示されますか?

21
Mondyak

それを行う適切な方法は、PrincipalExtensionsを使用してPrincipalを拡張し、説明されているようにメソッドExtensionSetExtensionGetを使用することです ここ

13
Raymund

この場合、ユーザープリンシパルから取得して、1レベル深く(DirectoryEntryの腸に戻る)する必要があります。

using (DirectoryEntry de = myUser.GetUnderlyingObject() as DirectoryEntry)
{
    if (de != null)
    {
        // Go for those attributes and do what you need to do...
        var mobile = de.Properties["mobile"].Value as string;
        var info = de.Properties["info"].Value as string;
    }
}
25
marc_s

_up.Mobile_は完璧ですが、残念ながら、UserPrincipalクラスにはそのようなメソッドがないため、.GetUnderlyingObject()を呼び出してDirectoryEntryに切り替える必要があります。

_static void GetUserMobile(PrincipalContext ctx, string userGuid)
{
    try
    {
        UserPrincipal up = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, userGuid);
        DirectoryEntry up_de = (DirectoryEntry)up.GetUnderlyingObject();
        DirectorySearcher deSearch = new DirectorySearcher(up_de);
        deSearch.PropertiesToLoad.Add("mobile");
        SearchResultCollection results = deSearch.FindAll();
        if (results != null && results.Count > 0)
        {
            ResultPropertyCollection rpc = results[0].Properties;
            foreach (string rp in rpc.PropertyNames)
            {
                if (rp == "mobile")
                    Console.WriteLine(rpc["mobile"][0].ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}
_
3
Mitch Stewart