【问题标题】:launching SFC from within a C# app从 C# 应用程序中启动 SFC
【发布时间】:2013-11-20 03:47:14
【问题描述】:

我一直在寻找,但似乎无法完成这项工作。我正在尝试从 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");

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

【问题讨论】:

  • 添加到原评论中

标签: c# uac


【解决方案1】:

您的控制台没有提升,问题是您可以使用 Verb = "runas" 并使其提升,或者您可以使用 UseShellExecute = false 并重定向输出,您不能同时拥有两者。

您的三个选项是:

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

【讨论】:

  • 第二个应用程序,因为选项 1 或 2 都没有启动该进程。
  • 我不明白你想说什么。
  • 如果我没有说清楚,我很抱歉。我尝试了您在第一条评论中写的前 2 个选项,但他们没有启动该过程。由于 cmd.exe 没有运行,并且没有提示我提升我的权限。
  • 您为什么要尝试启动cmd.exe 而不仅仅是启动ProcessStartInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),"sfc.exe"), "/scannow")? (确保您在编译时设置为AnyCPU,以便获得正确的System32 文件夹),您是否尝试使用UseShellExecute = true; 并注释掉您的重定向代码?
  • 我希望显示命令窗口以便显示进度。
【解决方案2】:

尝试设置 ProcesStartInfo.UserName 和 ProcessStartInfo.Password 使用提升的凭据模拟新进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多