在 C# 和 ASP.NET 中关闭或重新启动计算机

本文关键字:重新启动 计算机 ASP NET | 更新日期: 2023-09-27 18:34:53

我希望能够关闭或重新启动运行 ASP.NET 应用程序的服务器。以下代码在调试模式下效果很好:

Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "shutdown";
startInfo.Arguments = "/r /f /t 0";
startInfo.UseShellExecute = true;
startInfo.Verb = "runas";
process.StartInfo = startInfo;
process.Start();

我也尝试过这段代码,但我收到以下错误"Process 对象必须将 UseShellExecute 属性设置为 false 才能以用户身份启动进程":

var info = new ProcessStartInfo("shutdown.exe", "/r /t 0");
        info.UserName = "administrator";
        //A not-so-secure use of SecureString
        var secureString = new SecureString();
        var password = "password";
        foreach (var letter in password)
        {
            secureString.AppendChar(letter);
        }
        info.Password = secureString;
        var restart = new Process();
        restart.StartInfo = info;
        restart.Start();

我将以下内容添加到我的代码中:

info.UseShellExecute = false;

然后,错误"Process 对象必须将 UseShellExecute 属性设置为 false 才能以用户身份启动进程"消失,但代码的执行方式与第一个代码块类似

当我在调试模式下执行代码时,或者如果我运行命令是cmd,服务器将重新启动。但是,当我在服务器上实时运行该应用程序时,它不会重新启动。我没有收到任何错误,也没有弹出提示服务器正在或不会重新启动。有人可以告诉我我做错了什么吗?

更新:我添加了一个try-catch,该应用程序永远不会引发异常。但是,当我查找事件日志时,我发现应用程序错误事件 1000 关闭.exe

在 C# 和 ASP.NET 中关闭或重新启动计算机

运行应用程序池的帐户没有足够的权限来重新启动系统,这就是它不会发生的原因。

您可以通过登录到服务器并随后转到 Control Panel > Administrative Tools > Local Security Policy 、展开Security Settings > Local Policies > User Rights Assignment节点并转到Shut down the system设置来更改此设置。将应用程序池帐户(或其父组,如果有其组(添加到该列表中。