从C#应用程序中启动SFC

时间:2013-11-20 03:47:15

标签: c# uac

我一直在寻找,似乎无法完成这项工作。我试图从C#应用程序中的按钮启动SFC。我知道它需要提升权利,我想要做的就是我想要的行为。

我试过了: To run cmd as administrator along with command? Running CMD as administrator with an argument from C#C# how to run a process(with arguments) through an administrator elevated cmd

我上次尝试的代码是:

private void button6_Click(object sender, EventArgs e)
    {
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + "processNeedToRun")
        {
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
            Verb = "runas"
        };

    }

我要么在所有cmd窗口闪烁时都没有启动进程,说明凭据不正确或命令不正确。

我做错了什么?

根据添加的评论,我将其更改为:

private void button6_Click(object sender, EventArgs e)
    {
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + "sfc.exe /scannow")
        {
            RedirectStandardError = false,
            RedirectStandardOutput = false,
            UseShellExecute = true,
            CreateNoWindow = false,
            Verb = "runas"
        };

    }

且没有变化

编辑:

所以我设法找到了解决方案:

我创建了一个新的控制台应用,编辑了清单以要求管理员执行此操作

Process.Start("CMD.exe", " /c SFC /Scannow");

这确实有我想要的行为。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您的控制台没有提升,问题是您可以使用Verb = "runas"并提升它,也可以使用UseShellExecute = false并重定向输出, 您不能拥有两个 即可。

您的三个选择是:

  1. 使用UseShellExecute = true并停用重定向
  2. Add a manifest file到您的程序中,以便它在启动时作为管理员提升自身,然后又可以启动管理进程并对其进行监控。
  3. 通过编写具有始终以管理员身份运行的清单文件的第二个exe来执行两者的组合。然后让您的第一个程序使用Verb = "runas"启动第二个程序,然后让您的第二个程序以SFC开始UseShellExecute = false。然后,您的第二个程序通过某种形式的IPC(WCF over named pipes可能是最简单的)将输出转发给第一个未显示给用户的非高速程序。

答案 1 :(得分:0)

尝试设置 ProcesStartInfo.UserNameProcessStartInfo.Password使用提升的凭据模拟新流程。

相关问题