如何使用c#在IIS 6和IIS 7中启用32位应用程序模式

时间:2012-04-16 07:50:49

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

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

2 个答案:

答案 0 :(得分:11)

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

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

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

此外,IIS 6无法同时运行64位和32位工作进程 同时(见MSDN BLOG)。 因此,为IIS 6设置Enable32BitAppOnWin64true意味着所有工作人员 进程(所有应用程序池)作为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.Administration 和Visual Studio项目中的System.DirectoryServices程序集):

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管理兼容性”的角色服务。这个 角色服务使您可以使用“旧”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程序集。

答案 1 :(得分:0)

不是试图重现别人的答案,而是指向前一位提问者的链接以及他们收到的答案。我希望他们有所帮助。

IIS Application Pool: change settings programmatic