有没有一种使用.NET编程从Bcdedit.exe获取值/设置的方法?

4
当在管理员命令提示符中运行bcdedit.exe时,您可以查看当前BCD设置的值。我需要读取hypervisorlaunchtype的设置/值。
有人知道如何做到这一点吗?我试图将管道输出写入一个临时文件以进行解析,但由于bcdedit.exe需要从提升的提示符中运行,所以遇到了管道输出问题。也许有更好的方法?
编辑:我忘记了添加我的要求:如有可能,我希望能够在不让最终用户看到命令提示符(即甚至不会出现快速闪烁)的情况下完成此操作。

您是在尝试从没有管理员权限的应用程序中获取这些值吗? - MarcinJuraszek
我可以用任何方式来做,哪种方式最有效就用哪种。 - J. Scott Elblein
我想你应该可以使用 Process.StandardOutput - Raphael Smit
1个回答

2

首先,以管理员身份运行您的Visual Studio,并在控制台应用程序中尝试运行此代码(使用调试运行应用程序):

    static void Main(string[] args)
    {

        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.FileName = @"CMD.EXE";
        p.StartInfo.Arguments = @"/C bcdedit";
        p.Start();
        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

        // parse the output
        var lines = output.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).Where(l => l.Length > 24);
        foreach (var line in lines)
        {
            var key = line.Substring(0, 24).Replace(" ", string.Empty);
            var value = line.Substring(24).Replace(" ", string.Empty);
            Console.WriteLine(key + ":" + value);
        }
        Console.ReadLine();
    }

然而,有一个问题。如果你想在从高级 Visual Studio 以外启动应用程序时使其正常工作,则需要配置你的应用程序请求提升的权限:

在你的项目上,点击添加新项并选择应用程序清单文件。

打开 app.manifest 文件并替换这一行:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

使用这个:
<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

谢谢,这个很好用,但是在读取BCDedit.exe的信息时会闪烁命令提示符。我忘了提到我希望它对用户保持隐藏,因为我正在为它制作一种GUI,并且总是闪烁命令窗口很不好看。=)我更新了我的问题以反映这一点。似乎这与UseShellExecute的值的使用有关。有什么解决方法吗? - J. Scott Elblein
1
@J.ScottElblein 你尝试过使用ProcessStartInfo并将CreateNoWindow = true设置为true吗? - Pete Garafano
1
你也可以尝试这个:p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; - Cosmin Vană

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