以编程方式更改密码

在 SQL Server 2005 之前,当用户的密码过期时,只有管理员才能重置密码。 从 SQL Server 2005 开始,SQL Server Native Client 支持通过 SQL Server Native Client OLE DB 提供程序和 SQL Server Native Client ODBC 驱动程序以及对 SQL Server 登录 对话框的更改以编程方式处理密码过期。

注释

如果可能,请提示用户在运行时输入其凭据,并避免以持久格式存储其凭据。 如果必须保留其凭据,则应使用 Win32 加密 API 对其进行加密。 有关密码使用的详细信息,请参阅 “强密码”。

SQL Server 登录错误代码

由于身份验证问题而无法建立连接时,应用程序可以使用以下 SQL Server 错误代码之一来帮助诊断和恢复。

SQL Server 错误代码 错误消息
15113 用户 “%.*ls' 登录失败的原因:密码验证失败。 帐户被锁定。
18463 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 此时无法使用密码。
18464 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 密码不符合策略要求,因为它太短。
18465 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 密码不符合策略要求,因为它太长。
18466 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 密码不符合策略要求,因为它不够复杂。
18467 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 该密码不符合密码筛选器 DLL 的要求。
18468 用户 "%.*ls" 登录失败。 原因: 密码更改失败。 在密码验证过程中出错。
18487 用户 "%.*ls" 登录失败。 原因:帐户的密码已过期。
18488 用户 "%.*ls" 登录失败。 原因:必须更改帐户的密码。

SQL Server Native Client OLE DB 访问接口

SQL Server Native Client OLE DB 提供程序通过用户界面和编程方式支持密码过期。

OLE DB 用户界面密码过期

SQL Server Native Client OLE DB 访问接口通过对 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 编程密码过期

SQL Server Native Client OLE DB 访问接口通过添加已添加到DBPROPSET_SQLSERVERDBINIT属性集的SSPROP_AUTH_OLD_PASSWORD(类型VT_BSTR)属性支持密码过期。

现有的“密码”属性引用DBPROP_AUTH_PASSWORD,用于存储新密码。

注释

在连接字符串中,“旧密码”属性设置SSPROP_AUTH_OLD_PASSWORD,该属性是当前(可能过期)密码,不能通过提供程序字符串属性使用。

提供程序不会保留此属性的值。 设置此属性时,提供程序不会将连接池用于第一个连接,因为会发生新的连接。 如果密码更改成功,则无法重复使用当前连接,因为它仍包含旧密码,密码更改后将无效。 此外,如果登录成功,提供程序将清除此属性。 随后尝试检索旧密码返回VT_EMPTY。

注释

不应保留SSPROP_AUTH_OLD_PASSWORD,因为它仅在密码过期时使用。

请注意,只要设置了“旧密码”属性,提供程序就假定尝试更改密码,除非还指定了 Windows 身份验证,在这种情况下,它始终优先。

如果使用 Windows 身份验证,则指定旧密码会导致DB_E_ERRORSOCCURRED或DB_S_ERRORSOCCURRED,具体取决于旧密码是分别指定为 REQUIRED 还是 OPTIONAL,并在 dwStatus 中返回DBPROPSTATUS_CONFLICTINGBADVALUE的状态值。 调用 IDBInitialize::Initialize 时会检测到此情况。

如果尝试更改密码意外失败,服务器将返回错误代码 18468。 从连接尝试返回标准 OLEDB 错误。

有关DBPROPSET_SQLSERVERDBINIT属性集的详细信息,请参阅 初始化和授权属性

SQL Server Native Client ODBC 驱动程序

SQL Server Native Client OLE DB 提供程序通过用户界面和编程方式支持密码过期。

ODBC 用户界面密码过期

SQL Server Native Client ODBC 驱动程序通过对 SQL Server 登录 对话框所做的更改支持密码过期。

如果调用 SQLDriverConnect 并且 DriverCompletion 的值设置为SQL_DRIVER_NOPROMPT,则密码过期时,初始连接尝试将失败。 SQLSTATE 值 28000 和本机错误代码值 18487 由 对 SQLErrorSQLGetDiagRec 的后续调用返回。

如果 DriverCompletion 已设置为任何其他值,则无论密码是否已过期,用户都会看到 “SQL Server 登录 ”对话框。 用户可以单击“ 选项 ”按钮,并选中 “更改密码 ”以更改密码。

如果用户单击“确定”,密码已过期,SQL Server 会提示输入并使用 “更改 SQL Server 密码 ”对话框确认新密码。

ODBC 提示行为和锁定的帐户

由于帐户被锁定,连接尝试可能会失败。 如果在 显示 SQL Server 登录 对话框后发生此错误,则会向用户显示服务器错误消息,并且连接尝试已中止。 如果用户为旧密码输入了错误的值,则可能还会在显示 “更改 SQL Server 密码 ”对话框之后发生此情况。 在这种情况下,将显示相同的错误消息,并且连接尝试已中止。

ODBC 连接池、密码过期和锁定帐户

帐户可能已锁定,或者其密码可能在连接池中处于活动状态时过期。 服务器两次检查过期的密码和锁定的帐户。 第一个是首次创建连接时。 第二次是在连接重置时从池中获取连接。

重置尝试失败时,将从池中删除连接,并返回错误。

ODBC 编程密码过期

SQL Server Native Client ODBC 驱动程序通过使用 SQLSetConnectAttr 函数连接到服务器之前设置的 SQL_COPT_SS_OLDPWD 属性支持密码过期。

连接句柄的 SQL_COPT_SS_OLDPWD 属性是指过期的密码。 此属性没有连接字符串属性,因为这会干扰连接池。 如果登录成功,驱动程序将清除此属性。

对于此功能,SQL Server Native Client ODBC 驱动程序在四种情况下返回SQL_ERROR:密码过期、密码策略冲突、帐户锁定以及使用 Windows 身份验证时设置旧密码属性时。 调用 SQLGetDiagField 时,驱动程序会向用户返回相应的错误消息。

另请参阅

SQL Server Native Client 功能