2013-12-24 45 views
0

我創建一個設置,其中一個推到我的中央混帳回購協議,位於我的服務器上,會自動將其通過IIS 8的Windows服務器上運行的變化,以我的網站文件夾,回收應用程序池作爲應用程序池標識

這很簡單。以下是工作: 我有Bonobo Git服務器,它自己在IIS上運行的網站。我在Bonobo管理的中央回購站有一個後接收鉤。然後,該鉤子運行一個批處理文件,將更改拖入站點文件夾的回購站。 這是可能的,因爲post-receive鉤子自然會作爲分配給Bonobo App Pool的身份運行,即「IIS AppPool \ GitServerAppPool」,並且我在該站點的文件夾上給出了該身份修改權限。

所以代碼被推動和拉好。問題在於該項目使用Python進行編碼並使用ISAPI_WSGI集成到IIS中,因此我沒有任何機制來重新加載代碼而無需循環使用App Pool。

給後收到腳本的權限,以回收應用程序池被證明是困難的。

所以,問題是這樣的。 - 後接收腳本作爲「IIS AppPool \ GitServerAppPool」運行,因此無法重新啓動其他應用程序池,因爲這樣做需要管理員帳戶。 - 任何運行appcmd或計劃任務的RunAs都不起作用,因爲它需要輸入密碼才能通過UAC。 - 在runas上使用/ savecreds不起作用,因爲我無法以AppPoolIdentity身份登錄,以便首先輸入密碼。

所以我卡住了。如果以下任何一種形式或形式都有可能,他們應該可以工作,但我找不到辦法做到這一點。

  1. 某些降低迴收應用程序池所需權限的方法。
  2. 在runas命令中包含密碼的一些方法(該腳本不會被外部世界訪問,所以我可以忍受這一點)
  3. 某種方式手動運行命令作爲GitServerAppPool,以便我可以運行批量文件一次/ savecreds,而不必再次輸入密碼

任何人都知道如何做a,b或c,或有另一種解決方案?

一個解決方案,它的工作是對運行爲管理員帳戶的應用程序池運行git的服務器。這似乎與UAC的觀點相反,即開始給予事物充分的管理員訪問權限來解決IIS安全性的一個規則。當然,如果我必須,我會的。

非常感謝您的任何幫助或建議。

順便說一句,這樣做的原因是爲了給我的其他開發者,分散在世界各地,以推動其變化直接到他們的臨時服務器沒有我的干擾,並沒有實際訪問服務器的能力。因此,手動重新啓動應用程序池會導致失敗。

回答

0

寫一個簡單的Windows服務,以另一種機制或者監控特定的文件目錄更改或收聽被觸發。然後它回收有問題的應用程序池。

有足夠的權限來回收池的帳戶下運行服務。

確保此過程不能由外部人員發起。

+0

這當然似乎是最合適的解決問題的方法更大量的移動部件。批處理文件中沒有密碼,沒有不適當的權限。我真的採納了你的想法,並制定了一個類似的解決方案,避免了開銷,並學習如何做到這一切。我的更哈克解決方案是在我自己的答案下面給他人蔘考。謝謝您的幫助! – Owen

0

解決彼得的答案我想出了一個更加黑客的解決方案,暫時會做。更好的解決方案將是彼得的上述,但它需要更多的專業知識來設置。

在你後收到的批處理文件,調用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需要管理員權限才能將其包含在內。恰巧它有能力通過提供用戶名和密碼作爲參數來遠程創建事件。包括機器名似乎把它放在遠程模式,這是需要提供用戶/通行證。

因此,這允許您使用任何來源的管理員憑據創建事件。

然後,您可以在Task Scheduler中創建一個任務來監聽此事件。打開它,創建一個任務,並使觸發器偵聽一個事件,並將「EventCreate」作爲源,並在上面的命令中提供事件ID(在上例中爲500,但可以使用任意數字)。確保將任務設置爲以管理員身份運行,並讓其以提升的權限運行。

有任務運行批處理與此包括:

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

與要回收池的名稱僅更換大寫APPPOOLNAME。

在創建一個真正的服務爲彼得提出的缺點這是:

  1. 您需要在批處理文件中明文寫admin的密碼,所以一定要確保沒有其他人得到了他們的手放在這個文件。
  2. 從理論上講,其他應用程序有可能使用相同的ID創建事件並導致您的應用程序池回收。 (eventcreate似乎失敗,如果我提供一個自定義源名稱,這將消除這一問題)
  3. 它有一個複雜的設置
+0

**不要**以明文形式輸入密碼。無處不在。永遠。 – Michael

+0

儘管我同意這不是好的做法,但它與我的代碼配置文件中的純文本內存數據庫密碼無異,這是很常見的做法,並且允許訪問我的最敏感數據。如果有人發現自己可以訪問此文件,那麼我的安全性已經被破壞。 – Owen