我正在编写一些代码来允许用户远程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.config
和administration.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位进程都会遇到这个问题。