我想使用提升的特权但具有隐藏的窗口来启动子进程(实际上是同一控制台应用程序)。

接下来,我做:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    UseShellExecute = true, // !
    Verb = "runas",
};

var process = new Process
{
    StartInfo = info
};

process.Start();

这有效:
var identity = new WindowsPrincipal(WindowsIdentity.GetCurrent());
identity.IsInRole(WindowsBuiltInRole.Administrator); // returns true

但是UseShellExecute = true创建了一个新窗口,我也无法重定向输出。

所以当我下一步:
var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false, // !
    Verb = "runas"
};

var process = new Process
{
    EnableRaisingEvents = true,
    StartInfo = info
};

DataReceivedEventHandler actionWrite = (sender, e) =>
{
    Console.WriteLine(e.Data);
};

process.ErrorDataReceived += actionWrite;
process.OutputDataReceived += actionWrite;

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();

这不会提升特权,并且上面的代码返回false。为什么??

最佳答案

仅当进程由ShellExecuteEx()启动时,ProcessStartInfo.Verb才会生效。这需要UseShellExecute = true。仅当该进程由CreateProcess()启动时,才能重定向I/O和隐藏窗口。这需要UseShellExecute = false。

好吧,这就是为什么它不起作用的原因。不确定是否有意禁止绕过UAC的隐藏进程。大概。很有可能。

检查this Q+A中是否需要显示UAC高程提示的 list 。

关于c# - 提升权限不适用于UseShellExecute = false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3596259/

10-13 07:48