Как получить атрибуты Active Directory, не представленные классом UserPrincipal - PullRequest
22 голосов
/ 14 октября 2010

Я имею в виду, что сейчас я использую System.DirectoryServices.AccountManagement, и если я использую класс UserPrincipal, я вижу только имя, отчество и т. Д.

так в моих кодах это похоже на

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

Как бы я увидел атрибут как мобильный или информация?

Ответы [ 3 ]

23 голосов
/ 14 октября 2010

В этом случае вам нужно перейти на один уровень глубже - обратно в недра 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;
    }
}
13 голосов
/ 14 октября 2010

Правильный способ сделать это - использовать PrincipalExtensions, где вы расширяете Principal, который вам нужен, и используете методы ExtensionSet и ExtensionGet, как объяснено здесь .

3 голосов
/ 03 июня 2016

up.Mobile было бы идеально, но, к сожалению, такого метода в классе UserPrincipal нет, поэтому вам нужно переключиться на DirectoryEntry, вызвав .GetUnderlyingObject().

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