DuplicateTokenEx

【勇芳软件工作室】汉化HomePreviousNext

[New - Windows NT]

DuplicateTokenEx函数创建一个新的访问令牌,它与现有令牌重复。此函数可以创建主令牌或模拟令牌。

BOOL DuplicateTokenEx(

HANDLE 【hExistingToken】,//处理令牌以复制
DWORD 【dwDesiredAccess】,//新令牌的访问权限
LPSECURITY_ATTRIBUTES 【lpTokenAttributes】,//新令牌的安全属性
SECURITY_IMPERSONATION_LEVEL 【ImpersonationLevel】,//新的令牌的模拟级别
TOKEN_TYPE 【TokenType】,//主要或假冒令牌
PHANDLE 【phNewToken】//处理复制的令牌
); 

参数

【hExistingToken】

标识使用TOKEN_DUPLICATE访问权限打开的访问令牌。

【dwDesiredAccess】

指定新令牌的请求的访问权限。DuplicateTokenEx功能将请求的访问权限与现有令牌的自由访问控制列表(ACL)进行比较,以确定哪些权限被授予或拒绝。要请求与现有令牌相同的访问权限,请指定零。要请求对呼叫者有效的所有访问权限,请指定MAXIMUM_ALLOWED。否则,指定以下访问权限的组合。

含义
TOKEN_ADJUST_DEFAULT需要更改访问令牌的默认ACL,主组或所有者。
TOKEN_ADJUST_GROUPS需要更改访问令牌中指定的组。
TOKEN_ADJUST_PRIVILEGES需要更改访问令牌中指定的权限。
TOKEN_ALL_ACCESS结合STANDARD_RIGHTS_REQUIRED标准访问权限和令牌的所有个人访问权限。
TOKEN_ASSIGN_PRIMARY除了SE_CREATE_TOKEN_NAME权限之外,还需要将主令牌附加到进程。
TOKEN_DUPLICATE需要复制访问令牌。
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访问权限。

【lpTokenAttributes】

指向SECURITY_ATTRIBUTES结构的指针,指定新令牌的安全描述符,并确定子进程是否可以继承令牌。如果【lpTokenAttributes】为NULL,则该令牌将获得默认的安全描述符,并且该句柄不能被继承。

【ImpersonationLevel】

指定SECURITY_IMPERSONATION_LEVEL枚举中指示新令牌的模拟级别的值。

【TokenType】

TOKEN_TYPE枚举中指定以下值之一。

含义
TokenPrimary新令牌是您可以在CreateProcessAsUser函数中使用的主要令牌。
TokenImpersonation新令牌是一个模拟令牌。

【phNewToken】

指向接收新令牌的HANDLE变量的指针。

返回值

如果函数成功,则返回值为非零值。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

备注

DuplicateTokenEx功能允许您创建可在CreateProcessAsUser功能中使用的主令牌。这允许正在冒充客户机的服务器应用程序创建具有客户机安全上下文的进程。请注意,DuplicateToken功能只能创建模拟令牌,这对CreateProcessAsUser无效。

以下是使用DuplicateTokenEx创建主令牌的典型场景。服务器应用程序创建一个调用其中一个模拟功能的线程,例如ImpersonateNamedPipeClient来模拟客户端。模拟线程然后调用OpenThreadToken函数来获取自己的令牌,这是一个具有客户端安全上下文的【假冒令牌】.线程在调用DuplicateTokenEx中指定此模拟令牌,指定了TokenPrimary标志。DuplicateTokenEx创建一个具有客户端安全上下文的【主令牌】.

完成使用新的令牌后,调用CloseHandle功能关闭令牌句柄。

也可以看看

CloseHandle, CreateProcessAsUser, DdeImpersonateClient, DuplicateToken, ImpersonateNamedPipeClient, OpenThreadToken, RevertToSelf, RpcImpersonateClient, SECURITY_ATTRIBUTES, SECURITY_IMPERSONATION_LEVEL