通过api调用远程关闭

时间:2015-10-11 22:24:42

标签: c# web-services

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

[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响应并且日志记录显示代码被调用,但机器本身不会重新启动或关闭。

有人知道这里会出现什么问题吗? Web应用程序是否需要具体权限才能执行此操作,或者其他可能是此问题的根源?

1 个答案:

答案 0 :(得分:2)

您的网络应用程序可能在NT AUTHORITY\NETWORK SERVICE,其他IIS_WPG成员用户或应用程序池标识(如果是Server 2012或更高版本)下运行。这些帐户无权关闭它们运行的​​服务器。

我建议的解决方案是创建一个新的用户帐户,该帐户是IIS_WPG的成员(允许它成为应用程序池标识),但明确设置了Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment > Shutdown the system权限。通过将用户帐户添加到本地管理员组,不要偷工减料。

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