2008-09-25 67 views
114

我正在尝试使用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上。我正在将VS2008调试器中的进程提升为管理员权限。

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

回答

138

您可以指定新的过程应该提升的权限由您的StartInfo对象的动词属性设置为“运行方式”来启动,如下所示:

startInfo.Verb = "runas"; 

这将导致Windows行为,如果过程已经从Explorer以“以管理员身份运行”菜单命令启动。

这意味着UAC提示会出现并需要用户确认:如果这是不受欢迎的(例如,因为它会在漫长的过程中发生),则需要运行整个主机进程使用提升的权限Create and Embed an Application Manifest (UAC)来要求“最高可用”执行级别:这将使您的应用程序启动后立即显示UAC提示,并使所有子进程以提升的权限运行而无需额外的提示。

编辑:我看到你刚编辑你的问题,说“runas”不适合你。这真的很奇怪,因为它应该(并且适用于我的几个生产应用程序)。但是,通过嵌入清单来要求父级进程使用提升的权限运行,这绝对有用。

+6

“runas”也不适合我。可能是因为它只能在UAC关闭的情况下工作? – 2009-04-03 12:43:11

+0

它帮助我,我不知道这是否适用于所有的Windows操作系统? – 2012-04-17 14:04:49

+1

这似乎不适用于Windows 8.在以前的版本上工作良好。 – Despertar 2013-01-26 00:17:31

1

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

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

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

+21

你还没有说过如何获取accessToken。当启用UAC时,LogonUser将提供用户的受限安全上下文。 – cwa 2011-03-30 18:45:39

19

根据this article,只有ShellExecute检查嵌入式清单并在需要时提示用户提升,而CreateProcess和其他API则不提供。希望能帮助到你。

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

这将做到没有UAC - 不需要开始一个新的过程。如果正在运行的用户是我的情况下管理员组的成员。

34

这段代码放在上面一起,并重新启动与管理PRIVS当前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) 

更新:应用程序清单的方法是首选工作室,添加新的应用程序清单文件,更改文件,以便您按照上面所示设置requireAdministrator。

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

相关问题