2010-10-14 2 views
15

То, что я имею в виду, что сейчас я использую System.DirectoryServices.AccountManagement и если я использую UserPrincipal класс я вижу только имя, отчество и т.д.Как получить атрибуты Active Directory не представлены классом UserPrincipal

поэтому в моих кодах это нравится

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

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

ответ

11

Правильный способ сделать это состоит в использовании PrincipalExtensions, где вы Продлить Принципала вы после и использовать методы ExtensionSet и ExtensionGet, как описано здесь http://anyrest.wordpress.com/2010/10/14/how-to-use-ad-attributes-not-represented-in-userprincipal-groupprincipal-and-computerprincipal/

+0

+1 спасибо за очень полезную и полезную ссылку! –

15

В этом случае, вы должны пойти один уровень глубже - обратно в недра DirectoryEntry - захватывая его от пользователя принципала:

DirectoryEntry de = (myUser.GetUnderlyingObject() as DirectoryEntry); 

if(de != null) 
{ 
    // go for those attributes and do what you need to do 
} 
+0

Ill дать ему попробовать даст вам знать – Mondyak

+0

Это работало отлично, как быстро исправить, но я стараюсь, чтобы избежать использования записи каталога. Спасибо за помощь. – Mondyak

+0

Поразило, что у меня так много оборотов, так как он не показывает, как реализовать объект 'de' для получения свойств. – vapcguy

3

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

К сожалению, если вы загрузите свойство на 'deSearch', которое имеет пустое значение в AD, оно не возвращается в наборе результатов, а исходный код не проверяет, не существует ли он, поэтому он выдает исключение' Ссылка на объект не установлена ​​в экземпляр объекта 'на этой строке' Console.WriteLine'. Я представил редактирование, которое должно выполнить эту работу. – vapcguy

+0

Обратите внимание, что все это должно быть завернуто в 'try ... catch'. Если пользователь отправляется этой функции, которая больше не находится в AD, она также получит исключение «Ссылка на объект, не установленная на экземпляр объекта» в экземпляре «DirectoryEntry», также исправлена ​​в моем редактировании. – vapcguy

+0

Кроме того, я даже не вижу «мобильный» в списке возможных имен свойств в 'rootSearch'' results'. Существует 'telephonenumber', на самом деле это то, что ищет OP. Это то же самое, что и «Телефон» в форме GUI для пользователя в AD, но также и то же, что и 'up.VoiceTelephoneNumber', и поэтому даже не требовать вызова' .GetUnderlyingObject() '. Но другие свойства, вероятно, были бы, поэтому это для меня, это лучшее решение для итерации через них всех. – vapcguy

Смежные вопросы