не может подключиться к AD без специального подключения к DC

Я пытаюсь выполнить привязку к серверу Active Directory на C#, но на месте у меня возникли проблемы, не воспроизводимые в тестовой среде.

Я получаю исключение

System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.RefreshCache()
   at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName)
   at System.DirectoryServices.DirectoryEntry.get_NativeGuid()  

код выглядит так

// domainStr = "LDAP://domainname/rootDSE
using (var de = new DirectoryEntry(domainStr, Username, Password))
{
    var guid = de.NativeGuid;
}

однако, если я вместо этого попытаюсь подключить контроллер домена (domainStr = "LDAP://domainController/rootDSE" или полностью квалифицированный domainStr = "LDAP://domainController.DomainName"), он будет работать нормально.

Я старался

var d = Domain.GetDomain(new DirectoryContext(
            DirectoryContextType.Domain,
            domainStr,
            Username,
            Password));

но при этом я получаю точно такое же исключение.

Мне интересно, делаю ли я что-то не так, может быть, другой URL-адрес LDAP будет работать лучше, или это обычная проблема, с которой я сталкиваюсь (хотя поиск в Google поднимает эту проблему, я не нашел решение, которое работает для меня )

Также, возможно, стоит указать, что сервер, на котором работает программное обеспечение, не находится ни в одной Active Directory, и у меня есть список AD, к которым я подключаюсь (отсюда имя пользователя и пароль при попытке подключения)


person clows    schedule 21.03.2011    source источник
comment
Является ли эта машина, которую вы используете, членом этого домена?? Если нет, вам нужно будет указать конкретного пользователя домена + pwd, чтобы иметь возможность что-либо делать. Кроме того, я считаю, что правильный путь LDAP будет просто LDAP://RootDSE - он вам подходит??   -  person marc_s    schedule 21.03.2011
comment
Я не уверен, что вы имеете в виду! но, конечно, с C# вы можете подключиться к AD с указанием IP/имени/адреса DC, даже если ваша машина не является членом домена.   -  person Data-Base    schedule 21.03.2011
comment
Машина не является членом домена (поэтому я не могу просто подключиться к LDAP://RootDSE). Однако я использовал имя пользователя и пароль при попытке подключения, но все равно получаю вышеуказанное исключение, если я явно не укажу контроллер домена.   -  person clows    schedule 21.03.2011


Ответы (1)


Это потому, что DNS-сервер не имеет записи A для домена. DNS-сервер не знает, какой IP-адрес разрешать, когда вы передаете ему доменное имя. Обычно у вас нет этой проблемы, потому что по умолчанию встроенный DNS-сервер MS Windows добавит эту запись A для вас. Однако на крупных предприятиях очень часто не используется встроенный DNS-сервер MS Windows. Во многих случаях люди просто не утруждают себя добавлением записи A к доменному имени.

Если возможно, вы можете попросить своего клиента добавить запись A на DNS-сервер. В качестве альтернативы попросите клиента исправить файл c:\windows\system32\drivers\etc\hosts. Затем добавьте туда запись A. Вы можете просто указать на любой из контроллеров домена. Однако этот подход не масштабируется, потому что все пользователи на разных сайтах будут разрешать доменное имя в один и тот же IP-адрес. Некоторые пользователи удаленных сайтов могут столкнуться с проблемой медлительности.

Если вы также хотите решить проблему масштабируемости, вы можете рассмотреть возможность олицетворения пользователя вместо передачи имени пользователя и пароля в файл DirectoryEntry. Когда вы выдаете себя за пользователя домена, вы можете использовать привязку без сервера, как это LDAP://RootDSE.

person Harvey Kwok    schedule 22.03.2011