最近我一直在处理Windows LogonUser API。 LogonUser api根据传递给API的dwLogonType返回不同的令牌。该文件提到:
•该函数返回模拟令牌,而不是主令牌。您 不能直接在CreateProcessAsUser函数中使用此标记。 但是,您可以调用DuplicateTokenEx函数来转换 令牌到主令牌,然后在CreateProcessAsUser中使用它。
•如果您将令牌转换为主令牌并在其中使用它 CreateProcessAsUser启动一个进程,新进程无法访问 其他网络资源,如远程服务器或打印机,通过 重定向器。例外情况是,如果网络资源不是 访问受控,然后新进程将能够访问它。
我对不同的令牌类型感到困惑。我想了解什么是不同的Windows令牌类型以及它们有何不同?
答案 0 :(得分:2)
历史上(如17年前):
如果作为用户U在服务器B上运行的进程想要以同一用户身份连接到服务器C,则服务器之间的身份验证协议要求服务器B知道用户U的密码。
如果用户U在服务器B上登录,则这不是问题(用户必须输入密码)。
但是,假设用户U实际上是在客户端A上登录并且正在连接到服务器B(可能是邮件服务器)。然后服务器B可以安全地确定它确实是用户U连接,但服务器B从未看到U的密码,因此它无法代表U连接到服务器C.
这种区别自然会产生两种用户标记:
回到今天,事情变得更加复杂,例如,Kerberos身份验证支持跨多个服务器的委派,但除非您明确启用此功能,否则上述相同的限制仍然适用。
回到你的问题,你提到的限制只适用于你要求LOGON32_LOGON_NETWORK
令牌的情况。正如文档所说,这是一个快速登录网络服务器,不需要访问其他网络资源;如果确实需要此访问权限,请选择其他登录类型。
如需进一步阅读,this article已过期,但涵盖了各种假冒和授权选项。