以编程方式提升流程特权?

时间:2020-03-06 14:43:16  来源:igfitidea点击:

我正在尝试使用InstallUtil.exe安装服务,但通过Process.Start调用。这是代码:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

其中," m_strInstallUtil"是标准路径," exe"是" InstallUtil.exe",而" strExePath"是我的服务的标准路径/名称。

从提升的命令提示符下运行命令行语法是可行的;从我的应用程序运行(使用上面的代码)没有。我假设我正在处理一些流程提升问题,那么如何在提升的状态下运行流程?为此,我需要查看" ShellExecute"吗?

这一切都在Windows Vista上。我正在提升为admin特权的VS2008调试器中运行该过程。

我也尝试设置startInfo.Verb =" runas";,但这似乎并不能解决问题。

解决方案

我们应该使用模拟来提升状态。

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

完成后,不要忘记撤消模拟的上下文。

我们可以通过将startInfo对象的Verb属性设置为'runas'来指示应使用提升的权限来启动新进程,如下所示:

startInfo.Verb = "runas";

这将导致Windows的行为就像是使用"以管理员身份运行"菜单命令从资源管理器中启动了该过程一样。

这确实意味着将出现UAC提示,并且需要用户确认:如果这是不希望的(例如,因为它将在冗长的过程中发生),则需要使用通过创建和嵌入应用程序清单(UAC)来提升权限,以要求" highestAvailable"执行级别:这将导致UAC提示在应用程序启动后立即出现,并使所有子进程以提升的权限运行而无需其他提示。

编辑:我看到我们刚刚编辑了问题,以表明" runas"不适用于我们。确实很奇怪,因为它应该这样做(并且在几个生产应用程序中对我也是如此)。但是,通过嵌入清单来要求父进程以提升的权限运行,这绝对是可行的。

根据本文的介绍,只有ShellExecute会检查嵌入式清单,并在需要时提示用户进行提升,而CreateProcess和其他API则不会。希望能帮助到你。