为什么suser_name()无法反映AD帐户名称的更改?


10

我们的用户名之一已合法更改,因此我们将其Active Directory用户名更改为匹配-从domain \ oldname更改为domain \ newname。但是,当此用户在存储过程中调用suser_sname()时,它将返回旧名称,而不是新名称。

Googling将我引向KB 946358,这表明它们的名称已在服务器上缓存并且未更新,大概是因为suser_name()正在调用LsaLookupSids。但是,该文章中的解决方法涉及重新启动服务器,即使是这样,我仍然想了解问题所在。

如果我将上下文更改为他们的上下文,则会返回正确的名称:

EXECUTE AS LOGIN = 'domain\newname'
GO
SELECT suser_name()   --returns 'domain\newname'

...我以为这也将调用LsaLookupSids,因此将返回错误的名称。我似乎不太了解此处的工作机制。

一些可能重要的观察结果:

  • 该用户在服务器上没有显式登录。但是他们是这样做的AD组的成员。更改后的名称(domain \ newname)出现在的结果集中exec xp_logininfo 'domain\ADGroupName', 'members';域\旧名称没有。

  • 用户正在从存储过程中调用suser_name(),该过程是从Access 2003 MDB中的直通查询调用的。

  • 过去,我们已经更改了许多用户的帐户名,但是仅在上周才发现此问题(上周进行了两项更改,似乎都显示了该问题)。

  • 该服务器正在Windows 2008 R2 Datacenter版上运行Sql Server 2008 SP3 x64。

这是怎么回事?作为DBA,我该怎么办?或者我打算在哪里解决这个问题?


MSSQLSERVER(或任何实例名称是)服务是以本地系统身份还是真实登录名登录?该值可能会缓存在运行查找的帐户的注册表中。在您的情况下,您已登录并发出请求。我在想,也许如果您使用常规帐户运行SQL Server(应该这样做),则可能以“ SQL Server”登录名登录SQL Server,然后运行EXECUTE AS并进行SELECT SUSER_NAME()测试。另外,您是否尝试过SUSER_SNAME()其他100种变体中的任何一种?
所罗门·鲁茨基

尝试使用新名称在实例上创建登录名。这不会对其权限产生任何影响。运行SUSER_SNAME(),此时应将其修复。然后,您可以尝试删除登录名,看看它是否保留了新名称。
肯尼斯·费舍尔

@srutzky这是在域帐户下运行的默认MSSQLSERVER实例。不幸的是,我没有密码来登录。我尚未以用户身份尝试过suser_sname(),我相信如果不提供任何参数,它与suser_name()相同。值得一试-谢谢!
勇士鲍勃

1
SQL Server通过SID匹配所有帐户-无论是SQL还是域。由于域SID来自活动目录,因此更改名称不会更改SID。如果已缓存,则将返回旧名称。如果已经存在登录名,则只要SID匹配,无论是否仍然相同,都将返回该登录名。对于数据库用户,这是相同的。
肖恩·加拉迪

1
您可以尝试运行,ipconfig /flushdnsipconfig /registerdns从命令行查看是否可以解决问题。
RLF

Answers:


2

这可能与使用Kerberos进行缓存有关吗?(尽管只是一个猜测,但可能并不相关) http://blogs.technet.com/b/tspring/archive/2014/06/23/viewing-and-purging-cached-kerberos-tickets.aspx


1
我不能肯定地说这是问题所在,但我相信这或类似的问题。至少在这种情况下,重新引导服务器(这是由于单独的原因而发生)似乎已将其清除。目前尚不清楚是否会再次出现。

这是一个很好的建议,我应该想到这一点!:-)那是我们之前为清除缓存的kerberos问题所做的工作。很高兴您成功!
Normoe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.