2016-12-27 4 views
-1

Я пытаюсь извлечь всех пользователей определенной группы из Active Directory сервера LDAP. Аутентификация становится успешной, но я получаю null в результате. Ниже приведен мой код.Импорт пользователей Active Directory в MVC

Домен-172.11.12.123
[email protected]
пароль-123456

using (var context = new DirectoryEntry(user.Domain, user.Email, user.Password, AuthenticationTypes.Secure)) 
      { 

       try 
       {      
        string FirstName; 
        string LastName; 
        string ADUserName; 
        string Email; 

        using (var searcher = new DirectorySearcher(context)) 
        { 
         searcher.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname='user3'))"; 
         List<string> Adusers = new List<string>(); 
         System.DirectoryServices.SearchResult result = searcher.FindOne(); 




        } 
       } 
       catch (Exception ex) 
       { 
        TempData["message"] = "error"; 
        return RedirectToAction("Index", "ADuserList"); 
       } 

      } 

Что плохого происходит. Заранее спасибо

+0

если вы RDP на постоянном токе и запустите 'dsa.msc' и выполните поиск - расширенный и вставьте свой запрос, он работает? Синтаксис выглядит несколько странным (у вас есть два анда и нет ors, afaic - только один, и хватило бы) – zaitsman

+0

Убедитесь, что ваш первый аргумент в DirectoryEntry ctor - LDAP: //172.11.12.123 Используя фильтр samaccountname = 'user3', вы выполняете поиск для пользователя «user3» в Active Directory. Убедитесь, что этот пользователь существует. Также одинарные кавычки не требуются. Просто введите samaccountname = user3 – oldovets

+0

спасибо, я проверю, и можете ли вы предложить мне правильный формат. –

ответ

0

Если вы находитесь на .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM).

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

// set up domain context for the currently connected AD domain 
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // find the group in question 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere"); 

    // if found.... 
    if (group != null) 
    { 
     // iterate over members 
     foreach (Principal p in group.GetMembers()) 
     { 
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName); 
      // do whatever you need to do to those members 
     } 
    } 
} 

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

Подробнее об этом здесь:

Update: для того, чтобы получить все пользователи данной OU, подход совершенно иной.

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

// create your domain context and define what OU to use: 
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, null, "OU=YourOU,OU=SubOU,dc=YourCompany,dc=com")) 
{ 
    // define a "query-by-example" principal - here, we search for any UserPrincipal 
    UserPrincipal qbeUser = new UserPrincipal(ctx); 

    // 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

Вау, большое спасибо. Это работало как шарм. Но он не работает, когда я передаю подразделение (подразделение Организации) в группу. Что делать в случае OU. –

+0

@ C.jacking: ну, «OU» - это не группа, поэтому это будет ** НЕ ** работать для OU, конечно ..... что вы пытаетесь сделать? Список всех пользователей в подразделении? Или найти OU в дереве AD? Или что еще? –

+0

Мне нужен список всех пользователей конкретного подразделения и группы. Проблема группы была решена вашим кодом, но мне нужен список в соответствии с OU. –