LDAP Изменить пароль: Исключение из HRESULT: 0x80070547 - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь запустить приложение для смены пароля с компьютера, не подключенного к домену. Код работает нормально при запуске с компьютера, подключенного к домену. Итак, теперь я подключаюсь к AD с прямым подключением LDAP через SSL. После вызова метода changepassword появляется сообщение об ошибке:

Не удалось прочитать информацию о конфигурации с контроллера домена, так как машина недоступна или доступ запрещен. (Исключение из HRESULT: 0x80070547).

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

string adminUser = Domain + @"\" + AdminUserName;
string adminPass = AdminUserPassword;
string ldapString = LDAPString;

DirectoryEntry de = new DirectoryEntry(ldapString, adminUser, adminPass, AuthenticationTypes.Secure);
DirectorySearcher deSearch = new DirectorySearcher(de) { SearchRoot = de, Filter = "(&(objectCategory=user)(cn=" + userName + "))" };

SearchResult result = deSearch.FindOne();

if (result != null)
{
    var adContext = new PrincipalContext(ContextType.Domain);
    currentdc = adContext.ConnectedServer;

    DirectoryEntry userEntry = result.GetDirectoryEntry();

    if (userEntry != null)
    {
        userEntry.Invoke("ChangePassword", new object[] { OldPassword, NewPassword });
    }
}

1 Ответ

1 голос
/ 08 ноября 2019

Вызов ChangePassword, звонки IADsUser::ChangePassword. Эта документация говорит, что она работает почти так же, как IADsUser::SetPassword. Эта документация содержит больше информации. Действительно, только первый метод будет работать, когда вы запускаете его из-за пределов домена:

Во-первых, поставщик LDAP пытается использовать LDAP через 128-битное соединение SSL. Для успешной работы SSL LDAP на сервере LDAP должен быть установлен соответствующий сертификат проверки подлинности сервера, а клиенты, использующие код ADSI, должны доверять органу, выдавшему эти сертификаты. И сервер, и клиент должны поддерживать 128-битное шифрование.

Я предполагаю, что ваш LDAPString имеет формат LDAP://example.com:636 (:636 является важной частью). Если вы можете читать такие данные, то сертификат SSL является доверенным. Так что это хорошо.

Единственным, возможно, недостающим элементом может быть 128-битное шифрование? Проверьте сертификат и посмотрите, возможно, он использует менее 128 бит. Хотя я был бы удивлен, если бы это было так.

В этом ответе есть небольшой фрагмент кода, который можно использовать для загрузки сертификата с любого сайта: https://stackoverflow.com/a/22251597/1202807

Просто используйте "https://example.com:636" в качестве «веб-сайта».

Существует также следующее:

В Active Directory вызывающий должен иметь право доступа расширенного контроля «Изменить пароль», чтобы изменить пароль с помощьюэтот метод.

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

...