Запустите 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);