2013-09-09 7 views
1

Я использую идентификатор пользователя (имя пользователя), чтобы получить его информацию от AD. Мне было интересно, можно ли использовать другие критерии, такие как фамилия, адрес электронной почты и т. Д., Чтобы сделать то же самое.Пользователь (ы) информация из Active Directory

Это то, что я пользователь, чтобы отфильтровать пользователей прямо сейчас:

 string adPath = ConfigurationManager.AppSettings["ADPath"].ToString(); 
     DirectoryEntry de = new DirectoryEntry(adPath); 
     DirectorySearcher deSearch = new DirectorySearcher(); 
     deSearch.SearchRoot = de; 
     string sFilter = String.Format("(&(objectClass=user)(SAMAccountName={0}))", UserID); 
     deSearch.Filter = sFilter; 
     deSearch.SearchScope = SearchScope.Subtree; 
     SearchResult results = deSearch.FindOne(); 

Спасибо.

Edited (используя предложение Mrc_S в):

using (adPrincipalContext) 
{ 
    UserPrincipal qbeUser = new UserPrincipal(adPrincipalContext); 
    qbeUser.GivenName = "Bruce"; 
    qbeUser.Surname = "Miller"; 

    PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

    foreach (var found in srch.FindAll()) 
    { 
     UserPrincipal up = (UserPrincipal)found; 
     PrincipalSearchResult<Principal> psr = up.GetGroups();      
     List<Principal> insListPrincipal = new List<Principal>(); 

     foreach (Principal p in psr) 
     { 
      insListPrincipal.Add(p); 
     } 

     foreach (Principal gp in psr) 
     { 
      string s1 = gp.Name; 
      string s2 = gp.Description; 
     } 

Когда я пытаюсь найти группы принадлежит пользователю, в обоих (внутренних) Foreach петель, после одной итерации я получаю ошибки. Список («indListPrincipal») будет содержать 18 записей, первый - «Пользователи домена», остальные - ошибки для каждого свойства контекста. второй foreach просто умирает после первой итерации. Единственное, что я получаю, это группа «Пользователи домена». Кажется, что все результаты поиска удаляются после одной итерации. Что я делаю неправильно?

ответ

1

Поскольку вы используете .NET 3.5 и выше, вы должны проверить пространство имен (S.DS.AM). Читайте об этом здесь:

В принципе, вы можете определить контекст домена и легко найти пользователей и/или групп в AD:

// set up domain context 
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // find a user 
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

    if(user != null) 
    { 
     // do something here....  
    } 
} 

новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD!

The UserPrincipal object has quite a selection of properties вы можете получить доступ напрямую - если вам нужны другие, вы можете даже расширить свой UserPrincipal при необходимости!

Update: если различные свойства, которые FindByIdentity поиски по не достаточно для вас, используйте PrincipalSearcher с «запрос по образцу» принципал сделать ваш поиск:

// create your domain context 
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // define a "query-by-example" principal - here, we search for a UserPrincipal 
    // and with the first name (GivenName) of "Bruce" and a last name (Surname) of "Miller" 
    UserPrincipal qbeUser = new UserPrincipal(ctx); 
    qbeUser.GivenName = "Bruce"; 
    qbeUser.Surname = "Miller"; 
    // of course, you can set **ANY** of the UserPrincipal properties here 

    // create your principal searcher passing in the QBE principal  
    PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

    // find all matches 
    foreach(var found in srch.FindAll()) 
    { 
     // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
    } 
} 
+0

Спасибо. Похоже, что основным методом является FindByIdentity(). Могу ли я найти другие средства, такие как имя, фамилия, имя_пользователя, телефон, электронная почта и т. Д.? – NoBullMan

+0

@NoBullMan: 'FindByIdentity' уже выполняет поиск по нескольким свойствам - подробнее просмотрите документы MSDN. Если вам нужен более гибкий поиск, проверьте «PrincipalSearcher» (также хорошо документированный на MSDN) –

+0

Спасибо marc_s, я думаю, что получил! Только один вопрос: в цикле foreach я не вижу, чтобы можно было получить телефон пользователя («VoiceTelephoneNumber»). Должен ли я использовать «найденный» как любой желаемый тип, который я хочу, например, UserPrincipal? – NoBullMan