Win32 олицетворение пользователя - PullRequest
8 голосов
/ 15 мая 2011

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

Этот код работает путем импорта следующих неуправляемых функций Win32 API:

[DllImport("advapi32.dll", SetLastError = true)]
private static extern int LogonUser(
    string lpszUserName,
    string lpszDomain,
    string lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int DuplicateToken(IntPtr hToken,int impersonationLevel,ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);

Эти функции используются для олицетворения целевого пользователя, затем выполнения некоторых операций и возврата контекста олицетворения. Олицетворение пользователя достигается следующим образом:

if ( LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT, ref token ) != 0 )
{
    if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 )
    {
        tempWindowsIdentity = new WindowsIdentity( tokenDuplicate );
        impersonationContext = tempWindowsIdentity.Impersonate();
    }
}

Я пытаюсь понять, почему этот код сначала получает требуемый токен, используя LogonUser, затем дублирует этот токен, прежде чем выполнять олицетворение на дублированном токене. Почему бы просто не подражать, используя токен, полученный из метода LogonUser.

Очевидно, что человек, который написал эту статью, понимает это лучше, чем я, поэтому может показаться, что я что-то упустил. Могу ли я получить объяснение того, почему требуется, по-видимому, избыточный шаг дублирования токена этого процесса?

1 Ответ

7 голосов
/ 15 мая 2011

Насколько я знаю, токен, передаваемый в WindowsIdentity ctor, должен быть токоном олицетворения . Итак, автор этого кода использует

DuplicateToken( token, 2, ref tokenDuplicate )

для создания токена олицетворения из первичного токена , возвращаемого LogonUser (). Это магическое число «2» обозначает члена SecurityImpersonation перечисления SECURITY_IMPERSONATION_LEVEL.

Ссылки:

http://msdn.microsoft.com/en-us/library/aa378184%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/aa379572%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/aa446616%28v=vs.85%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...