1

最近我一直在处理 windows LogonUser API。LogonUser api 根据传递给 API 的 dwLogonType 返回不同的令牌。该文件提到:

• 该函数返回一个模拟令牌,而不是主令牌。您不能直接在 CreateProcessAsUser 函数中使用此令牌。但是,您可以调用 DuplicateTokenEx 函数将令牌转换为主令牌,然后在 CreateProcessAsUser 中使用它。

• 如果将令牌转换为主令牌并在 CreateProcessAsUser 中使用它来启动进程,则新进程无法通过重定向器访问其他网络资源,例如远程服务器或打印机。一个例外是,如果网络资源不受访问控制,那么新进程将能够访问它。

我对不同的令牌类型完全感到困惑。我想了解什么是不同的 Windows 令牌类型以及它们有何不同?

4

1 回答 1

2

从历史上看(如 17 年前):

如果在服务器 B 上以用户 U 身份运行的进程想要以同一用户身份连接到服务器 C,则服务器之间的身份验证协议要求服务器 B 知道用户 U 的密码。

如果用户 U 在服务器 B 上登录,这不是问题(用户必须输入密码)。

但是,假设用户 U 实际上在客户端 A 上登录并连接到服务器 B(可能是邮件服务器)。然后服务器 B 可以安全地确定它确实是用户 U 连接,但服务器 B 永远不会看到 U 的密码,因此它无法代表 U 连接到服务器 C。

这种区别自然会产生两种用户代币:

  • 代表“真正”登录并可以连接到其他网络资源的用户的主令牌。
  • 一个模拟令牌,代表实际登录到另一台计算机的经过身份验证的用户,因此该令牌不能用于访问其他网络资源(因为操作系统不知道密码,这是服务器间身份验证协议所要求的)。

回到今天,事情变得更加复杂,例如,Kerberos 身份验证支持跨多个服务器的委派,但除非您明确启用此功能,否则上述相同的限制仍然适用。

回到您的问题,您提到的限制仅在您要求LOGON32_LOGON_NETWORK令牌时适用。正如文档所说,这是不需要访问其他网络资源的网络服务器的快速登录;如果您确实需要此访问权限,请选择不同的登录类型。

为了进一步阅读,这篇文章已经过时,但确实涵盖了各种模拟和委托选项。

于 2012-02-05T15:45:35.853 回答