【问题标题】:Launch Sysprep.exe from C# Program从 C# 程序启动 Sysprep.exe
【发布时间】:2015-05-19 04:36:58
【问题描述】:

如何使用我的 c# 程序中的特定参数启动 sysprep.exe?

 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 窗体应用程序中调用它,

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_SSD_Optimizer_Method_1.Method1.btn_all_Click(对象发送者, EventArgs e) in :line 182/n/n系统找不到 文件指定/nSystem.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) 在 System.Diagnostics.Process.Start() 在 Windows_SSD_Optimizer_Method_1.Method1.btn_all_Click(对象发送者, EventArgs e) in :line 182/n/n

http://i.stack.imgur.com/0Em8O.png

【问题讨论】:

  • 为什么不直接启动 sysprep.exe?不需要运行cmd.exe
  • 但是如何传递参数 /audit /reboot ?
  • cmd.StartInfo.Arguments
  • 我尝试使用进程启动 sysprep.exe 但它不起作用:/
  • 您的程序是否在 64 位系统上以 32 位运行,如果是,则您在错误的 system 文件夹中查找。

标签: c# batch-file windows-8 64-bit sysprep


【解决方案1】:

在 Windows 8 x64 中,您应该be aware of File System Redirection。

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

【讨论】:

  • 它可以工作:DD 这可以在 x86 系统上工作吗?还是我应该检测操作系统然后继续?
  • 可能你必须这样做,是的。在 Win7 上,该路径不起作用。
【解决方案2】:

为早于 8 的 Windows 版本找到了解决方案:

您需要将程序编译为 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);

【讨论】:

  • 如果用户没有管理员权限,highestAvailable 可能无法以管理员身份运行。 requireAdministrator 强制获取管理员权限。
  • 试过了,还是说找不到文件。尝试通过VS运行,An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in System.dllAdditional information: The system cannot find the file specified我的UAC在windows中已经设置为最低了
  • 在这里遇到了同样的异常,以为这样可以解决问题。我会再看看它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多