通过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响应,日志显示代码被调用,但机器本身没有重新启动或关闭。
有谁知道这里会出什么问题吗?网页应用是否需要特定的权利才能做到这一点,或者是否存在其他问题?
您的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组。
确保将用户帐户设置为应用程序池标识(并且仅此站点在该池中运行)和匿名身份验证默认为池标识。