TAdoConnection 密码擅离职守

Posted

技术标签:

【中文标题】TAdoConnection 密码擅离职守【英文标题】:TAdoConnection password goes AWOL 【发布时间】:2013-08-08 11:31:14 【问题描述】:

使用 D5 中的 TAdoConnection 使用密码 sa 帐户连接到 Windows 7 64 位计算机上的本地 Sql Server,我收到错误“用户 sa 登录失败”,尽管我已经构建了TAdoConnection ConnectionString 包括密码。到 BeforeConnect 事件触发时,ConnectionString 不再包含密码。我可以在 WillConnect 事件中设置密码,然后连接就可以正常工作。

我的问题是,什么是从 ConnectionString 中删除密码?是否可能在 W7 中添加了一些安全功能 - 我不记得在 XP 上遇到过这个问题。

顺便说一句:即使我在 ConnectionString 中将 Persist Security Info 设置为 true,这个问题仍然会发生 - 密码甚至不会存储在 DFM 中。

【问题讨论】:

不要在设计时打开该连接(或者打开,但在连接字符串中使用Persist Security Info=True),它应该被保存到 DFM。 我知道它应该被保存,但正如我在“顺便说一句”中所说,它没有。 不要使用 ConnectionString "Build..." 按钮,它会调用 Windows OLE DB 数据链接属性对话框,并且在您关闭它时会去掉密码。我只遇到过 SQL Server 的这个问题,它必须根据实际的提供程序验证连接字符串。 (SQLNCLI、SQLNCLI10、SQLOLEDB)手动构建连接字符串并将其粘贴到 ConnectionString 属性中,然后保存。 甚至更推荐,根本不要“粘贴”连接字符串——它应该在运行时动态构建,而不是硬编码。假设一年后数据库被移动,或者您甚至更改了 sa 密码。我很久以前就学会了永远不要硬编码服务器凭据。不仅因为它可能会改变,还因为有时数据库连接组件可能会在启动应用程序时自动尝试连接到该数据库 - 甚至在表单的 OnCreate 甚至被触发之前连接。 【参考方案1】:

您的 ConnectionString 需要包含“Persist Security Info=True”,请参阅此prior topic。我使用了两个 const,一个用于 SQL 身份验证,另一个用于 Active Directory 身份验证,只需填写空白即可。

const
  csCONNECTION   = 'Provider=%s;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s';
  csADCONNECTION = 'Provider=%s;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s';

【讨论】:

以上是关于TAdoConnection 密码擅离职守的主要内容,如果未能解决你的问题,请参考以下文章

系统安装--无人职守

如何检测到 TadoConnection 丢失了与服务器的通信?

delphi10.2报e2010 lnconpatible types:tfdconnection and tadoconnection?

TADOConnection和TADQuery组件连接访问数据库总结

Linux中的无人职守安装脚本kickstart详解

project01 PXE 无人职守安装(kickstart|Cobbler)