Поделиться через


Смена пароля программным способом

В версиях, предшествующих SQL Server 2005, при истечении пароля пользователя, только администратор мог его сбросить. Начиная с SQL Server 2005, собственный клиент SQL Server программно поддерживает обработку истечения срока действия пароля через поставщика OLE DB собственного клиента SQL Server, драйвер 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". Причина: пароль для данной учетной записи необходимо изменить.

Дополнительные сведения об обработке ошибок SQL Server см. в разделе Обработка ошибок и сообщений в приложениях.

Поставщик 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.

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

ПримечаниеПримечание

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

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

ПримечаниеПримечание

SSPROP_AUTH_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 драйвер возвращает пользователю соответствующие сообщения об ошибках.