在LocalSystem或LocalService帐户下运行AppPool时,从ASP.NET应用程序重新启动服务器

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

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

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

那么,这可能吗?

您始终可以使用可以重新启动服务器的其他标识启动该进程:

 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的情况下重启服务器时,可以参考此MSDNpost 。

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

用于模拟用户的小型C#类