0

サーバー上にある中央の git リポジトリへのプッシュが、Windows Server 2012 上の IIS 8 を介して実行されているサイト フォルダーに変更を自動的にプッシュするセットアップを作成しています。

これは簡単です。以下は機能しています。IIS上で独自に実行されているサイトであるBonobo Git Serverがあります。Bonobo によって管理されている中央リポジトリに post-receive フックがあります。次に、このフックは、変更をサイトのフォルダーのリポジトリにプルするバッチ ファイルを実行します。これが可能になったのは、当然のことながら、受信後フックが Bonobo のアプリ プール、つまり「IIS AppPool\GitServerAppPool」に割り当てられた ID として実行され、その ID にサイトのフォルダーに対する変更権限を与えたためです。

したがって、コードはうまくプッシュおよびプルされます。問題は、プロジェクトが Python でコーディングされており、ISAPI_WSGI を使用して IIS に統合されているため、アプリケーション プールをリサイクルせずにコードをリロードするメカニズムがないことです。

受信後スクリプトにアプリケーション プールをリサイクルする権限を与えることは困難であることがわかっています。

というわけで、問題はこれです。-受信後スクリプトは「IIS AppPool\GitServerAppPool」として実行されているため、管理者アカウントが必要なため、他のアプリ プールを再起動できません。- appcmd またはスケジュールされたタスクを実行するための RunAs の使用は、UAC を渡すためにパスワードの入力が必要になるため、機能しません。- 最初にパスワードを入力するために AppPoolIdentity としてログインできないため、runas で /savecreds を使用しても機能しません。

そして、私は立ち往生しています。次のいずれかが何らかの形で可能な場合、それらは機能するはずですが、それらを実行する方法が見つかりません.

  1. アプリ プールをリサイクルするために必要なアクセス許可を下げる何らかの方法。
  2. runas コマンドにパスワードを含める何らかの方法 (スクリプトは外部からアクセスできないため、これで問題ありません)
  3. コマンドを GitServerAppPool として手動で実行して、/savecreds を使用してバッチ ファイルを 1 回実行し、パスワードを再度入力する必要がないようにする方法

a、b、またはcの方法を知っている人、または別の解決策がある人はいますか?

機能する解決策の 1 つは、管理者アカウントとして実行されているアプリ プールで git サーバーを実行することです。ただし、IIS セキュリティに関する 1 つのルールを回避するために完全な管理者アクセス権を与え始めるのは、UAC の要点に反しているように思えます。もちろん、必要ならそうします。

助けや提案をありがとうございました。

ところで、これを行う理由は、世界中に散らばっている他の開発者に、私の干渉やサーバーへの実際のアクセスなしに、変更をステージング サーバーに直接プッシュできるようにするためです。そのため、アプリ プールを手動で再起動すると、目的が無効になります。

4

2 に答える 2

0

ピーターの答えに取り組んで、当分の間、よりハッキーな解決策を思いつきました。より良い解決策は上記の Peter のものですが、セットアップにはさらに多くの専門知識が必要です。

受信後のバッチ ファイルで、次のように eventcreate を呼び出して、Windows イベント ログにイベントを作成します。

call eventcreate /S MACHINE_NAME /u Administrator /p password /t information /id 500 /d "A git post-receive hook has updated site code"

MACHINE_NAME はサーバーのマシン名です。EVENTCREATE には管理者権限が必要なため、これを含めることが重要です。たまたま、ユーザー名とパスワードをパラメーターとして指定することで、イベントをリモートで作成する機能があります。マシン名を含めると、ユーザー/パスを提供するために必要なリモートモードになるようです。

したがって、これにより、任意のソースからの管理者資格情報を使用してイベントを作成できます。

次にできることは、このイベントをリッスンするタスク スケジューラでタスクを作成することです。それを開き、タスクを作成し、ソースとして「EventCreate」を使用し、上記のコマンドで指定したイベント ID (上記の例では 500 ですが、任意の数字を使用できます) をトリガーにイベントをリッスンさせます。タスクを管理者として実行するように設定し、昇格された権限で実行できるようにしてください。

これを含めてタスクにバッチを実行させます:

call %systemroot%\system32\inetsrv\appcmd.exe recycle apppool /apppool.name:APPPOOLNAME

大文字の APPPOOLNAME のみを、リサイクルするプールの名前に置き換えます。

Peterが提案したように、実際のサービスを作成することに対するこれの欠点は次のとおりです。

  1. 管理者のパスワードを平文でバッチ ファイルに書き込む必要があるため、他のユーザーがこのファイルを入手しないようにしてください。
  2. 理論的には、別のアプリが同じ ID でイベントを作成し、アプリ プールがリサイクルされる可能性があります。(この問題を解決するカスタム ソース名を指定すると、eventcreate が失敗するようです)
  3. セットアップを複雑にする多くの可動部品があります
于 2013-12-25T05:03:00.357 に答える