C # .Net может получить доступ к командам bcdboot через Process () - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь скопировать файлы UEFI на SD-карту, и я пытаюсь использовать Process для выполнения большинства задач, которые мне нужно сделать, чтобы это работало, но кажется, что команда bcdboot работает при использовании той же команды в окне CMD, нокогда вы открываете cmd.exe через процесс и даете ему ту же команду, что она не работает, я попробовал все возможное, я думаю, и не могу заставить его работать: (

код -:

            string[] bcdArgs = new string[3];
            bcdArgs[0] = "bcdboot " + @"i:\windows /s p: /f UEFI";

            Process cmd = new Process();
            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.Verb = "runas";
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            cmd.StartInfo.UseShellExecute = true;
            cmd.StartInfo.RedirectStandardOutput = false;
            cmd.EnableRaisingEvents = true;

            foreach (string arg in bcdArgs)
            {
                cmd.StartInfo.Arguments += arg;
            }

            cmd.Start();

            //Console.WriteLine(cmd.StandardOutput.ReadToEnd());

            cmd.WaitForExit();

            if (cmd.HasExited)
            {
                signWindowsFiles();
            }

Ответы [ 3 ]

0 голосов
/ 20 июня 2018

Вы используете cmd.exe bcdboot i:\windows /s p: /f UEFI, который не будет работать.Вам нужно добавить /c после cmd.exe.

С cmd.exe /?

Starts a new instance of the Windows command interpreter

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]    [[/S] [/C | /K] string]

-> /C      Carries out the command specified by string and then terminates
/K      Carries out the command specified by string but remains
/S      Modifies the treatment of string after /C or /K (see below)
/Q      Turns echo off
...

Модифицированный код:

        string[] bcdArgs = new string[3];
        bcdArgs[0] = "/c"; // cmd.exe args
        bcdArgs[1] = "bcdboot.exe " + @"i:\windows /s p: /f UEFI"; // bcdboot.exe

        Process cmd = new Process();
        cmd.StartInfo.FileName = "cmd.exe";
        cmd.StartInfo.Verb = "runas";
        cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        cmd.StartInfo.UseShellExecute = true;
        cmd.StartInfo.RedirectStandardOutput = false;
        cmd.EnableRaisingEvents = true;

        foreach (string arg in bcdArgs)
        {
            cmd.StartInfo.Arguments += arg + " "; // Adds a space after every argument
        }

        cmd.Start();

        //Console.WriteLine(cmd.StandardOutput.ReadToEnd());

        cmd.WaitForExit();

        if (cmd.HasExited)
        {
            signWindowsFiles();
        }

(КОД НЕПРОВЕРЕН, изменения приветствуются)

0 голосов
/ 03 июля 2018

Убедитесь, что вы используете полное имя файла.Вызовы% SystemRoot% (то есть: C: \ Windows \ System32) перенаправляются при запуске 32-разрядного процесса в 64-разрядных окнах.Вместо «C: \ Windows \ System32» вызов перенаправляется на «C: \ Windows \ SysWOW64».Необходимо переопределить это поведение с помощью «Sysnative» вместо «System32».

Вместо «C: \ Windows \ system32 \ diskpart.exe» используйте «C: \ Windows \ Sysnative \ diskpart.exe».

//Check if OS is 64-bit and this program is running
//as 32-bit.
//
//Note: For a 64-bit process, IntPtr.Size = 8
//      For a 32-bit process, IntPtr.Size = 4


string folderSys32Path = string.Empty;

//Windows folder (ex: C:\Windows)
string folderWinPath = Path.GetFullPath(Environment.GetEnvironmentVariable("SystemRoot"));

//get system32 folder path
if (System.Environment.Is64BitOperatingSystem && IntPtr.Size == 4)
{
    //using "Sysnative" in place of "System32"
    //ensures that the 64-bit "System32" folder is
    //used instead of "SysWOW64"
    folderSys32Path = Path.Combine(folderWinPath, "Sysnative");
}//if
else
{
    folderSys32Path = Path.Combine(folderWinPath, "System32");
}//else

Также может потребоватьсяиспользуйте файл манифеста приложения, указав, что он необходим для работы от имени администратора.

0 голосов
/ 28 мая 2018

Вы должны разделить ваши аргументы пробелами.Вместо:

foreach (string arg in bcdArgs)
{
    cmd.StartInfo.Arguments += arg;
}

Попробуйте:

cmd.StartInfo.Arguments = String.Join(" ", bcdArgs);

Кроме того, в соответствии с this , для некоторых параметров вам может потребоваться запуск с правами администратора.Так что, если это все еще не работает, попробуйте снова с правами администратора.

...