Функция PsImpersonateClient (ntifs.h)
Подпрограмма PsImpersonateClient вызывает поток сервера для олицетворения клиента.
Синтаксис
NTSTATUS PsImpersonateClient(
[in, out] PETHREAD Thread,
[in] PACCESS_TOKEN Token,
[in] BOOLEAN CopyOnOpen,
[in] BOOLEAN EffectiveOnly,
[in] SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
Параметры
[in, out] Thread
Указатель на поток сервера для олицетворения клиента.
[in] Token
Указатель на маркер, назначаемый в качестве маркера олицетворения. Этот маркер может быть основным маркером или маркером олицетворения. Установите значение NULL , чтобы завершить олицетворение.
[in] CopyOnOpen
Указывает, можно ли открыть маркер напрямую. Задайте значение TRUE , чтобы указать, что маркер нельзя открыть напрямую. В этом случае маркер должен быть дублирован, а вместо него используется повторяющийся маркер. Задайте значение FALSE , чтобы разрешить открытие маркера напрямую.
[in] EffectiveOnly
Задайте значение FALSE , чтобы разрешить серверу включить группы и привилегии, которые в настоящее время отключены в контексте безопасности клиента. В противном случае — ЗНАЧЕНИЕ TRUE .
[in] ImpersonationLevel
Значение SECURITY_IMPERSONATION_LEVEL , указывающее уровень олицетворения, на котором сервер получает доступ к маркеру.
Возвращаемое значение
PsImpersonateClient возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например следующее:
Код возврата | Описание |
---|---|
|
Невозможно было олицетворить клиента из-за ограничений задания. |
|
Недостаточно памяти для завершения операции. |
Комментарии
PsImpersonateClient вызывает указанный поток сервера для олицетворения указанного клиента.
Поток сервера уже может олицетворять клиента при вызове PsImpersonateClient . В этом случае количество ссылок на маркер, представляющий этот клиент, уменьшается. Чтобы сохранить этот маркер для последующего использования, драйверы должны вызвать PsReferenceImpersonationToken перед вызовом PsImpersonateClient и сохранить указатель, возвращаемый PsReferenceImpersonationToken.
Чтобы завершить новое олицетворение и вернуть поток сервера в предыдущее олицетворение, вызовите PsImpersonateClient еще раз, передав сохраненный указатель для параметра Token . Чтобы завершить все олицетворения, вызовите подпрограмму PsRevertToSelf .
В противном случае, чтобы завершить олицетворение и вернуть поток сервера в исходный контекст безопасности (то есть в тот, который представлен его основным маркером), вызовите PsImpersonateClient еще раз, передав указатель NULL для параметра Token .
Подпрограмма PsImpersonateClient может не вернуть поток сервера в предыдущее олицетворение, если поток уже олицетворение или существуют ограничения задания.
Подпрограмма проверяет, может ли на самом деле происходить олицетворение клиента, проверяя различные условия, в том числе следующие:
- Маркер, переданный вызывающим абонентом, не имеет анонимного идентификатора проверки подлинности
- Маркер процесса, на который ссылается поток сервера, и заданный маркер имеют одинаковые идентификаторы безопасности (ИДЕНТИФИКАТОРЫ).
- Ни тот из маркеров не ограничен
Если ни одно из условий не выполняется, подпрограмма создает копию существующего маркера, переданного в вызов, и назначает только что скопированный маркер в качестве маркера олицетворения, хотя и с ограниченным уровнем олицетворения безопасности; то есть поток сервера может получить только сведения о клиенте. Если копирование маркеров невозможно, подпрограмма завершается сбоем с кодом NTSTATUS.
Крайне небезопасно повышать состояние привилегий потока недоверенного пользователя (например, взять поток пользователя и олицетворить LocalSystem). Если ненадежный поток пользователя имеет повышенные привилегии, пользователь может получить маркер потока после его повышения и подорвать безопасность всей системы.
В случаях, когда требуется более высокий уровень привилегий, задача должна быть отправлена в рабочую очередь, где задача может быть безопасно обработана системным рабочим потоком . Таким образом, не требуется олицетворение.
Подпрограмму SeImpersonateClientEx можно использовать для вызова потока для олицетворения пользователя.
Дополнительные сведения о безопасности и управлении доступом см. в статье Модель безопасности Windows для разработчиков драйверов и в документации по этим темам в windows SDK.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |