2012-04-16 1 views
4

Enable32BitAppOnWin64プロパティを変更したい。 IIS 6IIS 7とのやりとりの仕方が違うことを知っています。私は両方のバージョンのソリューションが必要です。C#を使用してIIS6とIIS 7で32ビットアプリケーションモードを有効にする方法#

+1

一般的な方法はないため、共通の解決策はありません。あなたはIIS 6のために何かをしなければなりません、そしてIIS 7のために全く異なる何かをする必要があります。 –

+0

@Lex Li確かに、私はそれを知っています。私が問題に言及したように、私は2つのバージョンのための2つの別々のソリューションが必要です。ご意見ありがとうございます –

答えて

11

プログラム的に管理するにはいくつかの違いがあります6およびIIS 7

をIIS 6がプログラムDirectoryEntryクラスとメタベースデータベースAPIを使用して管理されているIIS。

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

さらにIIS 6は、64ビットと32ビットのワーカープロセスを同時に実行することはできません。 (MSDN BLOG参照)。 IIS6のEnable32BitAppOnWin64trueを設定すると、すべてのワーカー プロセス(すべてのアプリケーションプール)が32ビットプロセスとして実行されていることを意味します。

IIS 7では、64ビットと32ビットのワーカープロセスを同時に実行できます。 つまり、特定のアプリケーションプール にはEnable32BitAppOnWin64を設定し、すべてのアプリケーションプールには適用しません。

正しいAPIを使用するには、IISのバージョンも検出する必要があります。 これは(詳細はLearn IISを参照)レジストリ から、次のDWORD値を読むことによって行うことができます。

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"); 
} 

私もメタベースAPIを使用する可能性があることを言及する必要がありますIIS 7用のもあります。 Windows Server 2008オペレーティングシステムでは、 ロールサービス「IIS 6管理互換性」をインストールできます。この 役割サービスは、次のように 機能Enable32BitAppOnWin64IIS7を変更するために、あなたが「6管理互換をIIS」オプションの場合はIIS 7.

を管理するために、「古い」IIS 6 APIを使用することができます

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アセンブリを参照する必要はありません。