我正在尝试从提升的进程创建中等或低完整性进程。我知道还有其他类似的问题,但他们主要关注使用资源管理器或任务计划程序等解决方法,我想坚持使用CreateRestrictedToken()
+ CreateProcessAsUser()
。
我认为一定有可能以某种方式做到这一点,因为我相信 UAC 在您登录时会这样做,但我无法让令牌中的所有内容看起来像正常的 UAC Medium IL 令牌。
您可以通过创建令牌CreateRestrictedToken(hThisProcessToken, LUA_TOKEN, ...)
然后设置TokenOwner
,TokenDefaultDacl
并TokenIntegrityLevel
在调用之前获得 80% CreateProcessAsUser()
。
剩下的问题是TokenVirtualizationAllowed
、TokenVirtualizationEnabled
、TokenElevation
和where失败TokenElevationType
并出现 ERROR_PRIVILEGE_NOT_HELD 或 ERROR_INVALID_PARAMETER。TokenMandatoryPolicy
SetTokenInformation()
如果我以 SYSTEM @ SECURITY_MANDATORY_SYSTEM_RID 的身份运行并启用所有权限,而不是管理员 @ SECURITY_MANDATORY_HIGH_RID,那么我可以设置TokenMandatoryPolicy
,TokenVirtualization*
但设置TokenElevation*
仍然失败!(目前仅在 Windows 8 上测试过)
令牌中没有正确的TokenElevation*
值是一个大问题,因为 Internet Explorer 无法在保护模式下启动,因为它认为令牌已被提升。
的文档SetTokenInformation()
没有说明可以设置哪些项目TOKEN_INFORMATION_CLASS
以及需要哪些权限(如果有),我不明白为什么不允许您将这些设置为与实际完整性级别 ( TokenIntegrityLevel
)匹配的较低安全值令牌。
使用Safer API创建SAFER_LEVELID_NORMALUSER
令牌并不能解决任何这些问题,而且还会创建一个比普通的 Medium IL 令牌更受限制的令牌。
我发现有人在早期的 Vista/Longhorn 时代遇到了类似的问题,从那以后没有任何变化吗?