今天發生了非常奇怪的事情,有位員工的帳號更改,在某個Windows Server 2003的Asp.Net程式一直抓到他原來的名字,也就是使用 User.Identity.Name 一直是舊的資料。
我先使用 iisreset,但仍然沒用。逐步檢查程式也沒錯,另外建一個Web App還是相同,但是在別台Server就正常。最後使用大絕招,整臺Server重開機就好!原來是Windows Server 2003 內建的Cache機制造成,以後debug還是用傳統的reboot大絕嗎?
Update: 感謝Ricky Chiang提供資料,可以看KB:
我先使用 iisreset,但仍然沒用。逐步檢查程式也沒錯,另外建一個Web App還是相同,但是在別台Server就正常。最後使用大絕招,整臺Server重開機就好!原來是Windows Server 2003 內建的Cache機制造成,以後debug還是用傳統的reboot大絕嗎?
Update: 感謝Ricky Chiang提供資料,可以看KB:
狀況
請考慮下列情況:
- 在網域成員電腦上,應用程式會呼叫LsaLookupSids函式,若要翻譯的使用者名稱的安全性識別項 (SID)。
- 使用者名稱已變更網域控制站上。
原因
本機安全性授權 (LSA) 會快取的 SID 和網域成員電腦上的本機快取中的使用者名稱之間的對應。快取的使用者名稱與網域控制站不同步。LSA 在網域成員電腦上的會先查詢本機 SID 快取。如果現有的對應已經是本機的 SID 快取中,LSA 就會傳回快取的使用者名稱資訊,而不會查詢的網域控制站。這種行為被要改善效能。
快取項目執行逾時時間,不過機會,週期性的查詢,由應用程式保留現有的快取項目還活著的快取項目的最大存留期。
快取項目執行逾時時間,不過機會,週期性的查詢,由應用程式保留現有的快取項目還活著的快取項目的最大存留期。
因應措施
若要解決這個問題,請停用本機的 SID 快取中,網域成員電腦上。若要執行這項操作,請參考下列步驟:
- 開啟 [登錄編輯程式]。
若要在 Windows XP 中,或在 Windows Server 2003 中,請執行這項操作,按一下 [開始],按一下 [執行、 輸入regedit,然後按一下[確定]。
若要在 Windows Vista 中和較新,請執行這項操作,請按一下 [開始],開始搜尋] 方塊中輸入regedit ,然後按 ENTER 鍵。 - 找出並用滑鼠右鍵按一下下列登錄子機碼︰HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
- 指向 [新增],然後按一下 [ DWORD 值。
- 輸入LsaLookupCacheMaxSize,然後再按 ENTER 鍵。
- 以滑鼠右鍵按一下LsaLookupCacheMaxSize,,,然後按一下 [修改]。
- 在 [數值資料] 方塊中,輸入0,然後按一下[確定]。
- 結束登錄編輯程式。
狀態
行為是經過設計規劃。
更多的資訊
的 LSA 維護的 SID 快取,網域成員電腦上。此快取會儲存 Sid] 和 [使用者名稱之間的對應。如果 SID 資訊存在於本機快取,LSA 就會傳回快取的使用者名稱資訊,而非檢查是否已變更的使用者名稱。
本機的 SID 快取可以降低網域控制站的工作負載和網路流量。不過,本機快取和網域控制站之間的不一致可能會發生。
本機的 SID 快取可以降低網域控制站的工作負載和網路流量。不過,本機快取和網域控制站之間的不一致可能會發生。
參考
TechNet 有涵蓋 Sid 名稱解析方法,包括此快取的詳細的說明的文章︰
http://technet.microsoft.com/en-us/library/ff428139(WS.10).aspx
如需有關LsaLookupSids函式,請造訪下列 Microsoft 網站︰
http://technet.microsoft.com/en-us/library/ff428139(WS.10).aspx
如需有關LsaLookupSids函式,請造訪下列 Microsoft 網站︰
留言
https://stackoverflow.com/questions/168946/iis-returning-old-user-names-to-my-application
可能有關係