我想使用C#更改 Enable32BitAppOnWin64 属性。我知道与 IIS 6 和 IIS 7 进行交互的方式不同。但我需要两个版本的解决方案。
答案 0 :(得分:11)
以编程方式管理IIS 6和IIS 7存在一些差异。
使用DirectoryEntry
类和元数据库数据库API以编程方式管理IIS 6。
使用Microsoft.Web.Administration
程序集管理IIS 7
和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.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)
不是试图重现别人的答案,而是指向前一位提问者的链接以及他们收到的答案。我希望他们有所帮助。