【问题标题】:How to use ProcessStartInfo to run at lowest execution level如何使用 ProcessStartInfo 以最低执行级别运行
【发布时间】:2011-05-10 15:22:45
【问题描述】:

我有一个使用 AsInvoker 清单运行的应用程序,它使用 ProcessStartInfo 运行另一个使用 HighestAvailable 清单的应用程序(在我的情况下,它以管理员身份运行,我得到 UAC 提示)第一个应用程序然后退出。

然后第二个应用程序使用ProcessStartInfo 再次运行第一个应用程序,这次它以管理员身份运行(没有 UAC 提示)我想这是正确的,因为它是 AsInvoker 并且它是从一个应用程序调用的以管理员身份运行,但我实际上希望它在没有管理员权限的情况下运行 - 或者更正确地以尽可能低的执行级别运行它

我知道你可以使用ProcessStartInfo.Verb = "runas" 来提升,但你可以下降吗?

【问题讨论】:

    标签: vb.net .net-4.0 process uac manifest


    【解决方案1】:

    不,你不能“退回去”(这个网站上有几个答案和外部教程声称不是这样,但它们在某些情况下都有问题,来自 MS 员工的this answer 确认是这种情况)

    您唯一真正的选择是使用可以启动未提升进程的 AsInvoker bootstrapper/parent 进程。 (如果引导程序启动提升,即使这也会失败,但在这些情况下,用户手动选择以管理员身份运行)

    【讨论】:

    • 忍不住想我们需要一个名为LowestAvailable的新关卡
    • @Matt:这意味着每个进程都需要为其知道的最低完整性令牌保留一个打开的句柄,并将其传递给它的子进程。但即使这样也会失败,因为 UAC 可以与不同的用户一起提升,然后根本不会有
    【解决方案2】:

    @Anders 说你不能让你自己的流程变平,这是正确的。但是 OP 询问是否从提升的进程启动非提升的进程。

    据 Aaron Margosis(也是微软员工,并不是说我在鄙视我的英雄拉里)that can be doneMVP has written Aaron 本机代码的托管包装器。

    小心使用。

    【讨论】:

    • 不,我不是在谈论您自己的进程,我也在谈论启动子进程。以 Aaron 的代码为例;如果 shell 没有运行,它会失败。此外,如果父进程用户与 shell 不同,您最终会以错误的用户身份运行(其中一个祖父进程是使用 runas.exe/CreateProcessAsUser 等启动的)
    • 好的,所以我们同意。最好的选择是一个非提升的进程,它会一直运行,并根据需要启动提升的/非提升的子进程。如果由于某种原因被拒绝的解决方案,还有其他解决方案,但它们并非在每种情况下都有效。但是,它们确实可以在安装程序可能运行的地方工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多