如何在不将应用程序池标识设置为本地系统的情况下从网站重新启动应用程序池?



i在.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-这表明我需要为用户配置特定的权限,但是我不确定这是什么或如何做。谁能帮忙?

问题在这里也解释了

您可以做到这一点的唯一方法是,如果用于运行代码的帐户(使用microsoft.web.administration)具有正确的权限,可以在IIS中进行"运行时操作",默认情况下,仅包括管理员和系统,并且正如您在一般情况下正确指出的那样,从Web中介绍该级别的许可是一个坏主意。

您可能应该做的是创建一个应用程序池或其他使用高特你运行的方式,但这仅在本地可访问(例如使用IP和域限制),并且使用额外的授权级别检查(例如,仅允许从应用程序调用),并且被限制以尽可能运行最小代码和所需的最小表面,例如仅回收属于用户的池等。受到损害,损害将受到更大的约束。

现在,出于好奇……以下是" 不支持的",所以请不要使用,而只是用于信息目的。
我们在 servermanager 中使用的API读取配置被称为 AHADMIN ,您可以"足够入侵以读取配置",例如,如果您是ACL之类的东西:

Cd C:WindowsSystem32inetsrvconfig  
icacls . /grant yourUser:(R)  
icacls redirection.config /grant yourUser:(R)  
icacls applicationHost.config /grant yourUser:(R)  

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

现在,回到运行时状态,为此,我们使用的API称为 rsca (运行时状态和控制API),并且本身也保护了仅作为系统或系统运行管理员,尽管您可能会找到一种方法来破解这种方法,但改变它也是一个坏主意。但是长话短说,这不支持,您可能很容易地引起系统问题。

使用@carlosag答案,以下解决方案有效:

  1. 创建新用户并将其放入管理员组

  2. 创建一个以运行重新启动代码的Web服务,将其放在自己创建的用户的运行中(配置适当的应用池属性,例如队列长度等)

    a。在您的Web方法(或Begin_reqest)中放置以下代码以防止其被外部称为(我认为在IIS中也有其他方法可以做到这一点,但这是我发现的最快方法)

    b。如您所见,在Web服务代码中添加其他身份验证(我们可以使用一个符号)。

  3. 从ApplicationSidentity下的应用程序池中运行的网站引用此服务

这有效。

代码:

     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

相关内容

最新更新