必须使用 shutdown 命令关机/重启,推荐 Process.Start 配合 UseShellExecute=false、CreateNoWindow=true 和错误重定向;需检查 ExitCode 判定成败,权限不足时不会抛异常。关机/重启必须用 Shutdown 命令,Process.Start("shutdown") 是最可靠方式Windows 系统级关机或重启不能靠 .NET 的 Environment.Exit 或 Application.Exit —— 那只是退出当前程序。真正生效的只有调用系统 shutdown 命令。直接拼接参数比用 WMI 或 P/Invoke 更稳定、权限要求更低、兼容 Win7 到 Win11。shutdown /s /t 0 立即关机(/s 表示 shutdown,/t 0 表示延迟 0 秒)shutdown /r /t 0 立即重启(/r 表示 restart)加 /f 强制关闭正在运行的应用(如弹窗未响应时必需):shutdown /s /f /t 0避免用 /l(注销),它不等于关机,且在服务上下文中可能失败执行 CMD 命令要用 ProcessStartInfo 配置,否则容易静默失败直接 Process.Start("shutdown", "/s /t 0") 在某些环境(如无桌面会话的服务、UAC 提权后)会卡住或没反应。根本原因是没显式指定 UseShellExecute = false 和 CreateNoWindow = true,导致命令在隐藏 shell 中无法正确继承权限或输出流。必须设 UseShellExecute = false,否则参数会被忽略或解析错推荐设 CreateNoWindow = true,避免闪黑窗;若需调试可临时设为 false 观察报错加 RedirectStandardError = true 并读取 StandardError,能捕获如“拒绝访问”“参数错误”等真实原因示例关键片段:var startInfo = new ProcessStartInfo("shutdown", "/s /f /t 0"){ UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true};using var proc = Process.Start(startInfo);string error = proc.StandardError.ReadToEnd();proc.WaitForExit();权限不足时会直接失败,没有异常抛出——必须检查退出码和错误输出shutdown 是受保护操作,普通用户默认只能对自己会话执行注销,关机/重启需要“关机系统”权限。这权限通常只对管理员组或明确赋权的账户开放。而 .NET 的 Process.Start 即使失败也常返回非空 Process 对象,且不抛异常,极易误判成功。 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

更多推荐