Быстрый способ получить Active Directory информации о пользователе

Я бы рекомендовал использовать PDO (объекты данных PHP) для запуска параметризованных SQL-запросов.

Это не только защищает от SQL-инъекции, но и ускоряет выполнение запросов.

И используя функции PDO, а не mysql_, mysqli_ и pgsql_, вы делаете свое приложение немного более абстрактным из базы данных, в редких случаях, когда вам нужно переключать поставщиков баз данных .

25
задан Benjamin 21 May 2014 в 17:00
поделиться

4 ответа

Причина, почему Ваш код является медленным, состоит в том, что Ваш запрос LDAP получает каждый пользовательский объект в Вашем домене даже при том, что Вы только интересуетесь одним пользователем с общим названием "Прохода":

dSearcher.Filter = "(&(objectClass=user))";

Так для оптимизации необходимо сузить запрос LDAP просто пользователю, которым Вы интересуетесь. Попробуйте что-то как:

dSearcher.Filter = "(&(objectClass=user)(cn=Adit))";

, Кроме того, не забывайте располагать эти объекты, когда сделано:

  • DirectoryEntry dEntry
  • DirectorySearcher dSearcher
17
ответ дан Juan Castillo 28 November 2019 в 18:25
поделиться

Ну, если Вы знаете, где Ваш пользователь живет в AD иерархии (например, вполне возможно в "Пользовательском" контейнере, если это - небольшая сеть), Вы могли бы также связать с учетной записью пользователя непосредственно, вместо того, чтобы искать его.

DirectoryEntry deUser = new DirectoryEntry("LDAP://cn=John Doe,cn=Users,dc=yourdomain,dc=com");

if (deUser != null)
{
  ... do something with your user
}

И если Вы уже находитесь на.NET 3.5, Вы могли бы даже использовать значительно расширенную Систему. DirectorySrevices. Пространство имен AccountManagement с классами со строгим контролем типов для каждого из наиболее распространенных AD объектов:

// bind to your domain
PrincipalContext pc = new PrincipalContext(ContextType.Domain, "LDAP://dc=yourdomain,dc=com");

// find the user by identity (or many other ways)
UserPrincipal user = UserPrincipal.FindByIdentity(pc, "cn=John Doe");

существуют загрузки информации там о Системе. DirectoryServices. AccountManagement - проверяют это превосходное статья о MSDN Joe Kaplan и Ethan Wilansky по теме.

13
ответ дан MerickOWA 28 November 2019 в 18:25
поделиться

Можно упростить этот код до:

        DirectorySearcher searcher = new DirectorySearcher();
        searcher.Filter = "(&(objectCategory=user)(cn=steve.evans))";

        SearchResultCollection results = searcher.FindAll();

        if (results.Count == 1)
        {
            //do what you want to do
        }
        else if (results.Count == 0)
        {
            //user does not exist
        }
        else
        {
            //found more than one user
            //something is wrong
        }

, Если можно сузить, где пользователь - Вы, может установить искателя. SearchRoot к определенному OU, что Вы знаете пользователя, находится под.

необходимо также использовать objectCategory вместо objectClass, так как objectCategory индексируется по умолчанию.

необходимо также рассмотреть поиск на атрибуте кроме CN. Например, могло бы иметь больше смысла искать на имени пользователя (sAMAccountName), так как это, как гарантируют, будет уникально.

7
ответ дан Mike Devenney 28 November 2019 в 18:25
поделиться

Я не уверен, сколько из Вашего "замедления" произойдет из-за цикла, который Вы делаете для нахождения записей с конкретными значениями атрибута, но можно удалить этот цикл, будучи более конкретными с фильтром. Попробуйте эту страницу за некоторое руководство... Поисковый Синтаксис Фильтра

1
ответ дан Handleman 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: