由於我們許多專案都用 MSDeploy 進行部署,但最近因為 IIS 伺服器上的架構有所變更,卻引發專案進行部署時發生許多 NTFS 權限上的錯誤,也就是當網站部署之後,連本機系統管理者都無法透過檔案總管進入目錄的窘境,剛花了一個多小時研究,終於找到徹底解決此問題的方法。
※ ASP.NET 網站專案的發佈方式變更
注意:如果是 ASP.NET 網站專案 發佈到 IIS 上,必須先看懂【ASP.NET 網站專案如何利用 MSDeploy 工具進行部署】這篇文章的部署方式,然後再看【使用 MSDeploy 部署網站時如何避免刪除遠端網站的檔案】這篇文章新增指令列參數的方法。因為要避免 msdeploy.exe 設定遠端 IIS 站台目錄的 NTFS 權限,只要加上一個參數即可解決。
假設我們現在的指令如下:
DemoSite_Deploy.deploy.cmd /T "/M:https://1.1.1.1:8172/MSDeploy.axd" /U:admin /P:P@ssw0rd -enableRule:DoNotDeleteRule "-setParam:'IIS Web Application Name'='SiteName'" -allowUntrusted
修改過後的指令如下:
DemoSite_Deploy.deploy.cmd /T "/M:https://1.1.1.1:8172/MSDeploy.axd" /U:admin /P:P@ssw0rd -enableRule:DoNotDeleteRule "-setParam:'IIS Web Application Name'='SiteName'" -allowUntrusted "-skip:'objectName'='setAcl'"
※ ASP.NET 應用程式專案的發佈方式變更
如果你的專案類型是 ASP.NET 應用程式,那麼則直接透過修改「專案檔」的方式即可解決此問題,步驟如下:
1. 先編輯專案檔 ( Visual Studio Tip: Editing Project Files / HOW TO:編輯專案檔 )
如下圖是安裝 PowerCommands for Visual Studio 2010 擴充套件才有的選單項目:
2. 選擇一個適當的 <PropertyGroup> 區段加入以下項目:
<IncludeSetAclProviderOnDestination>false</IncludeSetAclProviderOnDestination>
如下圖示:(點圖可放大)
設定完成之後,之後透過「單鍵發行」就可以安全的將網站部署到遠端主機了!
其他研究心得
經過本次問題處理的過程額外的收穫就是知道 MSDeploy 執行時的身份是 LOCAL SERVICE,所以權限挺大的,可以改本機任意檔案的 NTFS 權限,也因為這樣所以覺得有點困擾,因為部署的時候會把我們原本設定好的目錄權限都覆蓋掉。
相關連結