Warum sollte suser_name () keine Änderung des AD-Kontonamens widerspiegeln?

10

Einer der Benutzernamen wurde legal geändert, daher haben wir den Active Directory-Benutzernamen entsprechend geändert - von Domäne \ alter Name zu Domäne \ neuer Name. Wenn suser_sname () von diesem Benutzer in einer gespeicherten Prozedur aufgerufen wird, wird der alte Name zurückgegeben, nicht der neue.

Das Googeln führte mich zu KB 946358, was darauf hindeutet, dass ihr Name auf dem Server zwischengespeichert und nicht aktualisiert wird, vermutlich weil suser_name () LsaLookupSids aufruft. Die Problemumgehung in diesem Artikel umfasst jedoch einen Neustart des Servers, und selbst wenn dies der Fall wäre, möchte ich das Problem dennoch verstehen.

Wenn ich meinen Kontext in ihren ändere, kommt der richtige Name zurück:

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

... Ich hätte angenommen, dass dies auch LsaLookupSids aufruft und so den falschen Namen zurückgibt. Es ist wahrscheinlich, dass ich die Mechanismen, die hier wirken, nicht wirklich verstehe.

Einige wichtige Beobachtungen:

  • Dieser Benutzer hat keine explizite Anmeldung auf dem Server. Aber sie sind Mitglied einer AD-Gruppe, die dies tut. Der geänderte Name (Domäne \ neuer Name) wird in der Ergebnismenge für angezeigt exec xp_logininfo 'domain\ADGroupName', 'members'. Domain \ alter Name nicht.

  • Der Benutzer ruft suser_name () innerhalb einer gespeicherten Prozedur auf, die von einer Passthrough-Abfrage in einer Access 2003-MDB aufgerufen wird.

  • Wir haben in der Vergangenheit viele Kontonamen von Benutzern geändert, dieses Problem jedoch erst in der letzten Woche beobachtet (zwei Änderungen wurden in der letzten Woche vorgenommen, beide scheinen das Problem aufzuweisen).

  • Auf dem Server wird SQL Server 2008 SP3 x64 unter Windows 2008 R2 Datacenter Edition ausgeführt.

Was ist los? Was könnte ich als DBA tun oder wo könnte ich suchen, um dies zu lösen?

Krieger Bob
quelle
Meldet sich der MSSQLSERVER-Dienst (oder wie auch immer der Instanzname lautet) als lokales System oder als echtes Login an? Der Wert wird möglicherweise in der Registrierung des Kontos zwischengespeichert, auf dem die Suche ausgeführt wird. In Ihrem Fall waren Sie angemeldet und haben die Anfrage gestellt. Ich denke, wenn Sie ein reguläres Konto verwenden, um SQL Server auszuführen (wie es sein sollte), melden Sie sich möglicherweise als "SQL Server" -Anmeldung bei SQL Server an, führen Sie dann Ihr aus EXECUTE ASund SELECT SUSER_NAME()testen Sie es. Haben Sie auch SUSER_SNAME()eine der anderen 100 Variationen ausprobiert ?
Solomon Rutzky
Versuchen Sie, ein Login für die Instanz unter dem neuen Namen zu erstellen. Dies hat keine Auswirkungen auf ihre Berechtigungen. Ausführen SUSER_SNAME(), es sollte an diesem Punkt behoben sein. Sie können dann versuchen, das Login zu löschen und festzustellen, ob der neue Name erhalten bleibt.
Kenneth Fisher
@srutzky Dies ist eine Standard-MSSQLSERVER-Instanz, die unter einem Domänenkonto ausgeführt wird. Leider habe ich nicht das Passwort, um mich damit anzumelden. Ich habe suser_sname () noch nicht als Benutzer ausprobiert. Ich glaube, dass es dasselbe ist wie suser_name (), wenn keine Argumente angegeben werden. Es ist jedoch einen Versuch wert - danke!
Krieger Bob
1
SQL Server vergleicht alle Konten mit der SID - ob SQL oder Domäne. Da Domänen-SIDs aus Active Directory stammen, ändert das Ändern des Namens nichts an der SID. Wenn es zwischengespeichert wurde, wird der alte Name zurückgegeben. Wenn bereits ein Login vorhanden ist, wird der Name des Logins zurückgegeben, unabhängig davon, ob er noch denselben Namen hat oder nicht, solange die SIDs übereinstimmen. Dies gilt auch für Datenbankbenutzer.
Sean Gallardy
1
Sie könnten versuchen , ausgeführt ipconfig /flushdnsund ipconfig /registerdnsvon einer Befehlszeile , wenn dass aufräumt das Problem zu sehen.
RLF

Antworten:

2

Könnte dies mit dem Caching mit Kerberos zusammenhängen? (Nur eine Vermutung könnte nichts damit zu tun haben) http://blogs.technet.com/b/tspring/archive/2014/06/23/viewing-and-purging-cached-kerberos-tickets.aspx

Normoe
quelle
1
Ich kann nicht sicher sagen, dass dies das Problem ist, aber ich glaube, dass dies oder so etwas ist. Ein Neustart des Servers (der aus verschiedenen Gründen erfolgte) scheint ihn zumindest für diesen Fall gelöscht zu haben. Es ist nicht klar, ob es wieder auftauchen wird.
Krieger Bob
Das ist ein guter Vorschlag, daran hätte ich denken sollen! :-) Das haben wir vorher gemacht, um die zwischengespeicherten Kerberos-Probleme zu klären. Ich bin froh, dass du erfolgreich warst!
Normoe