【发布时间】:2013-12-13 13:54:54
【问题描述】:
我们有一个附加清单和选项“level="requireAdministrator" 的程序。 在标准用户(不是管理员)下启动程序后,它会升级为管理员用户,从那一刻起 SHGetFolderPath(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,@buf)) 返回管理员本地目录,而不是用户最初启动的位置。 当然,我们可以将标准用户令牌作为第三个参数传递给 SHGetFolderPath,但是我们如何在提升的程序中获取它呢? 有什么办法吗?
当然,由于这个问题,我们还有另一个问题。如何使用 ShellExecute 启动另一个程序而不是提升程序中的管理员?当然我们可以使用 CreateProcessWithTokenW 但仍然存在令牌问题(如何获取此令牌)。 现在我们正在寻找 IShellDispatch2 接口并尝试以管理员身份使用资源管理器启动应用程序,但有些事情告诉我这是错误的方式。
我知道我们必须以标准用户身份启动程序,然后使用 com 对象只提升应该以管理员权限执行的部分代码。但是,主要问题仍然是令牌。
还有一个想法是使用“level="asInvoker" 制作清单并以标准用户身份启动第一个程序,检测所有本地用户路径并将其作为参数传递给带有 runas 和 SEE_MASK_NOCLOSEPROCESS 选项的 ShellExecuteEx 并运行相同的程序,但作为admin。提升的程序退出后,我们可以以管理员身份执行非提升程序中的任何程序。这是正确的方式吗?
【问题讨论】:
标签: token uac shellexecute