Программное изменение паролей собственного клиента SQL Server

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

До истечения срока действия пароля пользователя SQL Server 2005 (9.x) только администратор может сбросить его. Начиная с SQL Server 2005 (9.x), собственный клиент SQL Server поддерживает обработку срока действия пароля программным способом с помощью поставщика OLE DB sql Server Native Client OLE DB и драйвера ODBC собственного клиента SQL Server, а также путем внесения изменений в диалоговые окна входа SQL Server.

Заметка

По возможности следует предлагать пользователям вводить свои учетные данные во время выполнения, избегая их сохранения. Если необходимо сохранить учетные данные пользователей, зашифруйте их с помощью интерфейса API шифрования Win32. Дополнительные сведения об использовании паролей см. в разделе Надежные пароли.

Коды ошибок имени входа SQL Server

Если соединение нельзя установить из-за проблем проверки подлинности, то для диагностики и восстановления приложению будет доступен один из существующих кодов ошибок SQL Server.

Код ошибки SQL Server Сообщение об ошибке
15113 Сбой входа для пользователя "%.*ls" Причина: сбой проверки пароля. Учетная запись заблокирована.
18463 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. В данный момент этот пароль не может быть использован.
18464 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. Пароль слишком короткий и не отвечает требованиям политики.
18465 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. Пароль слишком длинный и не отвечает требованиям политики.
18466 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. Пароль недостаточно сложный и не отвечает требованиям политики.
18467 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. Пароль не отвечает требованиям динамической библиотеки фильтрации паролей.
18468 Ошибка входа пользователя «%.*ls». Причина: не удалось изменить пароль. В процессе проверки пароля произошла непредвиденная ошибка.
18487 Ошибка входа пользователя «%.*ls». Причина: истек срок действия пароля для этой учетной записи.
18488 Ошибка входа пользователя «%.*ls». Причина: пароль для данной учетной записи необходимо изменить.

Поставщик OLE DB для собственного клиента SQL Server

Поставщик OLE DB собственного клиента SQL Server поддерживает срок действия пароля, хотя пользовательский интерфейс и программно.

Пользовательский интерфейс OLE DB для истечения срока действия пароля

Поставщик OLE DB собственного клиента SQL Server поддерживает срок действия пароля с помощью изменений, внесенных в диалоговые окна входа SQL Server. Если свойство DBPROP_INIT_PROMPT установлено в значение DBPROMPT_NOPROMPT, то в случае истечения срока действия пароля попытка начального соединения завершится с ошибкой.

Если свойство DBPROP_INIT_PROMPT установлено в любое другое значение, диалоговое окно Имя входа SQL Server появится независимо от того, истек срок действия пароля или нет. Чтобы сменить пароль, пользователь может нажать кнопку Параметры и установить флажок Сменить пароль.

Если пользователь нажимает кнопку "ОК" и срок действия пароля истек, SQL Server предложит пользователю ввести и подтвердить новый пароль с помощью диалогового окна "Изменить пароль SQL Server ".

Поведение подсказки OLE DB и заблокированные учетные записи

Попытки соединения могут окончиться неудачей, если учетная запись заблокирована. В этом случае вслед за выводом диалогового окна Имя входа SQL Server для пользователя отображается сообщение об ошибке сервера, и попытка соединения аварийно завершается. Это может также произойти после отображения диалогового окна Изменить пароль SQL Server, если пользователь неправильно ввел старый пароль. В этом случае будет выведено то же сообщение об ошибке, а попытка соединения отменяется.

Пул соединений OLE DB, истечение срока действия пароля и заблокированные учетные записи

Учетная запись может оказаться заблокированной или может истечь срок действия пароля, в то время как соединение останется активным в пуле соединений. Сервер проверяет наличие паролей с истекшим сроком действия и заблокированных учетных записей в двух случаях. Во-первых, при первоначальном создании соединения. Во-вторых, после восстановления соединения, при получении соединения из пула.

Если попытка восстановления завершилась неудачно, то соединение удаляется из пула и возвращается ошибка.

Программное истечение срока действия пароля OLE DB

Поставщик OLE DB собственного клиента SQL Server поддерживает истечение срока действия пароля путем добавления свойства SSPROP_AUTH_OLD_PASSWORD (типа VT_BSTR), добавленного в набор свойств DBPROPSET_SQLSERVERDBINIT.

Существующее свойство «Password» ссылается на свойство DBPROP_AUTH_PASSWORD и используется для хранения нового пароля.

Заметка

В строке подключения свойство «Old Password» устанавливает значение свойства SSPROP_AUTH_OLD_PASSWORD, являющееся текущим паролем (возможно, с истекшим сроком действия), недоступным через свойство строки поставщика.

