Итак, вы делаете это:
DirectoryEntry.Exists("LDAP://OU=Students,DC=hadoop,DC=com")
И это не работает. У вас есть две проблемы.
- Когда вы предоставляете путь LDAP с таким характерным именем, как этот, Windows отправляет запрос в домен, к которому присоединен компьютер. Если объект находится в одном домене, все хорошо. Если он находится в доверенном домене, D C возвращает направление («Я не могу сказать вам, что это такое, но я знаю, кто может»), и ваш компьютер инициирует новый запрос к другому D C. Поскольку компьютер, на котором вы работаете, не подключен к этому домену или доверенному домену, он не знает, где go найти этот объект, и поэтому выдается исключение. Так что вы должны сказать ему, где go. Это можно сделать, включив имя домена (или укажите c D C имя, если хотите) в путь:
LDAP://hadoop.com/OU=Students,DC=hadoop,DC=com
Но вам также необходимо передать учетные данные, которые
DirectoryEntry.Exists
не поддерживает. Однако, исходный код
доступен , поэтому вы можете просто украсть и изменить ™, чтобы создать версию, которая принимает учетные данные:
public static bool Exists(string path, string username, string password)
{
DirectoryEntry entry = new DirectoryEntry(path, username, password);
try
{
_ = entry.NativeObject; // throws exceptions (possibly can break applications)
return true;
}
catch (System.Runtime.InteropServices.COMException e)
{
if (e.ErrorCode == unchecked((int)0x80072030) ||
e.ErrorCode == unchecked((int)0x80070003) || // ERROR_DS_NO_SUCH_OBJECT and path not found (not found in strict sense)
e.ErrorCode == unchecked((int)0x800708AC)) // Group name could not be found
return false;
throw;
}
finally
{
entry.Dispose();
}
}
Единственное изменение, которое вы должны сделать, это изменить использование Bind
, так как это метод internal
и не может использоваться простыми смертными, такими как мы. Вместо этого я просто получаю свойство NativeObject
, которое вызывает для нас Bind()
.
Вы можете использовать это так:
var ouExists = Exists("LDAP://hadoop.com/OU=Students,DC=hadoop,DC=com", "username", "password");