一些 Windows API 返回一个主令牌,一些返回一个模拟令牌。一些 API 需要主令牌,而其他 API 需要模拟令牌。
例如,LogonUser
通常返回一个主令牌,除非LOGON32_LOGON_NETWORK
用作登录类型 ( dwLogonType
):
在大多数情况下,返回的句柄是您可以在调用 CreateProcessAsUser 函数时使用的主要标记。但是,如果您指定 LOGON32_LOGON_NETWORK 标志,LogonUser 会返回一个模拟令牌,除非您调用 DuplicateTokenEx 将其转换为主令牌,否则您无法在 CreateProcessAsUser 中使用该令牌。
SetThreadToken
需要一个模拟令牌,而ImpersonateLoggedOnUser
这似乎做几乎相同的事情需要任何一个。
CreateProcessAsUser
并且CreateProcessWithTokenW
两者都需要主令牌,并且都注意到可以通过调用从模拟令牌中获取主令牌DuplicateTokenEx
,但是令牌类型是什么意思?
词汇表是这样说的:
访问令牌包含登录会话的安全信息。当用户登录时,系统会创建一个访问令牌,并且代表用户执行的每个进程都有一个令牌副本。令牌标识用户、用户的组和用户的权限。系统使用令牌来控制对安全对象的访问,并控制用户在本地计算机上执行各种与系统相关的操作的能力。有两种访问令牌,主要的和模拟的。
通常仅由 Windows 内核创建的访问令牌。它可以分配给一个进程来表示该进程的默认安全信息。
为捕获客户端进程的安全信息而创建的访问令牌,允许服务器在安全操作中“模拟”客户端进程。
但这并不完全有用。似乎有人想使用像“内核”这样的大字眼,但这只会引发更多问题,例如主令牌还可以用于什么(除了分配给进程)以及除了内核之外还有谁可以创建访问权限代币?
(他们的意思是微软认为内核只是在内核模式下运行的一部分,还有执行程序等。还是他们的意思是用户模式代码也可以创建令牌?无论如何,即使用户-模式代码可以创建令牌,它必须通过系统调用来完成,就像任何对象管理器对象一样,所以无论如何令牌实际上都是在内核模式下创建的。)
无论如何,这并没有回答基本问题:令牌类型之间有什么区别?不是它们的用途或它们通常是如何创建的。