ทำไม suser_name () ไม่แสดงการเปลี่ยนแปลงชื่อบัญชีโฆษณา?


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 และจะส่งคืนชื่อที่ไม่ถูกต้อง ดูเหมือนว่าฉันจะไม่เข้าใจกลไกการทำงานที่นี่จริงๆ

ข้อสังเกตบางอย่างที่อาจสำคัญ:

  • ผู้ใช้รายนี้ไม่มีการเข้าสู่ระบบที่ชัดเจนบนเซิร์ฟเวอร์ แต่พวกเขาเป็นสมาชิกของกลุ่มโฆษณาที่ทำ ชื่อที่เปลี่ยนแปลง (โดเมน \ newname) จะปรากฏในชุดผลลัพธ์สำหรับexec xp_logininfo 'domain\ADGroupName', 'members'; domain \ oldname ไม่ได้

  • ผู้ใช้กำลังเรียก suser_name () จากภายในโพรซีเดอร์ที่เก็บไว้ซึ่งเรียกจากเคียวรี passthrough ใน Access 2003 MDB

  • เราได้เปลี่ยนชื่อบัญชีผู้ใช้จำนวนมากในอดีต แต่ได้สังเกตปัญหานี้ในสัปดาห์ที่แล้วเท่านั้น (มีการเปลี่ยนแปลงสองครั้งในสัปดาห์ที่แล้วทั้งสองดูเหมือนจะมีปัญหา)

  • เซิร์ฟเวอร์กำลังเรียกใช้ Sql Server 2008 SP3 x64 บน Windows 2008 R2 Datacenter edition

เกิดอะไรขึ้น? ในฐานะ DBA ฉันควรทำอย่างไรหรือฉันจะแก้ไขปัญหานี้ได้ที่ไหน


MSSQLSERVER (หรือชื่ออินสแตนซ์ใด ๆ ) ที่เปิดให้บริการในระบบ Local System หรือการล็อกอินจริงหรือไม่? ค่าอาจถูกแคชในรีจิสตรีของบัญชีที่รันการค้นหา ในกรณีของคุณคุณเข้าสู่ระบบและทำการร้องขอ ฉันคิดว่าบางทีถ้าคุณใช้บัญชีปกติเพื่อเรียกใช้ SQL Server (ควรจะเป็นอย่างนั้น) จากนั้นอาจเข้าสู่ระบบ SQL Server เป็นการเข้าสู่ระบบ "SQL Server" จากนั้นเรียกใช้EXECUTE ASและSELECT SUSER_NAME()ทดสอบของคุณ คุณเคยลองSUSER_SNAME()และรูปแบบอื่น ๆ อีก 100 รูปแบบบ้างไหม?
โซโลมอน Rutzky

ลองสร้างการเข้าสู่ระบบในอินสแตนซ์โดยใช้ชื่อใหม่ สิ่งนี้จะไม่ส่งผลกระทบใด ๆ ต่อสิทธิ์ของพวกเขา เรียกใช้SUSER_SNAME()มันควรได้รับการแก้ไข ณ จุดนั้น จากนั้นคุณสามารถลองลบข้อมูลเข้าสู่ระบบและดูว่าชื่อนั้นเป็นชื่อใหม่หรือไม่
Kenneth Fisher

@srutzky มันเป็นอินสแตนซ์ MSSQLSERVER เริ่มต้นที่ทำงานภายใต้บัญชีโดเมน น่าเสียดายที่ฉันไม่มีรหัสผ่านเพื่อเข้าสู่ระบบด้วย ฉันยังไม่ได้ลอง suser_sname () ในฐานะผู้ใช้ฉันเชื่อว่ามันเหมือนกับ suser_name () หากไม่มีข้อโต้แย้ง มันคุ้มค่าที่จะลอง - ขอบคุณ!
Warrior Bob

1
SQL Server ตรงกับบัญชีทั้งหมดด้วย SID - ไม่ว่าจะเป็น SQL หรือโดเมน เนื่องจาก SID ของโดเมนมาจากไดเรกทอรีที่ใช้งานอยู่การเปลี่ยนชื่อจะไม่เปลี่ยน SID หากแคชแล้วชื่อเดิมจะถูกส่งกลับ หากการเข้าสู่ระบบมีอยู่แล้วชื่อของการเข้าสู่ระบบจะถูกส่งกลับว่ายังคงเป็นชื่อเดิมหรือไม่ตราบใดที่ SID ตรงกัน นี่เป็นสิ่งเดียวกันสำหรับผู้ใช้ฐานข้อมูล
ฌอน Gallardy

1
คุณอาจลองเรียกใช้ipconfig /flushdnsและipconfig /registerdnsจากบรรทัดคำสั่งเพื่อดูว่าปัญหานั้นหมดไปหรือไม่
RLF

คำตอบ:


2

สิ่งนี้อาจเกี่ยวข้องกับการแคชกับ Kerberos หรือไม่? (เพียงเดาว่าอาจไม่เกี่ยวข้อง) http://blogs.technet.com/b/tspring/archive/2014/06/23/viewing-and-purging-cached-kerberos-tickets.aspx


1
ฉันไม่สามารถบอกได้ว่านี่เป็นปัญหา แต่ฉันเชื่อว่านี่คือสิ่งที่มันเป็น การรีบูตเซิร์ฟเวอร์ (ซึ่งเกิดขึ้นจากเหตุผลแยกต่างหาก) ดูเหมือนว่าได้ทำการล้างข้อมูลแล้วอย่างน้อยในกรณีนี้ ยังไม่ชัดเจนว่าจะเกิดขึ้นอีกครั้งหรือไม่
Warrior Bob

นั่นเป็นข้อเสนอแนะที่ดีฉันควรจะคิดอย่างนั้น! :-) นั่นคือสิ่งที่เราทำมาก่อนจริง ๆ แล้วเพื่อล้างปัญหา kerberos ที่แคชไว้ ดีใจที่คุณประสบความสำเร็จ!
Normoe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.