Vb.net 如何使用ProcessStartInfo以最低执行级别运行

Vb.net 如何使用ProcessStartInfo以最低执行级别运行,vb.net,.net-4.0,process,uac,manifest,Vb.net,.net 4.0,Process,Uac,Manifest,我有一个应用程序使用AsInvokermanifest运行,它使用ProcessStartInfo运行另一个应用程序,该应用程序使用HighestAvailablemanifest(在我的情况下,它作为管理员运行,我得到UAC提示),第一个应用程序然后退出 然后,第二个应用程序使用ProcessStartInfo再次运行第一个应用程序,这次它以管理员身份运行(无UAC提示)。我想这是正确的,因为它是AsInvoker,正在从以管理员身份运行的应用程序调用它,但我实际上希望它在没有管理员权限的情况

我有一个应用程序使用
AsInvoker
manifest运行,它使用
ProcessStartInfo
运行另一个应用程序,该应用程序使用
HighestAvailable
manifest(在我的情况下,它作为管理员运行,我得到UAC提示),第一个应用程序然后退出

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

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

不,你不能“向下走”(本网站和外部教程中有一些答案声称不是这样,但它们在某些情况下都有问题,微软员工证实了这一点)


您唯一的实际选择是使用AsInvoker/父进程,该进程可以启动不相关的进程。(如果提升启动程序,即使这样也会失败,但在这种情况下,用户手动选择以管理员身份运行)

@Anders说,您不能将自己的进程降级,这是正确的。但是OP询问的是如何从一个提升的流程启动一个非提升的流程

根据亚伦·马戈西斯(也是微软的一名员工,我不是在反对我心目中的英雄拉里)。Aaron本机代码的托管包装器


小心使用。

不禁会想,我们需要一个新的级别,名为
lowstavailable
@Matt:这意味着每个进程都需要保持一个开放的句柄,以保持它知道的最低完整性令牌,并将其传递给它的子进程。但即使这样也会失败,因为UAC可以使用不同的用户升级,这样就不会有<高IL令牌。不,我不是说你自己的进程,我是说启动子进程。以亚伦的密码为例;如果shell未运行,则会失败。另外,如果父进程用户与shell不同,那么您最终将以错误的用户身份运行(其中一个祖辈进程是用runas.exe/CreateProcessAsUser等启动的)好的,因此我们同意。最佳匹配是一个非提升进程,它会一直运行,并根据需要启动提升/非提升子进程。如果由于某种原因,该解决方案被拒绝,那么还有其他解决方案,但它们并不适用于所有场景。然而,它们确实可以在安装人员可能遇到的环境中工作。