再談 IIS 與 ASP.NET 網站自動安裝設定 - 使用 PowerShell
4 |
先前整理過用 PowerShell 設定 IIS 的技巧,將原本 GUI 操作轉成指令檔,可以減少人為操作失誤的風險,並能實現自動化部署的理想。
最近又遇到類似需求,多學會一些安裝 IIS 與設定資料夾權限技巧,再整理一篇筆記溫故知新。
使用 PowerShell 安裝 IIS
如果是全新 Windows 主機,連 IIS 都沒裝,部署時是否也可以用 PowerShell 自動安裝呢?
沒問題。
有兩種選擇,Enable-WindowsOptionalFeature 與 Install-WindowsFeature。
Eable-WindowsOptionalFeature 的支援範圍比較廣,Windows Server 2012+ 及 Win8 或 Win10 都可以用,Install-WindowsFeature 屬於 ServerManager module,只限 Windows 2008R2 以後的 Server 版本才有,二者的執行效果相同。參考
例如:Enable-WindowsOptionalFeature -Online -FeatureName IIS-WindowsAuthentication
或 Install-WindowsFeature Web-Windows-Auth
會為 IIS 加入 Windows 驗證功能。問題在於 IIS-WindowsAuthentication/Web-Windows-Auth 這些名稱要怎麼取得?
如果是 Windows Server,有個好方法是借用 Get-WindowsFeature | where { $_.Name -like 'Web*' }
列出 IIS 相關功能,它呈現的文字說明與分類結構會對映到安裝功能 GUI,應不難理解。
另外一種做法是拿香跟著拜,找一台可以正常運作的 IIS,看看上面裝了哪些功能,產生安裝清單,照著裝準沒錯。我們改以 Enable-WindowsOptionalFeature 為例,執行以下指令產生安裝指令檔。(註:建議加註 -All 參數,若所依賴的基礎功能未安裝會一併安裝)
Get-WindowsOptionalFeature -Online | where {$_.State -eq "Enabled" -and $_.FeatureName -like "*IIS*" } | foreach { "Enable-WindowsOptionalFeature -Online -FeatureName $($_.FeatureName) -All" } > InstallIIS.ps1
新增 AppPool 與 Web Application
上回是用 New-Item 'IIS:\Site\Default Web Site' 新增網站,這次我學到更方便的指令: New-AppPool 與 New-WebApplication。 語法範例如下:
New-WebAppPool -Name "MyWebApp" -Force
New-WebApplication -Name ADHelpdesk -Site 'Default Web Site' -PhysicalPath D:\WWW\MyWebApp -ApplicationPool MyWebApp -Force
比起 New-Item 寫法直覺很多。
設定目錄權限
安裝網站時經常要設定特定資料夾的寫入權限,例如:App_Data、Log 資料夾等,這部分也一併用指令檔完成才算得上自動化。
這當然也難不倒 PowerShell, 原理是用 Get-Acl 取得指定資料夾的現有存取控制清單(ACL),New-Object 新建新的檔案存取規則物件- System.Security.AccessControl.FileSystemAccessRule 讓 IIS AppPool\AppPoolName 具有 Full Control 或 Modify 權限(參考:FileSystemRights、 檔案權限詳解)。 呼叫 SetAccessRule 將檔案存取規則物件加入 ACL,再呼叫 Set-Acl 變更資料夾的 ACL 權限設定。
舉個實例比較清楚,以下 PowerShell 會授與 IIS AppPool\MyWebApp 帳號讀寫 D:\WWW\MyWebApp\App_Data 及 D:\Logs 資料夾的權限:
$perm = "IIS AppPool\MyWebApp","Read,Modify","ContainerInherit,ObjectInherit","None","Allow"
$accRule = New-Object System.Security.AccessControl.FileSystemAccessRule $perm
$acl = Get-Acl D:\WWW\MyWebApp\App_Data
$acl.SetAccessRule($accRule)
$acl | Set-Acl D:\WWW\MyWebApp\App_Data
$acl = Get-Acl X:\Logs
$acl.SetAccessRule($accRule)
$acl | Set-Acl X:\Logs
結語
以上示範再次證明,這年頭在 Winows 上做事,不會寫 PowerShell 當場輸人一截呀! 還不會的同學快點趕進度,我有份 PowerShell 小抄可以借你看(遞)。
【參考文件】
- Automating IIS Feature Installation with Powershell
- Different ways for installing Windows features on the command line
This article demostrating how to use PowerShell to install IIS features, create app pool and web application and set permission of folders.
Comments
# by C.C
有兩種選擇,Eable-WindowsOptionalFeature 與 Install-WindowsFeature。 typo: Enable-.... 另外想請教,若使用 UI 介面進行安裝時 在開啟或關閉 Windows 功能的視窗直接點選 Internet Information Service 會帶入預設需安裝的選項 不知是否可能使用 Command 的方式抓出這些預設值有哪些來進行安裝呢?
# by Jeffrey
to C.C,可參考文章所示範的做法,找一台機器用開啟或關閉 Windows 功能視窗安裝好預設 IIS 選項,Get-WindowsOptionalFeature -Online | where ... 轉成 Enable-WindowsOptionalFeature 指令。
# by 大站台手工改設好想死
黑大: 請問可以補充一個AppPool改用其他身分密碼入登入的設定嗎?
# by Jeffrey
to 大站台手工改設好想死, 試試這個 https://stackoverflow.com/a/26391894/288936