3

.Netに、他のアプリケーションのさまざまな管理/構成を行うアプリケーションがあります。アプリプールを停止および開始できる必要があります。私はこれを達成しましたが、アプリプールをローカルシステムとして実行している場合に限ります(これは一般的に悪い考えとして受け入れられています)。

最初は(適切なProcessStartInfoオブジェクトを使用して)Process.Startでappcmd.exeを開始しましたが、最終的には終了コード-1073741502になります。さらに調査すると、Windows SDKを使用してデバッグする必要があることがわかりました。これは、アセンブリが読み込まれないため、Microsoft.Web.Administration名前空間でより単純なソリューションのように見えるものを見つけました。

私は以下のコードを使用しますが、実行中のAppPoolにはローカルシステムのIDが必要なようです(そうでない場合は取得しますSystem.UnauthorizedAccessException)-特権の低いアカウントで開始/停止する方法はありますか(アプリケーションIDを使用することをお勧めします)-一時的に権限を上げることもできます。

    Dim serverManager As New ServerManager()
    Dim applicationPoolCollection As ApplicationPoolCollection = serverManager.ApplicationPools

    For Each applicationPool As ApplicationPool In applicationPoolCollection

        If applicationPool.Name = appPoolName Then
            applicationPool.Stop()
            applicationPool.Start()
        End If

    Next

IDとしてカスタムアカウントを設定しましたが、そのユーザーの最小ACLが何である必要があるかを理解できません。テストとして、ユーザーをローカル管理者グループに追加しましたが、それでも取得できSystem.UnauthorizedAccessExceptionます。これは、ユーザーに特定のアクセス許可を構成する必要があることを示していますが、これが何であるか、またはその方法がわかりません。誰か助けてもらえますか?

問題はここでも説明されています

4

2 に答える 2

4

これを行う唯一の方法は、コードの実行に使用されるアカウント(Microsoft.Web.Administrationを使用)にIISで「ランタイム操作」を実行するための適切なアクセス許可があり、デフォルトでは管理者とSYSTEMのみが含まれている場合です。一般的に正しく指摘しているように、Webからのそのレベルの許可を公開することは悪い考えです。

代わりにおそらく行うべきことは、アプリケーションプールまたは高特権で実行する他の方法を作成することですが、ローカルでのみアクセスできるように保護され(たとえば、IPおよびドメイン制限を使用)、追加レベルの承認チェックを使用します(たとえば、アプリケーションからの呼び出しのみを許可し、可能な限り最小限のコードと必要な最小限のサーフェスを実行するように制約されます。たとえば、ユーザーに属するプールのみをリサイクルするなどです。こうすることで、Webアプリケーションが危険にさらされた場合にダメージははるかに抑制されます。

さて、好奇心旺盛な方のために…以下は「サポートされていない」ので、使用せず、情報提供のみを目的として提供してください。ServerManager
で構成を読み取る ために使用するAPIはAHADMINと呼ばれ、たとえば次のようなACLを使用する場合、「構成を読み取るのに十分なハック」を行うことができます。

Cd C:\Windows\System32\inetsrv\config  
icacls . /grant yourUser:(R)  
icacls redirection.config /grant yourUser:(R)  
icacls applicationHost.config /grant yourUser:(R)  

その時点から、そのユーザーで構成を読み取ることができます。この時点では、暗号化キーも個別に保護されているため、暗号化されたプロパティの読み取りに失敗します。ACLを変更することはおそらくありませんが、他のすべては読み取り可能です(Stateなどのランタイムプロパティを除く)。非特権アカウントへの書き込みアクセスを許可しないでください。これにより、特権の昇格が非常に簡単になります(たとえば、SYSTEMとして実行されるアプリケーションプールを作成し、それをランダムディレクトリにリンクして、コードをSYSTEMとして実行できるようにすることができます)。

ここで、ランタイム状態に戻ります。そのために、 RSCA (ランタイムステータスおよび制御API)と呼ばれるAPIを使用し、それ自体もSYSTEMまたは管理者としてのみ実行されるように保護されています。それをハックしてください、それも変更するのは悪い考えです。しかし、簡単に言えば、これはサポートされておらず、システムに問題を簡単に引き起こす可能性があります。

于 2012-11-14T16:18:57.380 に答える
1

@CarlosAgの回答を使用すると、次の解決策が機能します。

  1. 新しいユーザーを作成し、それらをAdministratorsグループに配置します

  2. 再起動コードを実行するWebサービスを作成し、作成したユーザーとして実行されている独自のアプリケーションプールに配置します(キューの長さなど、適切なアプリプールのプロパティを構成します)

    a。Webメソッド(またはbegin_reqest)に以下のコードを入れて、外部から呼び出されないようにします(IISでもこれを行う方法は他にもあると思いますが、これが私が見つけた最も速いメソッドでした)

    b。必要に応じて、Webサービスコードに認証を追加します(使用できるシングルサインオンサービスがあります)。

  3. ApplicationIdentityの下のアプリプールで実行されているWebサイトからこのサービスを参照します

これは機能します。

コード:

     If Not HttpContext.Current.Request.IsLocal Then
         Const msg As String = "Only local requests are allowed"
         log4net.LogManager.GetLogger(GetType(Global_asax)).Fatal(msg)
         Throw New Exception(msg)
     End If
于 2012-11-15T14:04:27.617 に答える