3

我正在尝试使我的 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路径?

我怎么知道在运行时?

4

2 回答 2

2

您将始终将绑定提交给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/xxxx
system.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.

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

于 2011-01-24T03:35:42.010 回答
1

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

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

于 2011-01-24T22:42:56.927 回答