为何C#调用CMD执行rstrui.exe失败且应用崩溃?
解决C#调用rstrui.exe无法启动系统还原的问题
问题原因分析
你的代码存在两个核心问题:
- 不必要的CMD中转:rstrui.exe是独立的GUI程序,无需通过cmd.exe调用,中转反而可能引入启动逻辑问题。
- 阻塞的输出读取:rstrui.exe作为GUI程序不会向控制台输出任何内容,原代码中调用
StandardOutput.ReadToEnd()会导致主线程无限等待,进而阻塞进程启动。
解决方案
方案1:直接启动rstrui.exe(推荐)
跳过cmd中转,直接启动系统还原程序,并配置正确的进程启动参数:
public static void LaunchSystemRestore() { ProcessStartInfo startInfo = new ProcessStartInfo("rstrui.exe") { CreateNoWindow = false, UseShellExecute = true // GUI程序需启用此参数以保证正常启动 }; using (Process process = new Process()) { process.StartInfo = startInfo; process.Start(); } }
调用方式:
LaunchSystemRestore();
方案2:确保程序拥有管理员权限
系统还原需要管理员权限才能运行,如果你的C#程序未以管理员身份启动,即使代码正确也无法触发系统还原。可以通过以下方式添加权限要求:
- 在项目中添加
app.manifest文件(右键项目 → 添加 → 新建项 → 选择"应用程序清单文件") - 修改清单中的
requestedExecutionLevel节点:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
对原代码的问题说明
原代码中通过cmd /c rstrui.exe调用时,cmd启动rstrui.exe后会立即退出,但后续的ReadToEnd()会等待控制台输出(而rstrui.exe没有输出),导致线程阻塞,最终表现为rstrui.exe无法正常启动。直接启动目标程序可以彻底避免这类问题。
内容的提问来源于stack exchange,提问作者KrakenZ
相关产品推荐
相关产品推荐

