模拟级别 (授权)
SECURITY_IMPERSONATION_LEVEL枚举定义四个模拟级别,用于确定服务器可以在客户端上下文中执行的操作。
模拟级别 | 说明 |
---|---|
SecurityAnonymous | 服务器无法模拟或标识客户端。 |
SecurityIdentification | 服务器可以获取客户端的标识和特权,但无法模拟客户端。 |
SecurityImpersonation | 服务器可以模拟本地系统上客户端的安全上下文。 |
SecurityDelegation | 服务器可以在远程系统上模拟客户端的安全上下文。 |
命名管道、RPC 或 DDE 连接的客户端可以控制模拟级别。 例如,命名管道客户端可以调用 CreateFile 函数以打开命名管道的句柄并指定服务器的模拟级别。
当命名管道、RPC 或 DDE 连接是远程的时,将忽略传递给 CreateFile 以设置模拟级别的标志。 在这种情况下,客户端的模拟级别由服务器启用的模拟级别确定,该级别由目录服务中的服务器帐户上的标志设置。 例如,如果为委派启用了服务器,即使传递给 CreateFile 的标志指定标识模拟级别,客户端的模拟级别也会设置为委派。
DDE 客户端使用具有SECURITY_QUALITY_OF_SERVICE结构的 DdeSetQualityOfService 函数来指定模拟级别。 SecurityImpersonation 级别是命名管道、RPC 和 DDE 服务器的默认级别。 ImpersonateSelf、DuplicateToken 和 DuplicateTokenEx 函数允许调用方指定模拟级别。 使用 GetTokenInformation 函数检索 访问令牌的模拟级别。
在 SecurityImpersonation 级别,大多数线程的操作发生在线程模拟令牌的安全上下文中,而不是在拥有线程的进程的主令牌中。 例如,如果模拟线程打开 安全对象,系统将使用模拟令牌检查线程的访问。 同样,如果模拟线程创建一个新对象,例如通过调用 CreateFile 函数,则新对象的所有者是客户端 访问令牌中的默认所有者。
但是,系统在以下情况下使用进程的主令牌,而不是调用线程的模拟令牌:
- 如果模拟线程调用 CreateProcess 函数,则新进程始终继承进程的主要令牌。
- 对于需要SE_TCB_NAME特权(如 LogonUser 函数)的函数,系统始终检查进程主令牌中的特权。
- 对于需要SE_AUDIT_NAME特权(如 ObjectOpenAuditAlarm 函数)的函数,系统始终在进程的主令牌中检查特权。
- 在对 OpenThreadToken 函数的调用中,线程可以指定该函数是使用模拟令牌还是主令牌来确定是否授予请求的访问权限。