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

Far*_*ker 4 c# iis-7 iis-6 32bit-64bit

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

Han*_*ans 11

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

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

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

此外,IIS 6无法同时运行64位和32位工作进程(请参阅此MSDN博客).所以设置Enable32BitAppOnWin64true为IIS 6意味着所有工作进程(所有应用程序池)正在运行32个的进程.

IIS 7能够同时运行64位和32位工作进程.这意味着您Enable32BitAppOnWin64为特定应用程序池而不是所有应用程序池设置.

您还必须检测IIS的版本才能使用正确的API.这可以通过从注册表中读取以下DWORD值来完成(有关更多信息,请参阅学习IIS):

HKLM\Software\Microsoft\InetStp\MajorVersion and
HKLM\Software\Microsoft\InetStp\MinorVersion
Run Code Online (Sandbox Code Playgroud)

因此,这里有一些Enable32BitAppOnWin64为IIS 6和IIS 7 设置的代码(请注意,您必须在Visual Studio项目中引用Microsoft.Web.AdministrationSystem.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");
}
Run Code Online (Sandbox Code Playgroud)

我还应该提一下,也可以使用IIS 7的配置数据库API.在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();
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,那么你不必参考Microsoft.Web.Administration组件.