从提升后的脚本中以有限用户身份启动进程

7
我有一个运行一些.bat文件的提升控制台。以提升模式运行此控制台是必要的,这样它可以执行一些任务,例如管理网络共享等,无需请求权限。但有时脚本还需要启动一些不希望在提升模式下运行的应用程序。因此,我们希望我们的提升批处理以非提升模式启动某些应用程序。在Windows上有内置的方法可以做到这一点吗?截至目前,进程是使用DOS命令START启动的。
顺便说一句,这台机器是Windows 7 Ultimate Edition x64。
我知道这个问题已经在许多问题中以编程方式讨论过了(这里收集了许多问题),但我们的要求是在cmd上运行的.bat脚本和任何可帮助完成任务的独立可执行文件,如nircmd、7z等。
澄清一下:我们已经有一个计划任务,可以启动提升控制台,提升控制台不是这个答案的问题。

顺便说一下,我已经阅读了这篇文章,并且似乎是目前最好的解决方案。但我很乐意听取其他人的想法。 - Áxel Costas Pena
1
我认为PsExec可能是您最简单和最直接的解决方案。 - Bill_Stewart
2个回答

10

内置 Windows 方式START RUNAS ... 允许您以受限用户身份运行进程。以下是一个示例:

runas /trustlevel:0x20000 cmd.exe

无论如何,通过这种方式执行的进程与启用UAC的UI中启动的其他进程(即从文件浏览器或开始菜单中启动的explorer.exe)之间存在一些内部差异。

  • 在通过runas(右侧)启动的进程中,我们缺少禁用的某些权限: Process Explorer screenshot showing execution permissions differences
  • 在通过runas(右侧)启动的进程中,管理员对该进程设置了一些权限: Process Explorer screenshot showing differences on user permissions over the processes

第三方应用程序方法:我们可以使用PSExec来实现我们的目标,这是一个独立的可执行文件,我们可以从Windows Sysinternals的PSTools中找到。以下是一个示例:

psexec -l -d cmd.exe

我已经深入研究了这个问题,发现在任何运行权限或安全标志方面都没有区别。

来自Microsoft Technet博客

PsExec使用CreateRestrictedToken API创建一个安全上下文,称为令牌,它是其自身的精简版本,去除了管理特权和组成员身份。生成类似于Windows分配给标准用户的令牌后,Process Explorer调用CreateProcessAsUser以新令牌启动目标进程。

这些是我在多小时的研究后得出的最佳结论;欢迎提供进一步细节的任何人。



1

这真的不是我的专业领域,但是 START RUNAS ... 或者 AT 是否符合要求呢?


不错的想法。我已经尝试了'runas /trustlevel:0x20000 cmd.exe'。最终它可以工作,尽管我发现了很多我不喜欢的东西:首先,在尝试执行程序时,它会在%path%目录中查找它,但它不会扫描注册表中的应用程序路径,因此例如"cmd"可以工作,但"iexplore"不能。我还发现了在这种方式下启动它与从UI启动时的进程执行权限的差异。我将深入研究并回来得出结论。 - Áxel Costas Pena
我会通过编辑您的答案来发布完整的答案,这样您就可以获得功劳。谢谢您的帮助。 - Áxel Costas Pena
1
@Áxel,你的解决方案比Peter的原始解决方案更加详细。你应该将其发布为新答案。 - madth3
嗨@madth3,我猜测您被要求对此进行同行评审并拒绝了它。好吧,在某些情况下并不清楚最佳做法是什么,我会选择这种方式,因为我的答案包括“runas”,我发现这个选项是由PeterWright提供的。 - Áxel Costas Pena

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