Получить имя пользователя Windows - разные методы
В .NET существует несколько способов получить текущее имя пользователя Windows. Три из них:
string name = WindowsIdentity.GetCurrent().Name;
или
string name = Thread.CurrentPrincipal.Identity.Name;
или
string name = Environment.UserName;
В чем разница и почему вы выбираете один метод над другим?
Есть ли другие способы?
Ответы
Ответ 1
Environment.UserName вызывает GetUserName в файле advapi32.dll. Это означает, что если вы выдаете себя за другого пользователя, это свойство будет отражать это.
Thread.CurrentPrincipal имеет сеттер и может быть изменен программно. (Это не олицетворение кстати.)
WindowsIdentity - это ваш текущий идентификатор Windows, если он есть. Он не обязательно будет отражать пользователя, подумайте о ASP.NET с помощью FormsAuthentication. Тогда WindowsIdentity будет NT-службой, но FormsIdentity будет зарегистрированным пользователем. Там также PassportIdentity, и вы можете создавать свои собственные вещи, чтобы усложнять ситуацию.
Ответ 2
Вы попросили альтернативные способы.
Конечно, вы всегда можете использовать собственный API Windows: GetUserName.
Ответ 3
Я считаю, что свойство было помещено в несколько мест, так что программисту было бы легче найти. Там только один зарегистрированный пользователь и только одно соответствующее имя.
Ответ 4
Три метода описаны ниже:
HttpContext = HttpContext.Current.User, который возвращает объект IPrincipal, содержащий информацию о безопасности для текущего веб-запроса. Это аутентифицированный веб-клиент.
WindowsIdentity = WindowsIdentity.GetCurrent(), который возвращает идентификатор контекста безопасности текущего исполняемого потока Win32.
Thread = Thread.CurrentPrincipal, который возвращает принципалу текущего исполняемого потока .NET, который перемещается поверх потока Win32.
И они меняются в зависимости от конфигурации IIS, как описано в этой статье:
http://msdn.microsoft.com/en-us/library/aa302377.aspx