Не удается получить пользователя Active Directory в C # - PullRequest
2 голосов
/ 10 ноября 2011

Я построил тестовый сервер Active Directory в Windows 2008, а также запускаю на нем DNS-сервер.На моем клиентском компьютере, на котором выполняется приложение C #, я могу аутентифицировать пользователя на сервере Active Directory, используя следующую функцию:

public static UserPrincipal GetUserPrincipal(string usrName,string pswd,string domainName)
{
   UserPrincipal usr;
   PrincipalContext ad;

   // Enter Active Directory settings
   ad = new PrincipalContext(ContextType.Domain, domainName,usrName,pswd);

   //search user
   usr = new UserPrincipal(ad);
   usr.SamAccountName = usrName;

   PrincipalSearcher search = new PrincipalSearcher(usr);
   usr = (UserPrincipal)search.FindOne();
   search.Dispose();
   return usr;
}

В отдельной логике я пытался получить пользователя обратно с сервера, используяимя пользователя.Я использовал следующие функции:

public static DirectoryEntry CreateDirectoryEntry()
{
   // create AD connection
   DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=rootforest,DC=com","LDAP","password");
   de.AuthenticationType = AuthenticationTypes.Secure;
   return de;
}

public static ResultPropertyCollection GetUserProperty(string domainName, string usrName)
{
    DirectoryEntry de = CreateDirectoryEntry();
    DirectorySearcher deSearch = new DirectorySearcher();
    deSearch.SearchRoot = de;
    deSearch.Filter = "(SamAccountName=" + usrName + ")";
    SearchResult results = deSearch.FindOne();

    return null;
}

Однако я не получил ответа от сервера LDAP вообще, даже не исключение.Я пропускаю определенные настройки на сервере LDAP, любой из вас может увидеть дефект в моем коде (пожалуйста, не обращайте внимания на значения жесткого кода, я тестировал этот код).

Как часть моего устранения неполадок, Я подтвердил, что могу пинговать до rootforest.com с клиентского компьютера.Я подтвердил, что пользователь со свойством samaccountname "LDAP" существует.Мой путь кажется правильным, потому что когда я захожу на сервер LDAP и набираю:

dsquery user -name LDAP*      

, я получаю следующее:

CN=LDAP L. LDAP,CN=Users,DC=rootforest,DC=com

Любая помощь будет принята с благодарностью, яЯ провел большую часть моего дня в поисках неисправностей и изучении этого маленького жучка, и я думаю, что это может быть что-то маленькое, что я упустил из виду.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Я не понимаю, почему вы используете новый материал PrincipalContext / UserPrincipal в своем первом примере, но отступите к сложным для использования материалам DirectoryEntry во втором примере ... на самом деле не имеет смысла ... также: ваша вторая функция GetUserProperty, кажется, возвращает null всегда - опечатка или нет ??

Поскольку вы уже используете пространство имен System.DirectoryServices.AccountManagement (S.DS.AM) - используйте его и для своей второй задачи! Прочитайте все об этом здесь:

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

public static ????? GetUserProperty(string domainName, string usrName)
{
   // set up domain context
   PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

   // find a user
   UserPrincipal user = UserPrincipal.FindByIdentity(ctx, usrName);

   if(user != null)
   {
      // return what you need to return from your user principal here
   }
   else
   {
       return null;
   }
}

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

0 голосов
/ 10 ноября 2011

Я думаю, что у вашего кода есть несколько проблем:

  1. Почему вы возвращаете null в вашей функции GetUserProperty()? Вы должны вернуть results.
  2. Атрибут, который вы используете в своем поисковом фильтре, написан с ошибкой. Вместо этого используйте sSAMAccountName. Кроме того, расширить свой запрос для поиска только учетных записей пользователей. Вот пример: (&(objectCategory=person)(objectClass=user)(sAMAccountName=usrName))
  3. Вы также можете использовать класс UserPrincipal для поиска идентификатора в Active Directory. Класс UserPrincipal предоставляет статический метод с именем FindByIdentity () для поиска идентификатора пользователя.

Надеюсь, это поможет.

...