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

标签 .net iis-7 .net-3.5 application-pool applicationpoolidentity

我在 .Net 中有一个应用程序,它为其他应用程序执行各种管理/配置。我需要能够停止和启动应用程序池。我已经实现了这一点,但前提是我将应用程序池作为本地系统运行(这通常被认为是一个坏主意)。

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

我使用下面的代码,但它似乎要求运行它的 AppPool 具有本地系统的标识(否则我会得到 System.UnauthorizedAccessException)- 有没有一种方法可以启动/停止权限较低的帐户(我更喜欢使用 Application Identity)- 虽然暂时提升权限也是可以接受的。

    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

最佳答案

您可以这样做的唯一方法是,如果用于运行代码(使用 Microsoft.Web.Administration)的帐户具有在 IIS 中执行“运行时操作”的正确权限,并且默认情况下仅包括管理员和SYSTEM,并且正如您正确指出的那样,通常从 Web 公开该级别的权限是一个坏主意。

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

现在,出于好奇……以下内容“不受支持”,因此请不要使用,仅供引用。
我们在 ServerManager 中用来读取配置的 API 被称为 AHADMIN 并且你可以“hack enough to read configuration”,例如,如果你的 ACL 是这样的:

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

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

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

关于.net - 如何在不将应用程序池标识设置为本地系统的情况下从网站重新启动应用程序池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13274964/

相关文章:

c# - 允许操作访问共享上下文(例如 WCF 中的 OperationContext)

.net - byte[] 到 XImage 失败并出现一般 GDI+ 错误

c# - 是否有超过 4 个参数的 Func 对象?

c# - 如何在 asp.net 中呈现之前删除 html 注释标记

c++ - 用于收集 PC 硬件/操作系统信息的库

iis - 如何将ASP.NET 2.0注册到Web服务器(IIS7)?

html - 直接在 HTML 文件中进行 301 重定向

asp.net - 使用 ASP.NET 4.0 和 IIS7 进行 HTTP 压缩

.net - 使 asp.net 应用程序符合 IPv6

c# - 从 c# 运行 MS Access 保存的查询