【问题标题】:How to run a process as current user privilege from an admin process如何从管理进程以当前用户权限运行进程
【发布时间】:2010-10-15 05:35:06
【问题描述】:

当安装程序(由 Inno Setup 等构建)启动进程时,该进程始终以管理员权限运行。 - 因为安装程序已经以管理员身份运行。

我想以当前用户的权限运行子进程。
有什么好办法吗?

【问题讨论】:

  • 注意:我建议使用 Larry Osterman 的答案,因为他在 MS 开发 Windows(请参阅他的博客 blogs.msdn.com/b/larryosterman)。由于 Bradley 指出的代码是杂乱无章的(正如他所指出的那样),它可能随时停止工作。

标签: windows winapi windows-vista manifest windows-security


【解决方案1】:

这个问题在 MSFT 内部每 3 或 4 个月出现一次。

安全人员给出的答案是:你不能。创建提升的进程令牌时,对令牌所做的更改无法撤消。

最好的办法是拥有一个启动器应用程序来运行提升的安装程序,然后在提升的安装程序完成后转身运行您的子进程。

【讨论】:

  • 我一遍又一遍地告诉人们这件事,但他们从不听。终于有人从 MS 说话了。
  • 嘿,来自拉里奥斯特曼本人的回答!接受的解决方案看起来有点像一个杂物,这证实了它。无关:如果您能说服 Raymond Chen 在他的博客帖子队列达到两年时在这里回答问题,那也很好:-)。
  • 完全跑题了,但他的队列在这一点上已经超过 2 年了 :)。
【解决方案2】:

作为启动器,您可以使用便携式 powershell 应用程序部署工具包 (Link)。即使您以管理员身份启动了 powershell 应用程序部署工具包,您也可以编辑 deploy-application.ps1 并使用 Execute-ProcessAsUser 与当前用户一起运行应用程序/脚本

【讨论】:

    【解决方案3】:

    虽然这不是最佳实践(甚至不是良好实践),但可以从高级/管理员 IL 进程启动中级 IL 进程:

    See this post on codeproject

    我可以确认此代码在启用和不启用 UAC 的 Vista 32 和 64 位上均有效。

    【讨论】:

    • 这可能会以多种方式失败:A)Explorer 未运行。 B)Explorer 被提升。 C)Explorer 以不同的用户身份运行,因为使用了辅助登录服务又名 runas:Explorer.exe=User1,cmd.exe(或其他一些进程)=User2(由 runas 启动的 cmd.exe,这是您想要的用户) YourElevated.exe=(Admin)User3
    • @Anders 虽然这不是一个万无一失的解决方案,但假设安装程序(如在原始问题的上下文中)将以交互方式运行是相对安全的;确保 A 为真。 C 在绝大多数环境中都是正确的。如果您所说的 3 种情况中的任何一种情况属实,我相信向用户显示海拔提示并非不合理。
    • @Bradley Smith:另一种情况;系统非常混乱,必须使用命令行以安全模式启动(损坏的外壳扩展程序或不断使外壳崩溃的恶意软件)然后唯一的进程将是 cmd.exe、添加/删除程序和卸载程序。跨度>
    • 只是一个简短的评论 - 假设 setupo 程序以交互方式运行是永远安全的。这样做会让你成为全球系统管理员的祸根。
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2011-11-29
    • 2017-03-28
    • 2016-09-29
    • 2011-06-06
    • 2012-06-25
    相关资源
    最近更新 更多