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

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

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

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

IIS 7使用Microsoft.Web.Administration组件和ServerManager类进行管理。

此外,IIS 6无法同时运行64位和32位工作进程(请参阅此MSDN博客 )。 因此,对于IIS 6,将Enable32BitAppOnWin64设置为true意味着所有工作进程(所有应用程序池)都作为32位进程运行。

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

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

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

因此,这里有一些代码为IIS 6和IIS 7设置Enable32BitAppOnWin64 (请注意,您必须在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"); } 

我还要提一下,也有可能为IIS 7使用元数据库API。 在Windows Server 2008操作系统上,您可以安装名为“IIS 6管理兼容性”的角色服务。 此角色服务使您可以使用“旧”IIS 6 API来管理IIS 7。

如果“IIS 6管理兼容性”是一个选项,您可以更改functionEnable32BitAppOnWin64IIS7 ,如下所示:

 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程序集。

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

IIS应用程序池:更改程序设置