4

C#を使用してEnable32BitAppOnWin64プロパティを変更したい。IIS6とIIS7の対話方法が異なることを知っています。しかし、両方のバージョンのソリューションが必要です。

4

2 に答える 2

12

IIS6とIIS7のプログラムによる管理にはいくつかの違いがあります。

IIS 6は、DirectoryEntryクラスとメタベースデータベースAPIを使用してプログラムで管理されます。

IIS 7は、Microsoft.Web.AdministrationアセンブリとServerManagerクラスを使用して管理されます。

さらに、IIS 6は64ビットと32ビットの両方のワーカープロセスを同時に実行することはできません(このMSDNブログを参照)。したがって、IIS 6に設定Enable32BitAppOnWin64するtrueと、すべてのワーカープロセス(すべてのアプリケーションプール)が32ビットプロセスとして実行されます。

IIS 7は、64ビットと32ビットのワーカープロセスを同時に実行できます。これはEnable32BitAppOnWin64、すべてのアプリケーションプールではなく、特定のアプリケーションプールに設定することを意味します。

また、正しいAPIを使用するには、IISのバージョンを検出する必要があります。これは、レジストリから次のDWORD値を読み取ることで実行できます(詳細については、「IISの学習」を参照してください)。

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

したがって、Enable32BitAppOnWin64IIS6およびIIS7に設定するコードを次に示します(Visual StudioプロジェクトのアセンブリMicrosoft.Web.Administration とアセンブリを参照する必要があることに注意してください)。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");
}

また、IIS7のメタベースAPIを使用する可能性があることにも言及する必要があります。Windows Server 2008オペレーティングシステムでは、「IIS6管理の互換性」と呼ばれる役割サービスをインストールできます。この役割サービスを使用すると、「古い」IIS6APIを使用してIIS7を管理できます。

「IIS6管理の互換性」がオプションである場合は、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アセンブリを参照する必要はありません。

于 2012-04-21T11:35:25.113 に答える
0

他の誰かの回答を再現しようとするのではなく、以前の質問者と彼らが受け取った回答へのリンクをここに示します。お役に立てば幸いです。

IIS アプリケーション プール: プログラムによる設定の変更

于 2012-04-20T11:39:00.690 に答える