c# - 以编程方式提升进程特权?

标签 c# .net windows windows-services process-elevation

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

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

其中 m_strInstallUtil 是“InstallUtil.exe”的完全限定路径和 exe,strExePath 是我的服务的完全限定路径/名称。

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

这都是在 Windows Vista 上进行的。我在提升为管理员权限的 VS2008 调试器中运行该进程。

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

最佳答案

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

startInfo.Verb = "runas";

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

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

编辑:我看到您刚刚编辑了您的问题以声明“runas”不适合您。这真的很奇怪,因为它应该(并且在几个生产应用程序中对我来说确实如此)。不过,通过嵌入 list 要求父进程以提升的权限运行应该绝对可行。

关于c# - 以编程方式提升进程特权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/133379/

相关文章:

c# - 如何避免为实现相同接口(interface)的类编写重复的单元测试?

c# - 在属性中指定 T

c++ - 如何将 hwnd 类型数据存储到平面文件中并将其返回到 hwnd 类型变量中?

c++ - 使用Windows API创建快捷方式.lnk

C# 将泛型函数作为参数传递

C# - 读取以句点结尾的目录

c# - WPF/XAML 中 Canvas 中的可重复形状

C#:如何在尝试从另一个程序集中使用设置变量之前确保其存在?

c# - WCF RESTful 服务不接受 JSON 输入

c# - C# 中的共享点编程