Я нашел пример кода в кодовом проекте , который допускает олицетворение пользователя.
Этот код работает путем импорта следующих неуправляемых функций 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
.
Очевидно, что человек, который написал эту статью, понимает это лучше, чем я, поэтому может показаться, что я что-то упустил. Могу ли я получить объяснение того, почему требуется, по-видимому, избыточный шаг дублирования токена этого процесса?