Функция NtDuplicateToken (ntifs.h)

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

Синтаксис

__kernel_entry NTSYSCALLAPI NTSTATUS NtDuplicateToken(
  [in]  HANDLE             ExistingTokenHandle,
  [in]  ACCESS_MASK        DesiredAccess,
  [in]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in]  BOOLEAN            EffectiveOnly,
  [in]  TOKEN_TYPE         TokenType,
  [out] PHANDLE            NewTokenHandle
);

Параметры

[in] ExistingTokenHandle

Дескриптор существующего маркера доступа, который был открыт с TOKEN_DUPLICATE права доступа. Этот параметр является обязательным и не может иметь значение NULL.

[in] DesiredAccess

Битовая маска, указывающая запрошенные права доступа для нового маркера. NtDuplicateToken сравнивает запрошенные права доступа с существующим списком управления доступом (DACL) маркера, чтобы определить, какие права предоставляются или запрещаются новому маркеру. Чтобы запросить те же права доступа, что и у существующего маркера, укажите ноль. Чтобы запросить все права доступа, действительные для вызывающей стороны, укажите MAXIMUM_ALLOWED. Этот параметр является необязательным и может быть равен нулю, MAXIMUM_ALLOWED или побитовой комбинации ИЛИ из одного или нескольких следующих значений:

Значение Значение
DELETE Требуется для удаления объекта .
READ_CONTROL Требуется для чтения DACL и сведений о владельце для объекта. Сведения о доступе к списку управления доступом системы (SACL) см. в разделе ACCESS_SYSTEM_SECURITY далее в этой таблице.
WRITE_DAC Требуется для изменения сведений DACL для объекта .
WRITE_OWNER Требуется для изменения сведений о владельцах в дескрипторове безопасности объекта (SECURITY_DESCRIPTOR).
ACCESS_SYSTEM_SECURITY Требуется для получения или задания saCL в ACL объекта. Операционная система предоставляет это право новому маркеру только в том случае, если в маркере доступа вызывающего потока включена привилегия SE_SECURITY_NAME.
STANDARD_RIGHTS_READ В настоящее время определено как равное READ_CONTROL.
STANDARD_RIGHTS_WRITE В настоящее время определено как равное READ_CONTROL.
STANDARD_RIGHTS_EXECUTE В настоящее время определено как равное READ_CONTROL.
STANDARD_RIGHTS_REQUIRED Объединяет delete, READ_CONTROL, WRITE_DAC и доступ к WRITE_OWNER.
STANDARD_RIGHTS_ALL Объединяет доступ DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER и SYNCHRONIZE. Однако значение SYNCHRONIZE неприменимо к объектам токена. Таким образом, STANDARD_RIGHTS_ALL функционально эквивалентен STANDARD_RIGHTS_REQUIRED.
TOKEN_ADJUST_DEFAULT Требуется для изменения владельца по умолчанию, основной группы или DACL маркера доступа.
TOKEN_ADJUST_GROUPS Требуется для настройки атрибутов групп в маркере доступа.
TOKEN_ADJUST_PRIVILEGES Требуется для включения или отключения привилегий в маркере доступа.
TOKEN_ADJUST_SESSIONID Требуется для настройки идентификатора сеанса (SID) маркера доступа. Операционная система предоставляет это право новому маркеру, только если в маркере доступа вызывающего потока включена привилегия SE_TCB_NAME.
TOKEN_ASSIGN_PRIMARY Требуется для присоединения основного маркера к процессу. Операционная система предоставляет это право новому маркеру, только если в маркере доступа вызывающего потока включена привилегия SE_ASSIGNPRIMARYTOKEN_NAME.
TOKEN_DUPLICATE Требуется для дублирования маркера доступа. Обратите внимание, что данный токен ExistingTokenHandle должен содержать это право для успешного использования этой процедуры.
TOKEN_EXECUTE Объединяет STANDARD_RIGHTS_EXECUTE и TOKEN_IMPERSONATE.
TOKEN_IMPERSONATE Требуется для присоединения маркера доступа олицетворения к процессу.
TOKEN_QUERY Требуется для запроса маркера доступа.
TOKEN_QUERY_SOURCE Требуется для запроса источника маркера доступа.
TOKEN_READ Объединяет STANDARD_RIGHTS_READ и TOKEN_QUERY.
TOKEN_WRITE Объединяет STANDARD_RIGHTS_WRITE, TOKEN_ADJUST_PRIVILEGES, TOKEN_ADJUST_GROUPS и TOKEN_ADJUST_DEFAULT.
TOKEN_ALL_ACCESS Объединяет все возможные разрешения доступа к маркеру для маркера.

Дополнительные сведения см. в разделе Права доступа к объектам Access-Token. Обратите внимание, что маркеры доступа не поддерживают право SYNCHRONIZE.

[in] ObjectAttributes

Указатель на структуру OBJECT_ATTRIBUTES , описывающую запрошенные свойства для нового маркера. Параметр ObjectAttributes является необязательным и может иметь значение NULL. Если параметр ObjectAttributes имеет значение NULL или элемент SecurityDescriptor структуры, на который указывает параметр ObjectAttributes , равен NULL, новый маркер получает дескриптор безопасности по умолчанию и новый дескриптор маркера не может быть унаследован. В этом случае этот дескриптор безопасности по умолчанию создается на основе сведений о группе пользователей, основной группе и daCL, которые хранятся в токене вызывающего объекта.

