为什么使用IIS7.5的Microsoft.Web.Management.dll只能在64位进程中工作?

我正在编写一些代码来允许用户远程pipe理IIS7。 在发动机罩下,这将授权规则添加到以下configuration部分下的c:\windows\system32\inetsrv\config\administration.config

system.webServer/management/authorization/authorizationRules

我正在使用Microsoft.Web.Administration程序集和名称空间,其代码类似于以下内容:

 using Microsoft.Web.Management.Server; ... ManagementAuthorization.Grant("MySiteUser, "My Web Site", false); 

如果在32位进程中运行,则此代码将引发exception,如果构build为64位,则运行良好:

 System.Runtime.InteropServices.COMException未处理
  消息=文件名:\\?\ C:\ Windows \ system32 \ inetsrv \ config \ administration.config
错误:configuration节“system.webServer / management / authorization”无法被读取,因为它缺less一个节声明

但是,使用Microsoft.Web.Administration程序集和名称空间执行的其他服务器pipe理任务在32位进程中工作得很好,例如:

 using Microsoft.Web.Administration; .... int iisNumber = 60000; using (ServerManager serverManager = new ServerManager()) { var site = serverManager.Sites.Where(s => s.Id == iisNumber).SingleOrDefault(); if (site != null) { site.Stop(); } } 

这两个程序集都出现在GAC中,并且是纯粹的MSIL(即使有一个COM互操作层直接与IIS7的底层pipe理机制对话)。

底层configuration文件applicationHost.configadministration.config只对64位编辑器(例如notepad.exe或NotePad2.exe)可见,我怀疑这就是为什么我的代码无法通过Microsoft.Web.Management修改administration.config Microsoft.Web.Management

为什么Microsoft.Web.Administration允许我在32位进程中读取/修改applicationHost.config ,但如果在64位进程中运行, Microsoft.Web.Management只能读取/修改administration.config

我无法将我的项目重新编译为目标x64,因为依赖于我们没有源代码的32位COM库。 我可以构build一个工作,这将涉及打电话给一个进程外64位WCF应用程序(或一些类似的东西),但不愿意。

经过一番挖掘,看起来这是一个错误:

这个论坛主题和Carlos Aguilar的一篇文章解释了所有:

http://forums.iis.net/p/1157779/1956471.aspx

现在我明白了这个问题,卡西尼是一个32位进程,结合我们配置中的一个错误,使我们尝试加载“重定向”的syswow(而不是system32),这是我们无法找到的原因administration.config。 在64位的过程中运行缓解问题,因为没有“魔术”重定向,我们去正确的文件夹。

任何32位进程都会遇到这个问题。