为什么只有在64位进程中使用IIS7.5的Microsoft.Web.Management.dll才有效?

3
我正在编写一些代码,以允许用户远程管理IIS7。在幕后,这将向以下配置部分的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位进程运行该代码,则会抛出异常,但如果作为64位构建,则可以正常运行:

System.Runtime.InteropServices.COMException was unhandled
  Message=Filename: \\?\C:\Windows\system32\inetsrv\config\administration.config
Error: The configuration section 'system.webServer/management/authorization' cannot be read because it is missing a section declaration`

然而,使用Microsoft.Web.Administration程序集和命名空间执行其他服务器管理任务在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的底层管理机制进行通信)。

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

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

由于依赖于我们没有源代码的32位COM库,因此我无法重新编译我的项目以针对x64。我可以构建一个解决方案,其中涉及调用一个外部64位WCF应用程序(或类似的东西),但我宁愿不这样做。

1个回答

2

经过一番搜索,看起来这是一个bug:

这个论坛帖子和Carlos Aguilar的一篇文章解释了一切:

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

现在我明白了问题所在,问题是Cassini是一个32位进程,加上我们配置中的一个错误导致我们尝试加载“重定向”的syswow(而不是system32),这就是为什么我们找不到administration.config的原因。在64位进程中运行可以减轻问题的原因是没有“魔术”重定向,我们进入正确的文件夹。

任何32位进程都会遇到这个障碍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接