【问题标题】:How to enable 32-bit applications mode in IIS 6 and IIS 7 using c#如何使用 c# 在 IIS 6 和 IIS 7 中启用 32 位应用程序模式
【发布时间】:2012-04-27 13:30:58
【问题描述】:

我想使用 C# 更改 Enable32BitAppOnWin64 属性。我知道与 IIS 6IIS 7 交互的方式是不同的。但我需要两个版本的解决方案。

【问题讨论】:

  • 没有通用的方法,因此也没有通用的解决方案。您必须为 IIS 6 做一些事情,而为 IIS 7 做一些完全不同的事情。
  • @Lex Li 当然,我知道。正如我在问题中提到的,我需要两个版本的 2 个单独的解决方案。感谢您的评论

标签: c# iis-7 iis-6 32bit-64bit


【解决方案1】:

以编程方式管理 IIS 6 和 IIS 7 存在一些差异。

IIS 6 使用 DirectoryEntry 类和元数据库 API 以编程方式进行管理。

IIS 7 使用Microsoft.Web.Administration 程序集进行管理 和ServerManager 类。

此外,IIS 6 不能同时运行 64 位和 32 位工作进程 同时(见MSDN BLOG)。 因此,将 IIS 6 的 Enable32BitAppOnWin64 设置为 true 意味着所有工作人员 进程(所有应用程序池)作为 32 位进程运行。

IIS 7 能够同时运行 64 位和 32 位工作进程。 这意味着您为特定的应用程序池设置了Enable32BitAppOnWin64 并且不适用于所有应用程序池。

您还必须检测 IIS 的版本才能使用正确的 API。 这可以通过从注册表中读取以下 DWORD 值来完成 (更多信息见Learn IIS):

HKLM\Software\Microsoft\InetStp\MajorVersion and
HKLM\Software\Microsoft\InetStp\MinorVersion

所以,这里有一些代码为 IIS 6 和 IIS 7 设置 Enable32BitAppOnWin64 (请注意,您必须参考Microsoft.Web.AdministrationSystem.DirectoryServices Visual Studio 项目中的程序集):

private static Version GetIISVerion()
{
  using (RegistryKey inetStpKey = 
    Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp"))
  {
    int majorVersion = (int)inetStpKey.GetValue("MajorVersion");
    int minorVersion = (int)inetStpKey.GetValue("MinorVersion");

    return new Version(majorVersion, minorVersion);
  }
}

private static void Enable32BitAppOnWin64IIS7(string appPoolName)
{
  Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for {0} (IIS7)", appPoolName);
  using (ServerManager serverMgr = new ServerManager())
  {
    ApplicationPool appPool = serverMgr.ApplicationPools[appPoolName];
    if (appPool == null)
    {
      throw new ApplicationException(String.Format("The pool {0} does not exist", appPoolName));
    }

    appPool.Enable32BitAppOnWin64 = true;
    serverMgr.CommitChanges();
  }
}

private static void Enable32BitAppOnWin64IIS6(string serverName)
{
  Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for IIS6");
  using (DirectoryEntry appPools = 
    new DirectoryEntry(String.Format("IIS://{0}/W3SVC/AppPools", serverName)))
  {
    appPools.Properties["Enable32BitAppOnWin64"].Value = true;

    appPools.CommitChanges();
  }
}    

public static void Enable32BitAppOnWin64(string serverName, string appPoolName)
{
  Version v = GetIISVerion(); // Get installed version of IIS

  Console.Out.WriteLine("IIS-Version: {0}", v);

  if (v.Major == 6) // Handle IIS 6
  {
    Enable32BitAppOnWin64IIS6(serverName);
    return;
  }

  if (v.Major == 7) // Handle IIS 7
  {        
    Enable32BitAppOnWin64IIS7(appPoolName);
    return;
  }

  throw new ApplicationException(String.Format("Unknown IIS version: {0}", v.ToString()));
}


static void Main(string[] args)
{
  Enable32BitAppOnWin64(Environment.MachineName, "DefaultAppPool");
}

我还应该提到,可以使用元数据库 API 也适用于 IIS 7。在 Windows Server 2008 操作系统上,您可以 安装一个名为“IIS 6 Management Compatibility”的角色服务。这 角色服务使您能够使用“旧”的 IIS 6 API 来管理 IIS 7。

如果您可以选择“IIS 6 管理兼容性”,请更改 函数Enable32BitAppOnWin64IIS7如下:

private static void Enable32BitAppOnWin64IIS7(string serverName, string appPoolName)
{
  Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for {0} (IIS7)", appPoolName);

  using (DirectoryEntry appPools = 
    new DirectoryEntry(String.Format("IIS://{0}/W3SVC/AppPools/{1}", serverName, appPoolName)))
  {
    appPools.Properties["Enable32BitAppOnWin64"].Value = true;

    appPools.CommitChanges();
  }
}

当然,那么您不必引用Microsoft.Web.Administration 程序集。

【讨论】:

    【解决方案2】:

    这里不是试图复制别人的答案,而是指向以前的提问者和他们收到的答案的链接。我希望他们对您有所帮助。

    IIS Application Pool: change settings programmatic

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2023-01-31
      • 1970-01-01
      • 2011-02-26
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多