Запустите Sysprep.exe из программы на C#

Как я могу запустить sysprep.exe с конкретными аргументами из моей программы на C#?

 public void cmdPrint(string[] strcommmand)
    {
        Process cmd = new Process();

        cmd.StartInfo.FileName = "cmd.exe";
        cmd.StartInfo.RedirectStandardInput = true;
        cmd.StartInfo.RedirectStandardOutput = true;
        cmd.StartInfo.CreateNoWindow = true;
        cmd.StartInfo.UseShellExecute = false;
        cmd.Start();
        cmd.StandardInput.WriteLine("cd c:\\");

        foreach (string str in strcommmand)
        {
            cmd.StandardInput.WriteLine(str);

        }
        cmd.StandardInput.Flush();
        cmd.StandardInput.Close();
        writeLine(cmd.StandardOutput.ReadToEnd());

    }

и я звоню из моего приложения Windows Form,

string[] cmd = { "cd C:\\Windows\\System32\\Sysprep", "sysprep.exe /audit /reboot"};consoleBox1.cmdPrint(cmd);

Но, похоже, он не запускает sysprep.exe. Я вставил две команды в.bat и запустил его,

System.Diagnostics.Process.Start(Application.StartupPath + "\\awesome.bat");

но это тоже не работает (открывает черное окно и сразу закрывает)

Запуск bat-файла из проводника работает, так что я полагаю, что мне не хватает разрешения в моем приложении на C#.

В моем app.manifest,

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

Можно ли запустить sysprep? Мое приложение предназначено для работы в Windows 7,8,8.1 и 10 на обычном рабочем столе и в режиме аудита.

РЕДАКТИРОВАТЬ:

Я попробовал код без фулшинга и закрытия cmd, но программа перестала отвечать

var procInfo = new 
ProcessStartInfo("C:\\Windows\\System32\\Sysprep\\sysprep.exe");
                procInfo.Arguments = "/audit /reboot";
                var proc = new Process();
                proc.StartInfo = procInfo;
                proc.Start(); //Actually executes the process
                proc.WaitForExit();

Выдает ошибку:

Системе не удается найти указанный файл /nSystem.ComponentModel.Win32Exception (0x80004005): Системе не удается найти файл, указанный в System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) в System.Diagnostics.Process.Start() в Windows_SSDethod_hode_Dim_DoD_DIMD.btn_all_Click(Отправитель объекта, EventArgs e) в: строке 182/n/n Системе не удается найти указанный файл /nSystem.ComponentModel.Win32Exception (0x80004005): Системе не удается найти файл, указанный в System.Diagnostics.Process.StartWithShellExecuteEx (ProcessStartIn). startInfo) в System.Diagnostics.Process.Start() в Windows_SSD_Optimizer_Method_1.Method1.btn_all_Click(Отправитель объекта, EventArgs e) в строке 182/n/n

2 ответа

Решение

В Windows 8 x64 вы должны знать о перенаправлении файловой системы.

Когда 32-разрядное приложение хочет получить доступ к папке System32 в 64-разрядной ОС, Windows 8 по умолчанию использует любые пути к syswow64, полагая, что 32-разрядная программа действительно будет искать 32-разрядные файлы.

Попробуйте этот путь вместо этого:

@"c:\windows\sysnative\sysprep\sysprep.exe"

var procInfo = new ProcessStartInfo(@"c:\windows\sysnative\sysprep\sysprep.exe");
procInfo.Arguments = "/audit /reboot";
var proc = new Process();
proc.StartInfo = procInfo;
proc.Start(); //Actually executes the process
proc.WaitForExit();

Нашли решение для версий Windows старше 8:

Вам нужно скомпилировать вашу программу как бинарный файл x64. Если вы скомпилируете его как двоичный файл x86, система перенаправит вас на SysWOW64 вместо System32,

Если вам нужна совместимость с x64 и x86, вы также можете отключить перенаправление папок:

 // Disables folder redirection
 [DllImport("kernel32.dll", SetLastError = true)]
 static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

 // Enables folder redirection
 [DllImport("kernel32.dll", SetLastError = true)]
 static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
Другие вопросы по тегам