Поставщик не сохраняет значение этого свойства. Когда это свойство установлено, при первом соединении поставщик не использует пул соединений, поскольку это вызовет новое соединение. Если пароль успешно изменен, текущее соединение нельзя использовать повторно, поскольку оно все еще содержит старый пароль, который будет недопустимым после изменения пароля. Кроме того, при успешном входе поставщик очистит данное свойство. Дальнейшие попытки получения старого пароля вернут значение VT_EMPTY.

Заметка

Свойство SSPROP_AUTH_OLD_PASSWORD не нужно сохранять, поскольку оно используется только при истечении срока действия пароля.

Обратите внимание, что при установке свойства «Old Password» поставщик предполагает, что была сделана попытка изменить пароль, если не была также указана проверка подлинности Windows, имеющая приоритет.

Если используется проверка подлинности Windows, при указании старого пароля возвращается либо DB_E_ERRORSOCCURRED, либо DB_S_ERRORSOCCURRED в зависимости от того, был ли указан старый пароль как REQUIRED или OPTIONAL соответственно, а значение состояния DBPROPSTATUS_CONFLICTINGBADVALUE возвращается в параметре dwStatus. Это определяется при вызове метода IDBInitialize::Initialize.

Если попытка смены пароля завершилась непредвиденной ошибкой, то сервер возвращает код ошибки 18468. Попытка соединения возвращает стандартный код ошибки OLEDB.

Дополнительные сведения о наборе свойств DBPROPSET_SQLSERVERDBINIT см. в статье Свойства инициализации и авторизации.

Драйвер ODBC для собственного клиента SQL Server

Поставщик OLE DB собственного клиента SQL Server поддерживает срок действия пароля, хотя пользовательский интерфейс и программно.

Пользовательский интерфейс ODBC истечения срока действия пароля

Драйвер ODBC собственного клиента SQL Server поддерживает истечение срока действия пароля с помощью изменений, внесенных в диалоговые окна входа SQL Server.

Если sqlDriverConnect вызывается, а значение DriverCompletion имеет значение SQL_DRIVER_NOPROMPT, начальная попытка подключения завершается ошибкой, если срок действия пароля истек. Значение SQLSTATE 28000 и собственное значение кода ошибки 18487 возвращаются последующими вызовами SQLError или SQLGetDiagRec.

Если driverCompletion имеет любое другое значение, пользователь видит диалоговое окно входа SQL Server независимо от того, истек срок действия пароля. Чтобы сменить пароль, пользователь может нажать кнопку Параметры и установить флажок Сменить пароль.

Если пользователь нажимает кнопку "ОК" и срок действия пароля истек, SQL Server запрашивает ввод и подтверждение нового пароля с помощью диалогового окна "Изменение пароля SQL Server".

Поведение подсказки ODBC и заблокированные учетные записи

Попытки соединения могут окончиться неудачей, если учетная запись заблокирована. В этом случае вслед за выводом диалогового окна Имя входа SQL Server для пользователя отображается сообщение об ошибке сервера, и попытка соединения аварийно завершается. Это может также произойти после отображения диалогового окна Изменить пароль SQL Server, если пользователь неправильно ввел старый пароль. В этом случае будет выведено то же сообщение об ошибке, а попытка соединения отменяется.

Пул соединений ODBC, истечение срока действия пароля и заблокированные учетные записи

Учетная запись может оказаться заблокированной или может истечь срок действия пароля, в то время как соединение останется активным в пуле соединений. Сервер проверяет наличие паролей с истекшим сроком действия и заблокированных учетных записей в двух случаях. Во-первых, при первоначальном создании соединения. Во-вторых, после восстановления соединения, при получении соединения из пула.

Если попытка восстановления завершилась неудачно, то соединение удаляется из пула и возвращается ошибка.

Программное истечение срока действия пароля ODBC

Драйвер ODBC собственного клиента SQL Server поддерживает истечение срока действия пароля путем добавления атрибута SQL_COPT_SS_OLDPWD, который устанавливается перед подключением к серверу с помощью функции SQLSetConnectAttr .

Атрибут SQL_COPT_SS_OLDPWD дескриптора соединения ссылается на пароль с истекшим сроком действия. Для этого атрибута не существует атрибута строки соединения, поскольку это может повлиять на пул соединений. При успешном входе драйвер очищает этот атрибут.

Драйвер ODBC собственного клиента SQL Server возвращает SQL_ERROR в четырех случаях для этой функции: срок действия пароля, конфликт политики паролей, блокировка учетной записи и при установке старого свойства пароля при использовании проверки подлинности Windows. Драйвер возвращает пользователю соответствующие сообщения об ошибках при вызове SQLGetDiagField .

См. также

Компоненты собственного клиента SQL Server