我可以在没有管理员用户的情况下使用来自 Microsoft.Web.Administration 的 ServerManager 作为应用程序池身份吗

Can I use ServerManager from Microsoft.Web.Administration without admin user as an application pool identity

我想使用 Microsoft.Web.Administration.dll 中的 ServerManager 对象读取应用程序池的一些设置。问题是它只有在应用程序池的身份是具有管理员权限的 windows 用户时才有效。否则我会得到 UnauthorizedAccessException - Filename: redirection.config;错误:由于权限不足 ,无法读取配置文件。 有没有关于此问题的解决方法。 我的代码如下:

        ServerManager manager = new ServerManager();
        string currentSiteName = System.Web.Hosting.HostingEnvironment.SiteName;
        Site currentSite = manager.Sites[currentSiteName];
        string appVirtaulPath = HttpRuntime.AppDomainAppVirtualPath;

        string appPoolName = string.Empty;
        foreach (Application app in currentSite.Applications)
        {
            string appPath = app.Path;
            if (appPath == appVirtaulPath)
            {
                appPoolName = app.ApplicationPoolName;
            }
        }

        ApplicationPool currentAppPool = manager.ApplicationPools[appPoolName];

谢谢!

不,没有解决方法可以在不引起重大安全问题的情况下读取配置文件。你想达到什么目的?

如果读取配置设置,您可以在同一个 DLL 中使用 API,这将为您提供该站点设置的只读配置访问权限,例如读取 web.config 或 applicationHost.config 仅适用于该站点,而不是加密站点(例如密码)。 API 称为 WebConfigurationManager 并有一个名为 GetSection 的静态方法,例如 WebConfigurationManager.GetSection("system.webServer/defaultDocument")

参见:https://msdn.microsoft.com/en-us/library/microsoft.web.administration.webconfigurationmanager.getsection.aspx

但是,无法通过 API 读取多个设置(即用于启动进程的所有设置 w3wp.exe)。 短篇小说:不幸的是,出于安全原因,许多设置无法从工作进程中读取。您可以使用服务器变量读取一些内容,例如 Request.ServerVariables["APP_POOL_ID"]) 或 Request.ServerVariables["APP_POOL_CONFIG"])。当然,您可以计算指针的大小(4 或 8)或使用环境变量(如 PROCESSOR_ARCHITECTURE)

长话短说:在 IIS 中,出于安全原因,我们将 applicationHost.config 文件拆分为较小的应用程序 pool.config 文件(默认位于C:\inetpub\temp\appPools) 出于安全原因被隔离,这样即使不受信任的代码在进程中 运行 (w3wp.exe) 尝试 steal/read 其他站点的设置这在物理上是不可能的。您可以打开该文件并查看其中有哪些设置,然后您可以阅读这些设置。您会注意到 appPools 部分完全缺失,因为它仅供 WAS 用于启动 w3wp.exe.