Есть ли более быстрый способ получить System.Environment.UserName? - PullRequest
2 голосов
/ 29 июля 2010

System.Environment.UserName внутренне вызывает

[DllImport ("advapi32.dll", CharSet = CharSet.Auto)] внутреннее статическое внешнее bool GetUserName (StringBuilder lpBuffer, ref int nSize);

Кажется, что каждый вызов поражает AD, поэтому задержка сети и запрос AD влияют на скорость выполнения.

Знаете ли вы, если есть лучший способ получить это значение?

Может быть, что-то вроде кэшированного SID где-то в теме? Поэтому я мог читать UserName & SID и кэшировать их локально (на время выполнения) и запрашивать только System.Environment.UserName, когда я получу новый SID (или что-то в этом роде).

Спасибо

Ответы [ 3 ]

1 голос
/ 29 июля 2010

Извлекает WindowsIdentity пользователя.Свойство Name извлекает домен \ имя и имя пользователя. Значение SID.

System.Security.Principal.WindowsIdentity.GetCurrent()
0 голосов
/ 29 июля 2010

Код ниже, кажется, добивается цели.

Сначала получите текущий участник в потоке, если он еще не установлен. каждый раз, когда вы просто используете его, он добавляет небольшие издержки к самому потоку, но не вызывает 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;
0 голосов
/ 29 июля 2010

Я не знаю, подходит ли это вам, но возможно:

System.Environment.GetEnvironmentVariable("username");        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...