2014-01-12 6 views
4

При запуске bcdedit.exe из командной строки с повышенными правами вы можете увидеть значения текущих настроек BCD. Мне нужно прочитать настройки/значение «hypervisorlaunchtype»Любой способ программно получить значение/параметр из Bcedit.exe, используя .NET?

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. Я забыл упомянуть, что мне бы хотелось, чтобы он оставался скрытым от пользователя, поскольку я создаю для него графический интерфейс, и всегда мигает окно команды. =) Я обновил свой вопрос, чтобы отразить это. Кажется, что проблема связана с использованием значения «UseShellExecute». Любая идея об обходном пути? –

+1

@ J.ScottElblein вы пытались использовать 'ProcessStartInfo' и устанавливали' CreateNoWindow = true'? –

+0

Вы также можете попробовать следующее: p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; – Cosmin

Смежные вопросы