C# 在C中启动SYSPREP#

C# 在C中启动SYSPREP#,c#,visual-studio,launch,process.start,sysprep,C#,Visual Studio,Launch,Process.start,Sysprep,我通过堆栈溢出搜索发现了这一点,但没有人给出有效的解决方案。我正在编写一个简单的程序,第一部分是用一些参数启动sysprep.exe。由于某些原因,sysprep在代码运行时不会启动。它给出了一个找不到文件的错误。例如,通过使用下面的代码,记事本将毫无问题地打开。如果我尝试打开sysprep,它将不会 Process.Start(@“C:\Windows\System32\notepad.exe”);--打开时没有问题 Process.Start(@“C:\Windows\System32\sy

我通过堆栈溢出搜索发现了这一点,但没有人给出有效的解决方案。我正在编写一个简单的程序,第一部分是用一些参数启动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");

        }

    }

我认为这是一个权限问题,您可以尝试以管理员身份运行

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();

我认为这是一个权限问题,您可以尝试以管理员身份运行

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();

这实际上是64位Windows上的重定向问题。 根据,
System32
调用被重定向到
SysWOW64
文件夹。 由于
C:\Windows\SysWOW64\Sysprep\Sysprep.exe
不存在,因此会出现错误

这就是你想要的:

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

只需使用sysnative。

这实际上是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()”方法。希望这能帮助其他寻找此答案的人。

我发现另一个答案对您有效,但我想包括一个不同的答案,允许您随时从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()”方法。希望这能帮助其他人找到这个答案。

您是否尝试过在管理模式下运行Visual Studio?我尝试过命令行,它可以工作,但在VS(甚至在管理模式下)
文件中。Exists(@“C:\Windows\System32\sysprep\sysprep.exe”)
返回false。^powershell工作,cmd不工作。也许这与此有关。嗨,是的,仍然处于管理模式,它不工作。还有其他想法吗?几乎可以肯定,您是以32位运行的,这意味着
C:\Windows\System32
并不意味着您认为它的功能。重新编译并以64位运行。是否尝试在管理模式下运行Visual Studio?我尝试了命令行,但它在VS(甚至在管理模式下)下运行
File.Exists(@“C:\Windows\System32\sysprep\sysprep.exe”)
返回false。^powershell工作,cmd不工作。也许这与此有关。嗨,是的,仍然处于管理模式,它不工作。还有其他想法吗?几乎可以肯定,您是以32位运行的,这意味着
C:\Windows\System32
并不意味着您认为它的功能。重新编译并以64位运行。谢谢,但这对我仍然不起作用。system32中的任何其他应用程序都会打开,sysprep除外。我已经用尽了我的想法。谢谢,但不,这对我仍然不起作用。system32中的任何其他应用程序都会打开,sysprep除外。我已经用尽了我的想法。这很有效!非常感谢。我首先做了不信者@Damien_建议的事。这也很有效,但我必须选择x64。现在我可以选择任何CPU,它可以工作了。谢谢大家的帮助。这很有效!非常感谢。我首先做了不信者@Damien_建议的事。这也很有效,但我必须选择x64。现在我可以选择任何CPU,它可以工作了。谢谢大家的帮助。