Enable32BitAppOnWin64プロパティを変更したい。 IIS 6とIIS 7とのやりとりの仕方が違うことを知っています。私は両方のバージョンのソリューションが必要です。C#を使用してIIS6とIIS 7で32ビットアプリケーションモードを有効にする方法#
答えて
プログラム的に管理するにはいくつかの違いがあります6およびIIS 7
をIIS 6がプログラムDirectoryEntry
クラスとメタベースデータベースAPIを使用して管理されているIIS。
IIS 7はMicrosoft.Web.Administration
アセンブリ とServerManager
クラスを使用して管理されます。
さらにIIS 6は、64ビットと32ビットのワーカープロセスを同時に実行することはできません。 (MSDN BLOG参照)。 IIS6のEnable32BitAppOnWin64
〜true
を設定すると、すべてのワーカー プロセス(すべてのアプリケーションプール)が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.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");
}
私もメタベース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
アセンブリを参照する必要はありません。
elsesの回答を再現しようとするのではなく、以前の質問者へのリンクと回答を受け取ります。彼らが役に立ったらいいな
一般的な方法はないため、共通の解決策はありません。あなたはIIS 6のために何かをしなければなりません、そしてIIS 7のために全く異なる何かをする必要があります。 –
@Lex Li確かに、私はそれを知っています。私が問題に言及したように、私は2つのバージョンのための2つの別々のソリューションが必要です。ご意見ありがとうございます –