授权) (模拟级别

SECURITY_IMPERSONATION_LEVEL枚举定义了四个模拟级别,用于确定服务器可以在客户端上下文中执行的操作。

模拟级别 说明
SecurityAnonymous 服务器无法模拟或标识客户端。
SecurityIdentification 服务器可以获取客户端的标识和特权,但不能模拟客户端。
SecurityImpersonation 服务器可以在本地系统上模拟客户端的安全上下文。
SecurityDelegation 服务器可以在远程系统上模拟客户端的安全上下文。

 

命名管道、RPC 或 DDE 连接的客户端可以控制模拟级别。 例如,命名管道客户端可以调用 CreateFile 函数以打开命名管道的句柄并指定服务器的模拟级别。

当命名管道、RPC 或 DDE 连接是远程连接时,将忽略传递给 CreateFile 以设置模拟级别的标志。 在这种情况下,客户端的模拟级别由服务器启用的模拟级别确定,该级别由目录服务中的服务器帐户上的标志设置。 例如,如果为服务器启用了委派,则客户端的模拟级别也将设置为委派,即使传递给 CreateFile 的标志指定了标识模拟级别。

DDE 客户端使用具有 SECURITY_QUALITY_OF_SERVICE 结构的 DdeSetQualityOfService 函数来指定模拟级别。 SecurityImpersonation 级别是命名管道、RPC 和 DDE 服务器的默认值。 ImpersonateSelfDuplicateTokenDuplicateTokenEx 函数允许调用方指定模拟级别。 使用 GetTokenInformation 函数检索 访问令牌的模拟级别。

在 SecurityImpersonation 级别,线程的大多数操作发生在线程模拟令牌的安全上下文中,而不是发生在拥有线程的进程的主令牌中。 例如,如果模拟线程打开安全对象,则系统会使用模拟令牌来检查线程的访问。 同样,如果模拟线程创建新对象(例如通过调用 CreateFile 函数),则新对象的所有者是客户端 访问令牌的默认所有者。

但是,在以下情况下,系统使用进程的主令牌,而不是调用线程的模拟令牌:

  • 如果模拟线程调用 CreateProcess 函数,则新进程始终继承进程的主标记。
  • 对于需要 SE_TCB_NAME 特权的函数(例如 LogonUser 函数),系统始终检查进程主令牌中的特权。
  • 对于需要SE_AUDIT_NAME特权的函数(例如 ObjectOpenAuditAlarm 函数),系统始终检查进程主令牌中的特权。
  • 在调用 OpenThreadToken 函数时,线程可以指定函数是使用模拟令牌还是主令牌来确定是否授予请求的访问权限。