2014-01-12 26 views
4

从提升的命令提示符运行bcdedit.exe时,可以看到当前BCD设置的值。我需要阅读“hypervisorlaunchtype任何使用.NET以编程方式从Bcedit.exe获取值/设置的方法?

Screenshot

有谁知道一个办法做到这一点的设置/值?

我试图写管道输出到一个tmp文件,以便我可以解析它,但由于事实bcdedit.exe需要从提升的提示运行,因此遇到管道输出问题。也许有更好的方法?

编辑:我忘了补充一点,我希望能够在最终用户完全看不到命令​​提示符(即使不是快速闪烁)的情况下执行此操作。

+0

你试图从不与管理员权限运行的应用程序获得这些价值? – MarcinJuraszek

+0

我可以做到这一点,无论哪种方式最好。 –

+0

我想你可以使用[Process.StandardOutput](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v = vs.110).aspx ) –

回答

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" /> 
+0

谢谢,这个工程很好,但它从BCDedit.exe读取信息时闪烁命令提示符。我忘了提及我希望它对用户保持隐藏,因为我正在为它做一个GUI,并且总是闪烁命令窗口是icky。 =)我更新了我的问题以反映这一点。这似乎是使用UseShellExecute值的问题。有关解决方法的任何想法? –

+1

@ J.ScottElblein您是否尝试过使用'ProcessStartInfo'并设置'CreateNoWindow = true'? –

+0

你也可以试试这个:p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; – Cosmin

相关问题