通过api调用远程关机

本文关键字:关机 程关机 api 调用 通过 | 更新日期: 2023-09-27 18:17:15

我最近用c#实现了一个web应用程序,它为我提供了一个api,通过它我可以重启或关闭我的windows服务器。这是一个非常简单的代码,只是接收一个http post请求,在正文中包含动作(关机或重启)和密码。

[HttpPost]
    public HttpResponseMessage Post([FromBody] SystemActionModel actionRequest)
    {
        if (!Utils.ValidatePassword(actionRequest))
            return new HttpResponseMessage(HttpStatusCode.Unauthorized);
        switch (actionRequest.action)
        {
            case "shutdown": 
                SystemActions.Shutdown(actionRequest);
                return new HttpResponseMessage(HttpStatusCode.OK);
                break;
            case "restart": 
                SystemActions.Restart(actionRequest);
                return new HttpResponseMessage(HttpStatusCode.OK);
                break;
            default:
                return new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }

public class SystemActions
{
    public static void Shutdown(SystemActionModel actionRequest)
    {
        var psi = new ProcessStartInfo("shutdown", "/s /f /t 0");
        psi.CreateNoWindow = true;
        psi.UseShellExecute = false;
        Process.Start(psi);
    }
    public static void Restart(SystemActionModel actionRequest)
    {
        var psi = new ProcessStartInfo("shutdown", "/r /f /t 0");
        psi.CreateNoWindow = true;
        psi.UseShellExecute = false;
        Process.Start(psi);
    }
}

在本地调试并将http请求发送到localhost时,此代码按预期工作。然而,当我在我的windows服务器机器上部署这个web应用程序时,它不会重新启动或关闭机器。我仍然得到200响应,日志显示代码被调用,但机器本身没有重新启动或关闭。

有谁知道这里会出什么问题吗?网页应用是否需要特定的权利才能做到这一点,或者是否存在其他问题?

通过api调用远程关机

您的web应用程序可能在NT AUTHORITY'NETWORK SERVICE,其他IIS_WPG成员用户或应用程序池身份(如果Server 2012或更高版本)下运行。这些帐户没有权限关闭它们运行的服务器。

我推荐的解决方案是创建一个新的用户帐户,它是IIS_WPG的成员(允许它是一个应用程序池标识),但具有Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment > Shutdown the system权限显式设置。不要偷工减料,将用户帐户添加到Local Administrators组。

确保将用户帐户设置为应用程序池标识(并且此站点在该池中运行)和匿名身份验证默认为池标识。