3

次の方法で、IIS 7 アプリケーション プールを開始/停止しようとしています。ローカル システムではこれを正常に実行できますが、これを Windows 2008 サーバーに配置すると、サービスを停止しようとしたときにのみエラーが発生します。開始は正常に機能します。

[NoCache]
public ActionResult EnableAppPool(Models.ActionRequest actionRequest)
{
    try
    {
        if (ModelState.IsValid && actionRequest.ActionRequestPassword == ConfigurationManager.AppSettings["NewsfeedAdminPassword"])
        {
            bool enableNewsfeed = false;
            enableNewsfeed = Convert.ToBoolean(actionRequest.EnableNewsfeedAppPool);

            string sPath = "IIS://" + ConfigurationManager.AppSettings["MachineName"] + "/W3SVC/AppPools/" + ConfigurationManager.AppSettings["AppPoolName"];
            Console.WriteLine(sPath);
            DirectoryEntry w3svc = new DirectoryEntry(sPath);
            if (enableNewsfeed)
            {
                w3svc.Invoke("Start");
            }
            else
            {
                w3svc.Invoke("Stop");
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return null;
}

エラーは次のとおりです。

アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED)) 説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.UnauthorizedAccessException: アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))

ASP.NET は、要求されたリソースへのアクセスを許可されていません。リソースへのアクセス権を ASP.NET 要求 ID に付与することを検討してください。ASP.NET には、アプリケーションが偽装されていない場合に使用されるベース プロセス ID (通常、IIS 5 または IIS 6 および IIS 7 のネットワーク サービスの {MACHINE}\ASPNET、および IIS 7.5 の構成済みアプリケーション プール ID) があります。アプリケーションが を介して偽装している場合、ID は匿名ユーザー (通常は IUSR_MACHINENAME) または認証された要求ユーザーになります。

これはアクセス許可の問題であることは認識していますが、何にアクセスを許可しなければならないのか、どのユーザーに対してアクセスを許可する必要があるのか​​ わかりません。

参考までに: IIS 6 メタベースと WMI の互換性は既に有効にしています

4

1 に答える 1

1

コードを実行している ID には、アプリ プールを開始および停止するためのアクセス権がありません。以下は記事からの引用です

「Active Directory と通信するには、ネットワーク セキュリティ、ビジネス ルール、および技術的な制約を考慮する必要があります。ASP.NET ページから Active Directory コードを使用している場合は、コードに適切なレベルのアクセス許可があることを確認する必要があります。開発目的または概念実証のために、ASP.NET レベル (web.config 内) および IIS レベルで偽装を有効にすることができ、IIS サーバーとディレクトリ ドメイン コントローラーが同じマシン上に存在する場合、これはただし、これらのエンティティが同じサーバー上に配置されていない場合 (実稼働環境にないため)、コードを偽装クラス (Zeta Impersonator などのトークンの下でディレクトリ呼び出しを実行する) にラップすることができます。なりすましユーザー。」

http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C#3

そして、この記事では、差分 (おそらくより高いレベルのアクセス ユーザー) コンテキストでアプリケーション内のコードを実行する方法を明確に説明しています。

http://support.microsoft.com/kb/306158

于 2012-07-13T04:08:40.363 に答える