在 C# 中启动 SYSPREP
Launch SYSPREP in C#
我通过堆栈溢出搜索找到了这个,但没有人给出有效的解决方案。我正在编写一个简单的程序,它的第一部分是使用一些参数启动 sysprep.exe。出于某种原因,当代码为 运行 时,sysprep 不会启动。它给出了找不到文件的错误。例如通过使用下面的代码,记事本将毫无问题地打开。如果我尝试打开 sysprep,它不会。
Process.Start(@"C:\Windows\System32\notepad.exe"); -- opens with no issue
Process.Start(@"C:\Windows\System32\sysprep\sysprep.exe"); -- does not open
如有任何帮助,我们将不胜感激。
{
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();
其实是64位的重定向问题Windows。
根据this discussion,
System32
调用被重定向到 SysWOW64
文件夹。
由于 C:\Windows\SysWOW64\Sysprep\sysprep.exe
不存在,您会收到错误消息。
这就是你想要的:
Process p = Process.Start(@"C:\Windows\sysnative\Sysprep\sysprep.exe");
只需使用 sysnative
即可。
我看到另一个答案对您有用,但我想包含一个不同的答案,让您可以随时从 System32 访问文件。如果您从 public class 开始暂时修改内核,只要您拥有正确的权限,您应该能够访问您需要的任何内容。
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()" 方法。希望这对寻找此答案的其他人有所帮助。
我通过堆栈溢出搜索找到了这个,但没有人给出有效的解决方案。我正在编写一个简单的程序,它的第一部分是使用一些参数启动 sysprep.exe。出于某种原因,当代码为 运行 时,sysprep 不会启动。它给出了找不到文件的错误。例如通过使用下面的代码,记事本将毫无问题地打开。如果我尝试打开 sysprep,它不会。
Process.Start(@"C:\Windows\System32\notepad.exe"); -- opens with no issue
Process.Start(@"C:\Windows\System32\sysprep\sysprep.exe"); -- does not open
如有任何帮助,我们将不胜感激。
{
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();
其实是64位的重定向问题Windows。
根据this discussion,
System32
调用被重定向到 SysWOW64
文件夹。
由于 C:\Windows\SysWOW64\Sysprep\sysprep.exe
不存在,您会收到错误消息。
这就是你想要的:
Process p = Process.Start(@"C:\Windows\sysnative\Sysprep\sysprep.exe");
只需使用 sysnative
即可。
我看到另一个答案对您有用,但我想包含一个不同的答案,让您可以随时从 System32 访问文件。如果您从 public class 开始暂时修改内核,只要您拥有正确的权限,您应该能够访问您需要的任何内容。
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()" 方法。希望这对寻找此答案的其他人有所帮助。