Поделиться через


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

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

Синтаксис

NTSYSAPI NTSTATUS ZwDuplicateToken(
  [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

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

Ценность Значение
УДАЛИТЬ Требуется для удаления объекта.
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 Rights for Access-Token Objects в пакете SDK для Windows. Обратите внимание, что маркеры доступа не поддерживают право SYNCHRONIZE.

[in] ObjectAttributes

Указатель на структуру OBJECT_ATTRIBUTES, описывающую запрошенные свойства нового маркера. Параметр ObjectAttributes является необязательным и может иметь значение NULL. Если параметр ObjectAttributes имеет значение NULL или если элемент securityDescriptor securityDescriptor, указывающий на параметр ObjectAttributes, то новый маркер получает дескриптор безопасности по умолчанию, а новый дескриптор маркера нельзя наследовать. В этом случае этот дескриптор безопасности по умолчанию создается из группы пользователей, основной группы и данных 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. В противном случае возвращается ZwDuplicateToken возвращается STATUS_BAD_IMPERSONATION_LEVEL.
TokenImpersonation Новый токен — это токен олицетворения. Если существующий токен является маркером олицетворения, запрошенный уровень олицетворения (как указано в параметре ObjectAttributes) нового маркера, не должен быть больше уровня олицетворения существующего маркера. В противном случае ZwDuplicateToken возвращает STATUS_BAD_IMPERSONATION_LEVEL.

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

[out] NewTokenHandle

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

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

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

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

Замечания

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

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

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

Сведения об аналоговом режиме пользователя ZwDuplicateTokenсм. в дубликатаTokenEx.

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

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

Для вызовов драйверов в режиме ядра NtXxx и ZwXxx версии подпрограммы Windows Native System Services могут вести себя по-разному в том, как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между NtXxx и ZwXxx версиями подпрограммы см. в разделе Using Nt and Zw Versions of the Native System Services Routines.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h, FltKernel.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
правил соответствия DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

См. также

ACCESS_MASK

InitializeObjectAttributes

OBJECT_ATTRIBUTES

SECURITY_IMPERSONATION_LEVEL