我遇到了在我的Delphi 7应用程序中的特定情况下出现的问题 .
我的ADOConnection通过一些用户名和pass-SQL身份验证进入我的MS SQL服务器 . 问题是MS SQL登录是使用“用户必须在下次登录时更改传递”标志创建的,这使得ADO连接无法连接错误消息“18488 - 用户登录失败'% . * ls' . 原因:密码帐户必须更改 . “
通常,在MS SQL Management Studio中会显示更改密码提示,并且用户可以输入新密码 . 问题是如何在我的应用程序中强制更改此用户的密码?我能够捕获错误号并提示登录更改,但是那么呢?连接字符串中没有可用于将pass / reset更改为new的标志(如旧密码和新密码) . 那我该怎么办?
有人可以帮忙吗?
2 回答
当您捕获18488错误时,您需要显示自己的"change password"对话框,并使用连接字符串属性
"Old Password"
/"Password"
来自SQL Native Client
作为您的提供者(即Provider=SQLNCLI10
或SQLNCLI.1
) .这是我用来测试的一个小代码:
我的回答是基于这些读数:
How DO you change your SQL Login password?
SQL Server Native Client: Connection strings and OLE DB
Changing Passwords Programmatically
这是在您强制密码过期时使用“用户必须在下次登录时更改密码”选项在SQL服务器上从客户端更改密码的官方方法 .
如果在用户计算机上安装SQL Server Native Client是一个问题,我可以考虑更多选项:
创建一个Web服务(在您的服务器上),负责更改用户密码,提供旧/新密码并将状态返回给您的客户端 .
以"super user"(例如
sa
)连接,并更改用户的/登录密码 . 这意味着您需要在客户端计算机上保留该用户名/密码(从安全角度来看,恕我直言,但可能是可行的) . - 未经测试do NOT 使用"User must change password at next login"创建SQL登录 . 这是我最喜欢的解决方案 .
如果您对可以捕获此特定消息感到高兴,则可以显示自己的表单,说明必须更改SQL登录密码并要求用户输入新密码 . 然后使用ALTER LOGIN命令更改密码 .
为了安全起见,我会使用OLD_PASSWORD选项来确保该用户知道旧密码,因此可以设置新密码 .
如果您不希望用户进行设置,请自行设置 .
请注意,您的用户必须设置ALTER ANY LOGIN权限才能执行此操作 .