获取IIS 7站点属性

时间:2011-01-22 01:52:50

标签: c++ configuration iis-7 metabase

我有一个需要检索IIS 7网站属性的C ++应用程序(例如类似于IIS6中的配置数据库属性 - PathAppFriendlyName等)。

使用IIS 7,我的代码执行此操作:

  1. 获取AppHostWritableAdminManager并提交路径MACHINE/WEBROOT/APPHOST/Default Web Site/
  2. 使用部分名称GetAdminSection致电appSettings
  3. 然后查看返回的集合并查找属性(例如Path)。
  4. 这适用于IIS 6,但不适用于IIS7 / 7.5。

    为了使这项工作,我需要做出哪些改变?

1 个答案:

答案 0 :(得分:8)

在IIS7中,配置数据不存储在“配置数据库”中,而且我们在IIS6中习惯使用的配置数据库属性也不相同。 IIS7将大部分配置数据存储在以下文件中:

  

%systemroot%\System32\InetSrv\Config\applicationHost.config

还有其他文件,但为了回答这个问题,这是我们感兴趣的文件。

applicationHost.config的文档可在此处找到:

  

<system.applicationHost> - IIS.NET
  configuration Element [IIS 7 Settings Schema]
  system.applicationHost Section Group [IIS 7 Settings Schema]

您可以找到IIS6配置数据库的列表 - &gt; IIS7 XML配置映射在这里:

  

Converting Metabase Properties to Configuration Settings [IIS 7]

例如,在IIS6中,网站/root的路径存储在Path的{​​{1}}属性中。即:

IIsWebVirtualDir

但是在IIS7中它的存储方式不同:

<IIsWebServer Location="/LM/W3SVC/67793744" AuthFlags="0" ServerAutoStart="TRUE" 
              ServerBindings="217.69.47.170:80:app2.dev" ServerComment="app2" /> 
<IIsWebVirtualDir Location="/LM/W3SVC/67793744/root" 
    AccessFlags="AccessRead | AccessScript" 
    AppFriendlyName="Default Application" 
    AppIsolated="2" 
    AppRoot="/LM/W3SVC/67793744/Root" 
    AuthFlags="AuthAnonymous | AuthNTLM" 
    DirBrowseFlags="DirBrowseShowDate | DirBrowseShowTime | DirBrowseShowSize |
            DirBrowseShowExtension | DirBrowseShowLongDate | EnableDefaultDoc" 
    Path="D:\websites\ssl-test\www\kerboom" 
    ScriptMaps="...">

但是,如果您的代码必须同时适用于IIS6和IIS7,则可以安装IIS6管理兼容性组件。这将允许您使用传统的IIS6元数据库API(如ADSI,System.DirectoryServices等)访问IIS7站点属性。兼容层将为您将这些属性映射到新的IIS7架构。

本文的第一部分介绍了如何在Vista / Windows7 / Windows 2008上安装它:

  

How to install ASP.NET 1.1 with IIS7 on Vista and Windows 2008 - see step #1

<强>更新

不幸的是,C ++不是我的强项。但是我在C#中使用COM Interop汇总了一个示例,以演示使用<sites> <site name="Default Web Site" id="1" serverAutoStart="true"> <!-- this is the functional equivalent of the /root app in IIS6 --> <application path="/"> <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" /> </application> </site> <sites>

AppHostWritableAdminManager

上面的代码在IAppHostWritableAdminManager wam = new AppHostWritableAdminManager(); IAppHostElement sites = wam.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST"); IAppHostElementCollection sitesCollection = sites.Collection; long index = FindSiteIndex(sitesCollection, "MySite"); if(index == -1) throw new Exception("Site not found"); IAppHostElement site = sitesCollection[index]; IAppHostElementCollection bindings = site.ChildElements["bindings"].Collection; for (int i = 0; i < bindings.Count; i++) { IAppHostElement binding = bindings[i]; IAppHostProperty protocolProp = binding.GetPropertyByName("protocol"); IAppHostProperty bindingInformationProp = binding.GetPropertyByName("bindingInformation"); string protocol = protocolProp.Value; string bindingInformation = bindingInformationProp.Value; Debug.WriteLine("{0} - {1}", protocol, bindingInformation); } static long FindSiteIndex(IAppHostElementCollection sites, string siteName) { for (int i = 0; i < sites.Count; i++) { IAppHostElement site = sites[i]; Debug.WriteLine(site.Name); IAppHostProperty prop = site.GetPropertyByName("name"); if(prop.Value == siteName) { return i; } } return -1; } 集合中找到名为“MySite”的网站。然后,它会检索网站的<sites>集合并打印每个绑定<bindings>protocol属性。

你应该可以很容易地将它转换为C ++。

回答评论中的问题 -

  

例如,路径   system.applicationHost / Sites将获得   我到网站列表。有没有   绝对的方式来到我的服务器   这样的绑定(例如通过   干   system.applicationHost /网站/默认   网站/装订

使用bindingInformation时,没有直接进入要检查/修改的网站或其属性的快捷方式。在上面的示例中,您将看到我需要遍历网站集以找到我感兴趣的网站。原因是AppHostWritableAdminManager将所有内容视为元素和元素集合。这是一个相当基本的API。即使使用托管的AppHostWritableAdminManager API,您也会发现虽然有一些很好的属性,例如Microsoft.Web.Administration,但这些属性是Site.Bindings的伪装包装器。

事实上,如果我想找到一个网站,我仍然需要在for循环中搜索AppHostWritableAdminManager集合,或者如果我使用C#3.5或更高版本,则添加一些LINQ糖:

Sites

using(ServerManager serverManager = new ServerManager()) { Site x = serverManager.Sites.FirstOrDefault(s => s.Name == "MySite"); } 的基类是Site,它在bonnet下包含对ConfigurationElement的访问权限。

一旦您通过了一些基本的快捷方式包装器属性,我们在托管代码中为配置IIS(例如IIS FTP)所做的很多工作就是元素,属性和元素集合。

更新2:

请记住,我的生活中从未写过一系列C ++。没有字符串或对象的清理:

IAppHostElement