IIS 7 配置路径

Posted

技术标签:

【中文标题】IIS 7 配置路径【英文标题】:IIS 7 Configuration Paths 【发布时间】:2011-01-24 01:41:31 【问题描述】:

我正在尝试使我的 c++ ahadmin 应用程序与 IIS 7 兼容。我的应用程序需要读取网站配置(通过 IIS 6 中的元数据库属性)。

我阅读了很多关于配置路径的文章,我认为我对它的工作原理有一个很好的了解 - 但是我不确定一件事:

要进行配置,我可以提交 MACHINE/WEBROOT/APPHOST/ 路径或 MACHINE/WEBROOT/APPHOST/Default 网站。

我理解后者指的是具体网站的实际web.config,前者指的是通用的applicationHost.config文件,其中设置了通用设置。

我的应用程序不知道 web.config 文件是否存在。

我的问题:如果我想到达这条路径 - Object.ConfiguredObject.Site.Bindings,我需要提交 APPHOST 路径还是 APPHOST/Default Web Site 路径?

我怎么知道在运行时?

【问题讨论】:

【参考方案1】:

您将始终将您的绑定提交给MACHINE/WEBROOT/APPHOST

你应该去看看架构文件:

%systemroot%\System32\inetsrv\config\schema

它们将帮助您确定设置的归属。

更新:

根据您的评论:

例如,AccessSSLFlags 将 映射到 ConfigurationSection.AccessSection.SslFlags - 在这种情况下我将提交哪个部分?我怎么知道我在哪个部分 需要提交吗?

这一切都取决于。 IIS7 支持一种称为Feature Delegation 的机制。如果某个功能被委派,则这意味着用户可以在其本地 web.config 中配置该功能。一些功能在system.webServer 下配置,另一些在system.web 下配置。

用户可以在他/她的web.config 中本地配置的内容由两个文件中的条目控制:

%systemrooot%\system32\inetsrv\config\administration.config%systemrooot%\system32\inetsrv\config\applicationHost.config

如果你去看看 IIS7 配置架构:

%systemroot%\System32\inetsrv\config\schema\IIS_schema.xml

你会发现有两种主要类型的部分:

system.applicationHost/xxxxsystem.webServer/xxxx

system.applicationHost 下可配置的任何内容通常不被视为用户可修改的配置项。事实上如果你打开applicationHost.config你会看到:

<sectionGroup name="system.applicationHost">
  <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
</sectionGroup>

注意到allowDefinition="AppHostOnly"了吗?这基本上是告诉你这些设置不能在web.config中配置。

功能委托的工作范围太广,无法在答案中涵盖,因此我建议您阅读上面链接的文章。

【讨论】:

再次感谢您的回复。我以绑定为例 - 但是我希望能够支持映射到 IIS 配置路径的所有元数据库属性。例如,AccessSSLFlags 将映射到 ConfigurationSection.AccessSection.SslFlags - 在这种情况下我将提交哪个部分?我怎么知道我需要提交哪个部分? @ron - 你到底想要达到什么目的? 我正在尝试在 IIS 7 中支持 IIS 6 元数据库属性。无法使用 IIS 6 兼容性包,因为它没有涵盖足够的属性,因此我决定在我的代码中创建自定义映射。然后,如果用户输入 AccessSSLFlags,我的应用程序知道在 IIS 7 中映射到 ConfigurationSection.AccessSection.SslFlags,但我不知道我需要提交哪个部分才能在运行时获取此配置.. @ron - 好的,那么我的回答应该会有所帮助。架构文件和配置文件本身确实提供了足够的信息来解决这个问题。老实说,目标是尽可能存储在 APPHOST 中。用户可以并且需要在web.config 中覆盖的设置可以这样做。【参考方案2】:

听起来您正在尝试构建一个通用工具来管理配置,因此您可能需要考虑遵循 IIS 管理器遵循的类似模式;简而言之,它总是尝试将配置保存到可能的最深路径。这意味着它将始终通过查看该部分是否被锁定来将其提交到它可以的地方。它使用托管代码 (Microsoft.Web.Administration),但您可以使用 AppHostElement.GetMetadata("isLocked") 从 C++ 访问相同的数据。 顺便说一句,如果您使用 C++,我强烈建议您直接使用 AHADMIN(而不是 WMI 或其他任何东西),尤其是 IAppHostWritableAdminManager。

因此算法是,将 CommitPath 设置为与指定的 GetAdminSection 配置路径相同的值。然后检查 IsLocked,如果是则删除最后一个“路径部分”(修剪从最后一个“/”开始),然后再次阅读,直到找到该部分解锁的位置。那是你可以保存它的最深处。此外,如果它是 system.web 部分,您将需要在某个时候切换到 MACHINE/WEBROOT。 IsLocked 将尊重诸如部分定义允许位置之类的内容以及其他所需的内容。如果你想让它防弹,你甚至需要检查属性级锁定,但我认为这是相当先进的。

【讨论】:

以上是关于IIS 7 配置路径的主要内容,如果未能解决你的问题,请参考以下文章

windows2012 IIS8.5 不能在此路径中使用此配置节

Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……

IIS7配置HTTPS+默认访问https路径

iis7 无法验证对路径的访问

CA证书申请+IIS配置HTTPS+默认访问https路径

IIS 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。 HTTP 错误 500.19