以编程方式提升进程权限?

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

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

其中m_strInstallUtil是完全限定的path,EXE到“InstallUtil.exe”, strExePath是我的服务的完全合格的path/名称。

从提升的命令提示符运行命令行语法工作; 从我的应用程序运行(使用上面的代码)不。 我假设我正在处理一些进程提升问题,那么我将如何在升级状态下运行我的进程? 我需要看看这个ShellExecute吗?

这全部在Windows Vista上。 我正在运行VS2008debugging器中的进程升级到pipe理员权限。

我也试过设置startInfo.Verb = "runas"; 但似乎并没有解决问题。

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

 startInfo.Verb = "runas"; 

这将导致Windows的行为,就好像该进程已经从Explorer以“以pipe理员身份运行”菜单命令启动。

这意味着UAC提示将会出现,并且需要被用户确认:如果这是不希望的(例如,因为它会在漫长的过程中发生),则需要运行整个主机进程通过创build和embedded应用程序清单(UAC)来提高权限以要求'highestAvailable'执行级别:这将使您的应用程序启动后立即显示UAC提示,并使所有subprocess以提升的权限运行,而无需其他提示。

编辑:我看你刚刚编辑你的问题,说“runas”不适合你。 这真的很奇怪,因为它应该(并在我的几个生产应用程序)。 但是,通过embedded清单来要求父进程使用提升的权限运行,这肯定会起作用。

这段代码将上述所有内容放在一起,并使用pipe理权限重新启动当前的wpf应用程序:

 if (IsAdministrator() == false) { // Restart program and run as admin var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; ProcessStartInfo startInfo = new ProcessStartInfo(exeName); startInfo.Verb = "runas"; System.Diagnostics.Process.Start(startInfo); Application.Current.Shutdown(); return; } private static bool IsAdministrator() { WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } // To run as admin, alter exe manifest file after building. // Or create shortcut with "as admin" checked. // Or ShellExecute(C# Process.Start) can elevate - use verb "runas". // Or an elevate vbs script can launch programs as admin. // (does not work: "runas /user:admin" from cmd-line prompts for admin pass) 

更新:应用程序清单的方式是首选:

在Visual Studio中右键单击项目,添加新的应用程序清单文件,更改文件,使您具有requireAdministrator,如上所示。

原始方式的一个问题:如果将重新启动代码放在app.xaml.cs的OnStartup中,即使调用了Shutdown,仍可能会短暂地启动主窗口。 如果app.xaml.cs init没有运行,并且在某些竞争条件下它会执行此操作,那么我的主窗口会崩溃。

根据这篇文章 ,只有ShellExecute检查embedded式清单,并根据需要提示用户提升,而CreateProcess和其他API则不需要。 希望它有帮助。

 [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] 

这将做到没有UAC – 没有必要开始一个新的过程。 如果正在运行的用户是我的情况pipe理组memeber。

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

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

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