我有一个需要检索IIS 7网站属性的C ++应用程序(例如类似于IIS6中的配置数据库属性 - Path
,AppFriendlyName
等)。
使用IIS 7,我的代码执行此操作:
AppHostWritableAdminManager
并提交路径MACHINE/WEBROOT/APPHOST/Default Web Site/
。 GetAdminSection
致电appSettings
。 Path
)。 这适用于IIS 6,但不适用于IIS7 / 7.5。
为了使这项工作,我需要做出哪些改变?
答案 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