背景:用户在 Active Directory 中的名称从 Domain\oldname 更改为 Domain\newname 并使用 Domain\newname 成功登录到网络,但 Domain\oldname 出现在 Profiler 的 LoginName 和 NTUserName 列中。
用户的 SQL Server 权限是通过在 SQL Server 安全性中设置的组授予的。
问题:有没有人观察到这种行为并知道为什么 SQL Server 仍在使用 Domain\oldname(sp_who2 显示相同的信息)?
顺便说一句,在这里发布问题之前已经花费了大量时间进行研究,在我看来,Profiler/SQL 2008 R2 没有真正的问题。
我想我无法评论您的问题,因为这是我第一次使用堆栈交换,但这是用户所在的 AD 组吗?有时人们说组是指 SQL 角色,所以我只是想澄清一下。
我问的原因是因为如果当您将 AD 中的名称更改为 domain\newuser 时,用户在 domain\olduser 的服务器上登录,则您必须进入 SQL 并将登录名更改为 domain\newuser。我已经这样做了,它工作得很好,你不必做任何像重新启动 SQL 那样激烈的事情。我不知道帐户名称是否会随着时间的推移最终更改为新帐户,但我的猜测是否定的。
但是,我不知道当用户只是具有权限且实际上没有在服务器上登录的 AD 组的一部分时会发生什么。因此需要澄清,以便我可以调查。
我在 SQL Server 2012 实例(应用了 SP2)中遇到了同样的问题。我还没有找到根本原因,但我们将按照 StanleyJohns 的建议研究 AD 缓存机制。
偶然我发现了一个简单的解决方案,无需重新启动服务器即可为我工作。我为旧用户名创建了一个 Windows Authenticated 登录名(是的,这有效)然后放弃了它 - 问题解决了。
在创建/删除之后,我无法再次创建相同的登录名,因此看起来“删除登录名”是另一种将旧用户名从 AD 缓存中强制退出的方式。
SQL Server 可能需要一些时间来计算
它根据未更改的“sid”缓存的更改。虽然没有造成任何伤害。
我不知道确切的规则,但我已经看到它发生了。在极端情况下,如果它很重要,它会在 SQL Server 重新启动后清除
此外,检查 sys.server_principals 和相关的 sys.database_principals 是否有任何条目。如果用户拥有任何对象(例如,没有模式限定符的 CREATE TABLE),就会发生这种情况。
由于她是 AD 组的成员,因此她仍然可以访问。她在 SQL Server 中显示的旧用户名可能来自登录缓存。
您可以尝试关闭旧登录名的所有连接,因为它可能会缓存她登录的 SID。由于登录刚刚在 AD 中重命名,我认为它不会更改 SID,因此映射仍然存在,以便 SQL Server 使用旧名称运行。
AD 更改需要一些时间才能传播。此外,缓存中的身份验证令牌提供访问权限,同时仍显示较旧的登录名。
您可以尝试清除缓存:
net use * /delete /y
在命令行中。或者尝试强制 AD 凭据更新:
control userpasswords2
在命令行。然后转到“高级”选项卡并选择“管理密码”,这将让您修改保存的网络密码。这将使您不必重新启动服务器。
在我的情况下,唯一有效的是删除用户并重新添加用户。请注意,您必须检查并删除 SQL 作业以及任何数据库中的 DBO 的所有权。