【问题标题】:How to capture "Root Path" into a variable如何将“根路径”捕获到变量中
【发布时间】:2018-11-01 00:29:04
【问题描述】:

我正在尝试为提升的CMD 运行logman.exe,对于我尝试过的以下代码,

 var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = @"C:\Windows\System32\cmd.exe",
                Arguments = "cmd /k logman.exe PerfCounterCustom  | findstr \"Root\"",
                Verb = "runas",
                UseShellExecute = true,
            }
        };

        try
        {
            proc.Start();
            while (!proc.StandardOutput.EndOfStream)
            {
                string line = proc.StandardOutput.ReadLine();
            }
            Console.WriteLine("Successfully elevated!");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

它会给出错误输出,例如,

System.InvalidOperationException: StandardOut has not been redirected or the process hasn't started yet. at System.Diagnostics.Process.get_StandardOutput()

2 个问题,

  1. 当我运行应用程序 exe 时,它显示 2 个 CMD 窗口,第一个显示错误,第二个显示参数 "cmd /k logman.exe PerfCounterCustom | findstr \"Root\"" [根路径] 的结果

如何禁用同时显示两个窗口?

  1. 为什么会出现此错误?

【问题讨论】:

  • 为什么不直接打电话给logman呢?为什么要调用 cmd.exe?
  • 使用UseShellExecute = true,您正在使用shell (cmd) 运行您的命令。你的命令启动了另一个 shell,所以你有 2 个窗口。
  • 感谢@Evk,有没有办法将第二个窗口(根路径)的结果放入变量中?我想我需要将此输出移动到第一个窗口,但我无法做到
  • 我认为你根本不需要任何外壳。只需单独运行 logman 命令(甚至不使用 findstr),不使用 shell,然后手动解析它的重定向输出。
  • 我的问题,我需要提升它以运行 logman 命令,这就是为什么我以管理员身份打开其他 shell

标签: c# cmd process elevated-privileges


【解决方案1】:

第一个问题:在ProcessStartInfo 中将WindowStyle 设置为ProcessWindowStyle.Hidden

【讨论】:

    【解决方案2】:

    读取命令输出的另一种解决方案是将输出写入文本文件。因此,您必须在命令末尾添加>> "[Name or Path of file].txt"。然后只需从 C# 读取文件,例如与File.ReadAllLines。 这里需要考虑两件事: 如果您在运行时经常这样做,并且该命令提供了大量文本,请不要将其写入 SSD。 请检查文件是否为空/之前不存在,因为 Windows 只是将输出附加到文件末尾。如果您在多个线程中运行它,请在文件名中使用线程标识符。

    【讨论】:

    【解决方案3】:

    您必须将ProcessStartInfoRedirectStandardOutput 设置为true,并且您必须在读取输出之前运行proc.WaitForExit()。 请注意,此解决方案会导致与通过 runas 以管理员身份运行进程不兼容。

    【讨论】:

    • 如果UseShellExecute = true,,那么我不允许将RedirectStandardOutput设置为true
    • 出现异常 - System.InvalidOperationException: Process 对象必须将 UseShellExecute 属性设置为 false 才能重定向 IO 流。
    • 是的,这与以管理员身份开始不兼容,下周我回到家,有一些解决方法,希望能够帮助你。
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多