我最近在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应用程序是否需要具体权限才能执行此操作,或者其他可能是此问题的根源?
答案 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
权限。通过将用户帐户添加到本地管理员组,不要偷工减料。
确保将用户帐户设置为应用程序池标识(并且仅此站点在该池中运行),并且匿名身份验证也默认为池标识。