【问题标题】:Restart Server from ASP.NET application when AppPool is ran under LocalSystem or LocalService account当 AppPool 在 LocalSystem 或 LocalService 帐户下运行时,从 ASP.NET 应用程序重新启动服务器
【发布时间】:2011-11-27 10:15:47
【问题描述】:

是否可以从 LocalSystem 或 LocalService 帐户托管的 ASP.NET 应用程序重新启动服务器?当我创建自定义管理帐户并将 AppPool 在该帐户下运行时,此方法有效:

Process.Start("shutdown", "/r /d 4:1 /t 10");

但是,我不想拥有自定义帐户(因为密码过期并且需要在更改用户密码时更新所有 AppPools - 我需要维护多个服务器)。

那么,这可能吗?

【问题讨论】:

  • 好吧,伙计们......这是可能的。遵循 secpol.msc 上的@vcsjones 建议,并确保在步骤 3 中添加“从远程系统强制关闭”。然后重新启动计算机以加载策略,仅此而已。我使用了 LocalService 帐户(选择用户或组中的本地服务)对话框。它适用于 Shutdown.exe(我用过的命令)。

标签: c# asp.net security iis


【解决方案1】:

您始终可以使用可以重新启动服务器的不同身份启动进程:

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

如果您只是想授予非管理员帐户重新启动服务器的权限:

  1. 打开secpol.msc
  2. 导航到本地策略\用户权限分配。
  3. 找到Shutdown The System
  4. 添加帐户。

这可能是使用最低权限帐户的好方法。这样您就不必像管理员组中的帐户那样使用非常大的锤子了。

Shutdown.exe(我相信)总是需要管理员权限。不用shutdown.exe重启服务器可以参考this MSDN post

【讨论】:

  • 是的......那么问题是我需要在多个服务器上的 web.config 中维护密码。虽然这可能是指定用户帐户的最佳解决方案。
  • @kape123 您可以只授予您的应用程序池用户重新启动系统的权限,而无需授予他们完整的管理员角色。
  • 谢谢 - 我想我有那个 secpol.msc - 我会将 SYSTEM 添加到允许关闭系统的用户列表中。
【解决方案2】:

您可以在拨打电话时让您的代码模拟一个特定的帐户,或者使用一个帐户建立一个网络服务。我推荐网络服务,最坏的情况是你更新一个应用程序池。您还可以在内部将 Web 服务锁定为仅限您的应用程序。

A small C# Class for impersonating a User

【讨论】:

  • Process.Start 对模拟用户有超载...而且我正在管理多个服务器,这就是为什么我要锁定在 LocalSystem/LocalService 下执行此操作的方法 - 我已经隔离了 Process .开始到WebService。还有其他想法吗?
  • 我认为您可以使用组策略做一些事情,但不是我的专业知识。服务器故障可能是您回答的更好地方。
最近更新 更多