如何从管理员进程中以当前用户权限运行进程

3

当一个安装程序(比如Inno Setup)启动一个进程时,该进程总是以管理员权限运行。这是因为安装程序已经以管理员身份运行。

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


1
注意:我建议使用Larry Osterman的答案,因为他在微软公司开发Windows(请参阅他的博客http://blogs.msdn.com/b/larryosterman/)。由于Bradley指出的代码是一个临时解决方案,它可能随时停止工作。 - Alberto Martinez
3个回答

13

这个问题在微软公司内部每3到4个月就会出现一次。

安全团队给出的答案是:你做不到。当创建高权限进程令牌时,对令牌进行了无法撤销的更改。

你最好的选择是拥有一个启动器应用程序,运行你的高权限设置程序,然后当高权限设置程序完成后,再运行你的子进程。


我一遍又一遍地告诉人们这件事,但他们从未听取。终于有人来自微软站出来说话了。 - Anders
嘿,这是来自Larry Osterman本人的回答!被接受的解决方案看起来有点像一个临时应急措施,这证实了这一点。不相关的话题:当Raymond Chen的博客帖子队列达到两年时,如果你能说服他在这里回答问题,那也会很好 :-)。 - Alberto Martinez
完全离题,但他的队列已经超过2年了 :). - Larry Osterman

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

-1

虽然这不被认为是最佳实践(甚至不是好的实践),但从高/管理员IL进程启动中等IL进程是可能的:

请参阅codeproject上的此帖子

我可以确认,这段代码在启用和禁用UAC的Vista 32位和64位系统上都可以正常工作。


4
这可能有多种失败情况:A)资源管理器未运行。B)资源管理器已提升权限。C)资源管理器作为另一个用户运行,因为使用了辅助登录服务(也称为runas):Explorer.exe=User1,cmd.exe(或其他一些进程)=User2(由runas启动的cmd.exe,这是您想要的用户)。YourElevated.exe=(管理员)User3。 - Anders
@Anders 尽管这不是百分之百可靠的解决方案,但可以相对安全地假设安装程序(即原始问题的上下文)将以交互方式运行,确保 A 为 true。在绝大多数环境中,C 都是正确的。如果您所说的这3种情况之一为真,那么向用户提出升级提示也并非不合理。 - Bradley Smith
@Bradley Smith:另一种情况是系统太混乱了,必须在安全模式下使用命令行启动(损坏的Shell扩展或恶意软件导致Shell不停地崩溃)。那时,唯一的进程将是cmd.exe、添加/删除程序和卸载程序。 - Anders
3
简短评论:永远不要假设安装程序正在交互式运行,这样做会让你成为全世界系统管理员的眼中钉。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接