Если для параметра TokenType задано значение TokenImpersonation:

  • Параметр ObjectAttributes можно использовать для указания уровня олицетворения нового токена. Это можно сделать, задав objectAttributes-SecurityQualityOfService.ImpersonationLevel >соответствующее значение перечисления SECURITY_IMPERSONATION_LEVEL. Дополнительные сведения см. в разделе SECURITY_QUALITY_OF_SERVICE.
  • Если существующий маркер является маркером олицетворения, а параметр ObjectAttributes не предоставляет сведений об олицетворении, уровень олицетворения нового маркера устанавливается на уровень олицетворения существующего маркера.
  • Если существующий маркер является основным и сведения об уровне олицетворения не предоставляются, новый маркер олицетворения будет иметь SECURITY_IMPERSONATION_LEVEL уровень олицетворения.

[in] EffectiveOnly

Логическое значение, указывающее, следует ли дублировать весь существующий маркер в новый маркер или только действивную (в настоящее время включенную) часть маркера. Если задано значение TRUE, дублируются только включенные в данный момент части исходного маркера. Если задано значение FALSE, весь существующий маркер будет дублирован. Это позволяет вызывающей стороны защищенной подсистемы ограничить, какие необязательные группы и привилегии становятся доступными для защищенной подсистемы. Например, если effectiveOnly имеет значение TRUE, вызывающий объект может дублировать маркер, но удалить группу Администраторы и право SeTcbPrivilege. Полученный маркер затем может быть передан дочернему процессу (CreateProcessAsUser), что ограничит возможности дочернего процесса. Это обязательный параметр.

[in] TokenType

Задает одно из следующих значений перечисления TOKEN_TYPE .

Значение Значение
TokenPrimary Новый маркер является основным. Если существующий маркер является маркером олицетворения, существующий маркер олицетворения должен иметь уровень олицетворения (как указано в параметре ObjectAttributes ) объекта SecurityImpersonation или SecurityDelegation. В противном случае NtDuplicateToken возвращает STATUS_BAD_IMPERSONATION_LEVEL возвращается.
TokenImpersonation Новый маркер является токеном олицетворения. Если существующий маркер является токеном олицетворения, запрошенный уровень олицетворения (как указано в параметре ObjectAttributes ) нового маркера не должен превышать уровень олицетворения существующего маркера. В противном случае NtDuplicateToken возвращает STATUS_BAD_IMPERSONATION_LEVEL.

Параметр TokenType является обязательным и не может иметь значение NULL.

[out] NewTokenHandle

Указатель на выделенную вызывающей переменной типа HANDLE, которая получает дескриптор нового токена. Этот параметр является обязательным и не может иметь значение NULL.

Возвращаемое значение

NtDuplicateToken возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные коды возврата ошибок:

Код возврата Описание
STATUS_ACCESS_VIOLATION Произошло нарушение доступа к памяти. Например, если предыдущий режим был пользовательским и была предоставлена недопустимая память в пользовательском режиме, NtDuplicateToken возвращает STATUS_ACCESS_VIOLATION.
STATUS_INSUFFICIENT_RESOURCES Не удалось выделить достаточный объем памяти для дублирования нового маркера.
STATUS_INVALID_PARAMETER Обнаружен недопустимый параметр.
STATUS_BAD_IMPERSONATION_LEVEL Запрошенный уровень олицетворения для нового маркера больше, чем уровень олицетворения существующего маркера.
STATUS_ACCESS_DENIED NtDuplicateToken не удалось получить доступ к ExistingTokenHandle. Это произойдет, если существующий маркер не имеет права доступа к TOKEN_DUPLICATE.
STATUS_INVALID_HANDLE ExistingTokenHandle означает недопустимый дескриптор.

Комментарии

Если параметр ObjectAttributes не предоставил сведения об уровне олицетворения, для нового маркера будет использоваться уровень олицетворения существующего маркера.

Что касается структуры, на которую указывает необязательный параметр ObjectAttributes , то элемент SecurityQualityOfServiceOBJECT_ATTRIBUTES указывает на структуру типа SECURITY_QUALITY_OF_SERVICE. Сведения о членах этой структуры см. в разделе SECURITY_QUALITY_OF_SERVICE .

Элемент SecurityQualityOfService должен быть задан после вызова макроса InitializeObjectAttributes , так как InitializeObjectAttributes в настоящее время присваивает securityQualityOfService значение NULL.

Сведения об аналоге NtDuplicateToken в пользовательском режиме см. в разделе DuplicateTokenEx документации по Windows SDK.

Завершив использование нового маркера, вызовите функцию NtClose , чтобы закрыть дескриптор маркера.

Если вызов функции NtDuplicateToken выполняется в пользовательском режиме, следует использовать имя "NtDuplicateToken" вместо "NtDuplicateToken".

Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы Собственные системные службы Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями подпрограмм NtXxx и ZwXxx см. в разделе Использование версий NT и Zw подпрограмм собственных системных служб.

Требования

Требование Значение
Минимальная версия клиента Windows 2000
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h, FltKernel.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs, PowerIrpDDis

См. также раздел

ACCESS_MASK

InitializeObjectAttributes

OBJECT_ATTRIBUTES

SECURITY_IMPERSONATION_LEVEL