3

我在.Net中有一个应用程序,为其他应用程序执行各种管理/配置。我需要能够停止并启动应用程序池。我已经实现了这一点,但只有当我运行应用程序池作为本地系统(这通常被认为是一个坏主意)。如何在不将应用程序池标识设置为本地系统的情况下从网站重新启动应用程序池?

最初我用Process.Start启动了appcmd.exe(使用适当的ProcessStartInfo对象),但这最终导致我得到-1073741502的退出代码,进一步的研究表明我需要使用Windows SDK进行调试,因为它有一些东西与一个没有加载的程序集有关,所以我发现在Microsoft.Web.Administration命名空间中看起来像一个更简单的解决方案:

我使用下面的代码,但它似乎需要运行它的AppPool具有本地系统的身份(否则我得到System.UnauthorizedAccessException) - 有没有办法开始/停止权限较低的帐户(我宁愿使用应用程序标识) - 虽然临时提升权限也是可以接受的。

Dim serverManager As New ServerManager() 
    Dim applicationPoolCollection As ApplicationPoolCollection = serverManager.ApplicationPools 

    For Each applicationPool As ApplicationPool In applicationPoolCollection 

     If applicationPool.Name = appPoolName Then 
      applicationPool.Stop() 
      applicationPool.Start() 
     End If 

    Next 

我已经设置了一个自定义帐户作为身份,但我无法确定该用户的最低ACL是什么。作为测试,我将该用户添加到本地管理员组,但仍获得System.UnauthorizedAccessException - 这表明我需要为该用户配置特定的权限,但我不确定这是什么或如何执行此操作。谁能帮忙?

Problem is explained here also

回答

1

使用@CarlosAg答案,以下解决方案的工作原理:

  1. 创建一个新用户,并把他们在管理员组

  2. 创建Web服务运行重启代码,把它放在它是自己的应用程序池,以您创建的用户身份运行(配置相应的应用程序池属性,例如队列长度等)

    a。将下面的代码放到你的web方法(或者begin_reqest)中,以防止它被外部调用(我认为在IIS中也有其他方法可以做到这一点,但这是我找到的最快方法)

    b。如果您认为合适(我们可以使用服务的单一登录),则向Web服务代码添加其他身份验证。

  3. 参考从网站上这是在应用程序池ApplicationIdentity

这个工程下运行此服务。

代码:

 If Not HttpContext.Current.Request.IsLocal Then 
     Const msg As String = "Only local requests are allowed" 
     log4net.LogManager.GetLogger(GetType(Global_asax)).Fatal(msg) 
     Throw New Exception(msg) 
    End If 
4

你能做到这一点的唯一方法是,如果用来运行的代码(使用Microsoft.Web.Administration)具有正确的权限在IIS做“运行时操作”,并通过账户默认情况下只包含管理员和系统,并且正如你正确地指出的那样,通常公开来自Web的权限级别是一个坏主意。

你可能应该做的是创建一个应用程序池或其他一些方式来使用高特权运行,但是这种方式只能在本地访问(例如使用IP和域限制)并且使用额外级别的授权检查(例如,只允许从应用程序中调用),并且限制为尽可能运行最小代码和所需的最小表面,例如仅回收属于用户的池等。这样,如果您的Web应用程序受到损害的情况下受到的损害会更加严重。

现在,对于好奇...以下是“不支持”所以请不要使用,但只是提供它的信息目的。
我们在ServerManager的使用读取配置的API被称为AHADMIN,你可以“砍够读取配置”,例如,如果你ACL的东西,如:

Cd C:\Windows\System32\inetsrv\config 
icacls . /grant yourUser:(R) 
icacls redirection.config /grant yourUser:(R) 
icacls applicationHost.config /grant yourUser:(R) 

您将能够从那个用户那里读取配置。知道在这一点上加密的属性将仍然无法读取,因为加密密钥也是单独保护的,并且您可能不应该在那里更改ACL,但其他所有内容都将可读(除了状态等运行时属性等)。您应该永远不要允许写入权限非特权帐户,因为这将非常容易提高权限(例如,他们可以创建一个应用程序池作为系统运行,并将其链接到随机目录,现在他们可以运行代码作为系统)。

现在,回到运行时的状态,为此我们使用我们称之为RSCA(运行时状态和控制API),这本身也受到保护是只能运行作为SYSTEM或管理员的API,虽然你可能会找到一种方法来解决这个问题,改变它也是一个坏主意。但长话短说这不被支持,你可能很容易导致系统的问题。

+0

谢谢你,你能不能详细阐述如下:你如何配置一个最小的表面/本地唯一的无障碍任何链接/信息?我可以尝试的另一个选项是启动一个应用程序,使用Process.Start执行Admin Credentials所需的操作。 –

+0

创建应用程序不起作用,同样的问题。 –

+0

感谢您的回答,我已经添加了我自己的下面,以防其他人帮助。积分奖励。 –

相关问题