2010-07-29 137 views
2

System.Environment.UserName內部調用有沒有更快的方法來檢索System.Environment.UserName?

[的DllImport( 「ADVAPI32.DLL」,字符集= CharSet.Auto)] 內部靜態的extern BOOL GetUserName(StringBuilder的lpBuffer,參考INT n大小);

每個調用似乎都會觸發AD,因此網絡延遲和AD查詢會影響執行速度。

你知道是否有更好的方法來檢索這個值?

線程上的某處可能是某個緩存的SID? 因此,我可以讀取用戶名& SID並在本地緩存這些(執行時),並且只有在獲取新SID(或沿着這些行)時才查詢System.Environment.UserName。

謝謝,

+0

只是一個想法,也許有一種方法迫使Windows服務器緩存來自AD的結果一段時間? – stic 2010-07-29 14:20:20

+0

也許我錯過了一些顯而易見的東西,但是爲什麼你在檢索一次後沒有自己緩存用戶名呢? – Blub 2010-07-29 16:10:25

+0

單身人士的詛咒:( 用戶名被放入每個日誌條目,其中我只有一個線程間共享的記錄器實例/遠程調用(模擬)等期間使用... – stic 2010-07-29 17:16:31

回答

0

代碼波紋管,似乎這樣的伎倆。

如果尚未設置,則首先在線程上獲取當前主體。下次每次只使用它時,會爲線程本身增加小的開銷,但不會每次都調用AD。

有什麼想法?

if (!System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated) 
    System.Threading.Thread.CurrentPrincipal = 
    new System.Security.Principal.WindowsPrincipal(
     System.Security.Principal.WindowsIdentity.GetCurrent()); 

userName = System.Threading.Thread.CurrentPrincipal.Identity.Name; 
1

檢索用戶的WindowsIdentity。 Name屬性檢索Domain \ Name和User.Value SID。

System.Security.Principal.WindowsIdentity.GetCurrent() 
+0

這一個是慢得多,需要創建WindowsIdentity,在內部調用KerbS4ULogon,並且在WinAPI的LSA區域上完成其他幾個調用後,使用LsaLogonUser完成 絕對重要 - 我正在尋找緩存在本地某處的東西 – stic 2010-07-29 14:03:34

0

我不知道這是否符合您的需要,但也許:

System.Environment.GetEnvironmentVariable("username");   
+1

您知道System.Environment.UserName的作用,你呢?:-) – stic 2010-07-29 14:05:22

+0

@stic:我知道它用於什麼。你能否詳細說明你對'System.Environment.UserName'的替代方法有什麼特殊要求? – 2010-07-29 14:17:56

+0

我認爲stic暗示'System.Environment.UserName'實際上調用'GetEnvironmentVariable'(但我不知道 - 我不知道關於.NET的一件事......)。 – 2010-07-29 16:11:13

相關問題