Получить олицетворенное имя пользователя - PullRequest
5 голосов
/ 01 марта 2011

У меня есть класс, которому нужно знать имя пользователя, который в данный момент действует.Environment.UserName или WindowsIdentity.GetCurrent().Name для этого.Но когда олицетворение включено, они возвращают LocalUser имя, а не ImpersonatedUser имя.

Как получить имя пользователя, выдавшего себя в настоящее время?

Приложение - консольное приложение C #, я знаю, чтоолицетворение действует, так как я получаю привилегии ImpersonatedUser.Конечно, я могу заставить код олицетворения сохранить олицетворенное имя пользователя в некоторой глобальной переменной, но это будет неправильно.

ОБНОВЛЕНИЕ:

Код олицетворения:

if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS/*=9*/, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
  if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
  {
    WindowsIdentity tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
    _impersonationContext = tempWindowsIdentity.Impersonate();

    // WindowsIdentity.GetCurrent().Name equals "LocalUser" 
    // while userName equals "ImpersonatedUser"
    ...

У меня есть контроль над кодом олицетворения, но я бы предпочел сохранить его независимым от других частей решения.

Ответы [ 2 ]

6 голосов
/ 01 марта 2011

Только это (член экземпляра)

WindowsIdentity.Name

http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx

Вам даже не нужно было вызывать Impersonate ().

EDIT

Без доступа или знаний о подражании

WindowsIdentity.GetCurrent(false).Name
(same as)
WindowsIdentity.GetCurrent().Name

должен работать.http://msdn.microsoft.com/en-us/library/x22bbxz6.aspx

false, чтобы возвратить WindowsIdentity потока, если он олицетворяет, или WindowsIdentity процесса, если поток в настоящее время не олицетворяет.


Если вы использовали LOGON32_LOGON_NEW_CREDENTIALS, имейте в виду, что (http://www.pcreview.co.uk/forums/logonuser-issues-t1385578.html) зарегистрированный контекст остается неизменным, пока создается второй токен для удаленных ресурсов - вот почему ваш WindowsIdentity.Name остается неизменным - фактически он по-прежнему корректен,поскольку вы не на самом деле олицетворяли удостоверение, все, что у вас есть, - это токен для доступа к ресурсам в качестве вторичного удостоверения, в то время как вся программа / поток все еще работает под original Идентификацией Windows.
3 голосов
/ 01 марта 2011

Хорошо, похоже, что проблема была в типе входа в систему обезличивания свойств.

Если в коде обезличивания заменить LOGON32_LOGON_NEW_CREDENTIALS (9) на LOGON32_LOGON_INTERACTIVE (2), все работает нормально - WindowsIdentity.GetCurrent().Name и Environment.UserName оба возвращают ImpersonatedUser, как и ожидалось.

...