以编程方式更改 SQL Server 本机客户端密码

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) 未随附:

  • SQL Server 2022 (16.x) 及更高版本
  • SQL Server Management Studio 19 及更高版本

不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。

对于新项目,请使用以下驱动程序之一:

对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

在 SQL Server 2005 (9.x) 之前,如果用户的密码过期,则只有管理员能对其进行重置。 从 SQL Server 2005 (9.x)开始,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 身份验证始终优先。

如果使用 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 功能