以编程方式提升流程特权?
我正在尝试使用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则不会。希望能帮助到你。