Как предоставить DirectoryEntry.Exists учетные данные? - PullRequest
9 голосов
/ 26 ноября 2010

Этим утром я обнаружил хороший метод ( DirectoryEntry.Exists ), который должен быть в состоянии проверить, существует ли объект Active Directory на сервере. Поэтому я попробовал с простым:

if (DirectoryEntry.Exists(path)) {}

Конечно, в нем отсутствуют какие-либо перегрузки для предоставления учетных данных. Потому что, если учетные данные не предоставлены, я получаю это исключение:

Ошибка входа: неизвестное имя пользователя или неверный пароль (System.DirectoryServices.DirectoryServicesCOMException)

Есть ли другой вариант, который дает мне возможность аутентифицировать мой код на сервере AD? Или проверить существование объекта?

Ответы [ 5 ]

14 голосов
/ 26 ноября 2010

В этом случае вы не можете использовать статический метод Exists, как вы сказали:

DirectoryEntry directoryEntry = new DirectoryEntry(path);
directoryEntry.Username = "username";
directoryEntry.Password = "password";

bool exists = false;
// Validate with Guid
try
{
    var tmp = directoryEntry.Guid;
    exists = true;
}
catch (COMException)
{
   exists = false; 
}
2 голосов
/ 20 марта 2014

Нет способа сделать это, и я написал проблему с соединением для , надеюсь , чтобы решить ее.

DirectoryEntry.Exists не принимает учетные данные

1 голос
/ 26 ноября 2010

Здесь вы можете прочитать об олицетворении в C #:

1 голос
/ 26 ноября 2010

Итак, ответ на вопрос: невозможно.

Наконец, напишите собственный метод для получения DirectoryEntry по различаемому имени с указанными учетными данными.В обоих случаях существования / отсутствия я получил экземпляр DirectoryEntry.Чтобы проверить, верен ли верный объект, я делаю простую попытку ... поймать, чтобы увидеть, приводит ли это к исключению.Если это так, это недействительно.

Противная проверка, но это работает.Жаль, что метод по умолчанию .net DirectoryEntry.Exists не обеспечивает перегрузку для предоставления учетных данных, как конструктор DirectoryEntry ...

0 голосов
/ 26 ноября 2010

Если пользователь, запустивший процесс, не имеет прав для вызова DirectoryEntry.Exists, вы можете использовать олицетворение.

Это может быть полезно (обсуждается олицетворение в контексте AD): http://www.codeproject.com/KB/system/everythingInAD.aspx

Кстати, если у вас уже есть учетные данные пользователя, который имеет доступ ко всему, что вам нужно, почему бы не просто процесс с этим пользователем (например, / runas)?

...