Общий процесс выглядит следующим образом:

  1. Получить маркер учетной записи, который вы хотите заимствовать.
  2. Воспользоваться методом WindowsIdentity.Impersonate() для запуска заимствования прав. Этот метод вернет объект WindowsImpersonationContext.
  3. Вызвать метод Undo() объекта WindowsImpersonationContext, чтобы вернуться к исходной личности пользователя.

Получение маркера

Получить маркер учетной записи можно двумя основными способами. Наиболее распространенный подход — извлечь маркер текущего аутентифицированного пользователя. Вы можете добраться к нему через текущий контекст безопасности, используя свойство WindowsIdentity.Token. Маркеры представлены в .NET как объекты IntPtr, которые являются представлениями указателей на неуправляемые участки памяти. Однако вам никогда не придется взаимодействовать с ними напрямую. В место этого вам нужно просто передать маркер методу WindowsIdentity.Impersonate().

Вот пример извлечения маркера текущего пользователя:

IntPtr token = ((WindowsIdentity)User.Identity).Token;

Единственный альтернативный способ получения маркера — это программная регистрация со специфическим именем пользователя и паролем. К сожалению, .NET не предоставляет управляемых классов для регистрации пользователя. Вместо этого вы должны использовать функцию LogonUser() из неуправляемого API-интерфейса безопасности Win32.

Чтобы использовать функцию LogonUser(), сначала вы должны ее объявить следующим образом:

[DllImport(@"c:\Windows\System32\advapi32.dll")]
public static extern bool LogonUser(string lpszUserName,
  string lpszDomain, string lpszPassword, int dwLogonType,
  int dwLogonProvider, out int phToken);

Как видите, функция LogonUser() находится в advapi32.dll. Она принимает имя пользователя, домен, пароль, тип регистрации и входные параметры поставщика регистрации наряду с выходным параметром, который позволяет получить доступ к маркеру в результате успешной регистрации. Имена параметров не важны. В данном примере используются некоторые зашифрованные имена из руководства по Windows API. Возвращаемый булевский результат указывает на успешность регистрации.

На заметку! Windows XP или более поздние операционные системы накладывают ограничения на применение пустых паролей для предотвращения сетевых атак. В результате этих ограничений вы не сможете использовать функцию LogonUser() для заимствования прав учетной записи с пустым паролем.

После импорта функции LogonUser() вы сможете применять ее в своем коде для регистрации пользователя, как показано ниже:

предыдущая    следующая страница    вначало главы    оглавление

922

Hosted by uCoz