运行提升权限的进程

5
我将尝试使用以下代码运行cmd命令:

ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe");
cmd.RedirectStandardInput = true;
cmd.RedirectStandardOutput = true;
cmd.RedirectStandardError = true;
cmd.UseShellExecute = false;
cmd.CreateNoWindow = true;
cmd.WindowStyle = ProcessWindowStyle.Hidden;
Process exec = Process.Start(cmd);
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory());

该命令需要管理员权限,如果我以管理员身份运行cmd并键入该命令,则可以完美地运行,但在我以管理员方式运行此应用程序时却无法运行。 我已将
添加到一个清单文件中,每次打开exe文件都会提示UAC。
我看到了多个关于这个问题的问题,他们似乎都建议使用提升的应用程序运行的任何进程将具有相同的权限,但对我不起作用。
我已尝试过cmd.Verb = "runas"; 但无济于事。

尝试将 cmd.UseShellExecute 更改为 true 并保留 runas 动词。 - keyboardP
刚试了一下,但出现了这个错误:“必须将Process对象的UseShellExecute属性设置为false才能重定向IO流。”谢谢。 - Bali C
4
那就到此为止,你不能两全其美。UAC可以防止低权限进程劫持高权限进程的能力。唯一的解决方法是先提升自己的权限才能进行重定向。 - Hans Passant
2个回答

13

您需要将UseShellExecute 设置为 true,才能使Verb生效,并且必须将其设置为“false”以重定向标准输出。您不能同时进行两种操作。

我相信Windows不允许您在管理员/非管理员安全边界之间重定向标准输入/输出/错误。您必须找到另一种获取以管理员身份运行的程序输出的方法。

我没有阅读这篇文章,但它可能会为您提供更多信息:http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx


我尝试使用 UseShellExecute = false; Verb = "runas"; RedirectStandardInput = true; Domain = du[0]; UserName = UserAdministrator; Password = SecureStringHelper.ToSecureString(pwd); LoadUserProfile = true;并在清单中使用 requestedExecutionLevel。如果我使用 UseShellExecute = true; 我会得到错误消息:进程对象必须将 UseShellExecute 属性设置为 false 才能以用户身份启动进程。 - Kiquenet
以管理员身份运行的程序,有哪些不同的方法可以获取输出的完整样本? - Kiquenet

2

你是否尝试将管理员凭据分配给你的ProcessStartInfo对象?

SecureString password = new SecureString();
password.AppendChar('p');
password.AppendChar('w');
cmd.UserName = "admin";
cmd.Password = password;

我不能这样做,因为我需要UAC提示它们,因为它将用于多台电脑,谢谢。 - Bali C
好的,明白了。你能告诉我为什么要创建一个命令进程并将其定向执行“sc”,而不是直接运行“sc”命令吗? - Abbas
我正在尝试通过Winform上的按钮运行sc命令,因为用户不知道如何使用sc,这样可以让他们更轻松地使用程序。 - Bali C
我的问题是为什么你不直接运行'sc',即cmd.FileName =“cmd.exe”和cmd.Arguments = String.Format(“create \“BaliService\” binPath = \”{0}\BaliService.exe\“”,Directory.GetCurrentDirectory())。 - Abbas
@Abbas:这个解决方案在Win10之前对我有效,但现在当原始进程没有被提升时,新的进程将不会被提升。你有什么想法吗? - eFloh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接