有没有更快的方法来检索System.Environment.UserName?

时间:2010-07-29 13:32:38

标签: .net winapi

System.Environment.UserName在内部调用

[DllImport(“advapi32.dll”,CharSet = CharSet.Auto)] 内部静态extern bool GetUserName(StringBuilder lpBuffer,ref int nSize);

每次通话似乎都会达到AD,因此网络延迟和AD查询会影响执行速度。

您是否知道是否有更好的方法来检索此值?

线程上某处的缓存SID可能是什么? 所以我可以阅读UserName& SID并在本地缓存这些(在执行时)并且只在我获得新的SID(或沿着这些行的某些内容)时查询System.Environment.UserName。

谢谢,

3 个答案:

答案 0 :(得分:1)

检索用户的WindowsIdentity。 Name属性检索Domain \ Name和User.Value SID。

System.Security.Principal.WindowsIdentity.GetCurrent()

答案 1 :(得分:0)

我不知道这是否符合您的需求,但也许:

System.Environment.GetEnvironmentVariable("username");        

答案 2 :(得分: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;