Запустите SYSPREP в C#

Я нашел это с помощью поиска переполнения стека, но никто не дал решение, которое работает. Я пишу простую программу, и первая ее часть - запуск sysprep.exe с некоторыми аргументами. По какой-то причине sysprep не запускается при запуске кода. Выдает ошибку, что файл не может быть найден. Например, с помощью кода ниже Блокнот откроется без проблем. Если я попытаюсь открыть sysprep, он не будет.

Process.Start (@ "C: \ Windows \ System32 \ notepad.exe"); - открывается без проблем Process.Start(@"C:\Windows\System32\sysprep\sysprep.exe"); - не открывается

Любая помощь будет оценена.

{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void RadioButton_Checked(object sender, RoutedEventArgs e)
    {
        if (radioButtonYes.IsChecked == true)
        {

            Process.Start(@"C:\Windows\System32\sysprep\sysprep.exe");

        }

    }

3 ответа

Решение

На самом деле это проблема перенаправления в 64-битной Windows. Согласно этой дискуссии, System32 звонки перенаправляются на SysWOW64 папка. И с тех пор C:\Windows\SysWOW64\Sysprep\sysprep.exe не существует, вы получаете ошибку.

Это то, что вы хотите:

Process p = Process.Start(@"C:\Windows\sysnative\Sysprep\sysprep.exe");

Просто использовать sysnative вместо.

Я вижу, что другой ответ сработал для вас, но я хотел бы включить другой ответ, который позволит вам получить доступ к файлам из System32 в любое время. Если вы начнете с общедоступного класса, чтобы на мгновение изменить ядро, вы сможете получить доступ ко всему, что вам нужно, если у вас есть необходимые разрешения.

public class Wow64Interop
    {
        [DllImport("Kernel32.Dll", EntryPoint = "Wow64EnableWow64FsRedirection")]
        public static extern bool EnableWow64FSRedirection(bool enable);
    } 

После этого я записал свой вызов sysprep следующим образом.

private void RunSysprep()
    {
        try
        {
            if (Wow64Interop.EnableWow64FSRedirection(true) == true)
            {
                Wow64Interop.EnableWow64FSRedirection(false);
            }

            Process Sysprep = new Process();
            Sysprep.StartInfo.FileName = "C:\\Windows\\System32\\Sysprep\\sysprep.exe";
            Sysprep.StartInfo.Arguments = "/generalize /oobe /shutdown /unattend:\"C:\\Windows\\System32\\Sysprep\\unattend.xml\"";
            Sysprep.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
            Sysprep.Start();

            if (Wow64Interop.EnableWow64FSRedirection(false) == true)
            {
                Wow64Interop.EnableWow64FSRedirection(true);
            }

        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

когда вы делаете что-то подобное, вы должны быть уверены, что если процесс перезапустит ваш компьютер, НЕ используйте метод WaitForExit(). Надеюсь, что это поможет всем, кто ищет этот ответ.

Я думаю, что это проблема с разрешениями, вы можете попробовать запустить от имени администратора

Process process = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName ="cmd.exe";
        startInfo.Arguments = @"/c  C:\Windows\System32\sysprep\sysprep.exe";
        startInfo.Verb = "runas";
        process.StartInfo = startInfo;
        process.Start();
Другие вопросы по тегам