我们的一个客户有以下配置:
- 在域控制器上,有一个 SQL Server。
- 在他的个人电脑(WinXP)上,他使用 登录
LocalPC\LocalUser
。 - 在 Windows 资源管理器中,他打开
DomainController\SomeShare
并以 身份进行验证Domain\Administrator
。 - 他启动了我们的应用程序,该应用程序打开了与 SQL Server 的受信任连接(Windows 身份验证)。它起作用了。在 SSMS 中,该连接与用户一起显示
Domain\Administrator
。
首先,我很惊讶这竟然有效。(我的第一个怀疑是域中有一个具有相同名称和密码的用户,但LocalUser
域中没有用户。)
然后我们尝试在他的新电脑上重现同样的行为,但是失败了:
- 在他的新电脑(Win7)上,他使用 登录
OtherLocalPC\OtherLocalUser
。 - 在 Windows 资源管理器中,他打开
DomainController\SomeShare
并以 身份进行验证Domain\Administrator
。 - 他启动了我们的应用程序,该应用程序打开了与 SQL Server 的受信任连接(Windows 身份验证)。它失败并显示错误消息
Login failed for user ''. The user is not associated with a trusted SQL Server connection.
因此我的问题是:在什么条件下非域用户可以使用具有不同凭据的 Windows 身份验证访问远程 SQL Server?显然,这是可能的(它可以在他的旧电脑上运行),但为什么呢?我该如何重现它?
答案1
正如 Bernie White 提到的,这可能是由于 kerberos 配置的差异造成的。 KerbTray
可以在 WinXP 上运行,klist
内置于 W7 及更高版本。
除此之外,如果您尝试解决的问题是能够使用 Windows 身份验证的 SQL 服务器,那么您可以通过运行来实现runas /netonly /user:DOMAIN\Administrator application.exe
。
我使用的另一种方法是让用户通过 VPN 拨入,即使他们位于内部网络上。这样做会导致网络凭据用于所有打开的应用程序,并且具有允许 Outlook、SQL Server、LDAP 和他们可以访问的任何其他应用程序进行 SSO 的好处。