使用 PowerShell 控制 IIS

Posted by Ryan Tseng on 2018-04-06

以往在能夠碰到機器的情況底下(實體機器、虛擬機器…),我們通常都會選擇使用 IIS 的管理介面來幫助我們設定 IIS 的組態

由於最近在接觸 CI/CD,很多原本可以使用 UI 設定的組態都改用指令的方式來操作,讓我們在不透過任何人工的情況下,操作 IIS。

今天就用簡單的例子來介紹,我們怎樣使用 PowerShell 來幫助我們做到以下的工作。

  • 取得目前所有的站台
  • 取得所有應用程式集區 (Application Pool)
  • 建立應用程式集區
  • 建立站台 (Website)
    • 修改站台的實體路徑
    • 指定站台的應用程式集區
  • 停止/啟動站台

選擇編輯器

要撰寫 PowerShell 有很多工具可以選擇,我這邊推薦兩個可以撰寫 PowerShell 的編輯器給大家參考

  • Visual Studio Code
  • PowerShell ISE

取得所有的站台

1
2
3
# 要記得 Import WebAdministration Module
/> Import-Module WebAdministration
/> Get-Website

取得所有的應用程式集區

1
2
/> Import-Module WebAdministration
/> Get-IISAppPool

建立應用程式集區

建立一個名為 DemoAppPool 的應用程式集區

1
/> New-WebAppPool DemoAppPool | Set-ItemProperty -Name "managedRuntimeVersion" -Value "v4.0"

如果 Set-ItemProperty -Name "managedRuntimeVersion" -Value "" 這樣寫的話會是 Non-Managed 模式

建立站台

建立一個名為 DemoSite 的站台,並且指定其實體路徑、應用程式集區

1
/> New-Website -Name "DemoSite" -Port 8080 -PhysicalPath "E:\Documents" -ApplicationPool "DemoAppPool"

啟動/停止站台

1
2
/> Stop-Website "DemoSite"
/> Start-Website "DemoSite"

實際操作

將一包完整的站台佈署到連站台都還沒建立的 IIS

這邊有一點要注意一下,執行 powershell 控制 IIS 會需要管理者的權限才行,如果你發現直接執行 script 產生錯誤的話,使用 administrator 權限再執行一次即可。

  1. 準備一個還沒有建立好站台和應用程式集區的 IIS

  1. 準備好一段 powrshell script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Import-Module WebAdministration;

# Create Folder if not exists
if(!(Test-Path "E:\Temp\" -PathType Container)) {
New-Item "E:\Temp" -ItemType Directory
}

# Copy deploy files into target folder
Copy-Item ".\PublishOutput\*" -Destination "E:\Temp\" -Recurse -Force

# Create Application Pool if not exists
if(!(Test-Path "IIS:\AppPools\DemoAppPool" -PathType Container)) {
Write-Host "create app pool ..." -ForegroundColor Yellow;
New-WebAppPool -Name "DemoAppPool" | Set-ItemProperty -Name "managedRuntimeVersion" -Value "v4.0";
}

# Create Website
if(!(Test-Path "IIS:\Websites\DemoWebsite" -PathType Container)) {
Write-Host "create website ..." -ForegroundColor Yellow;
New-Website -Name "DemoWebsite" -ApplicationPool "DemoAppPool" -PhysicalPath "E:\Temp\" -Port 8080;
}
  1. 執行它

  2. 檢視結果

執行完 script 之後會發現應用程式集區以及站台都已經自動建立完成

打開瀏覽器看一下結果

小結

最近因為在公司撰寫的應用程式需要進行自動化的佈署,有幸讓同事抓去一起研究一下 CI/CD,之前都是使用現成的工具來做,但接觸了 powershell 之後,發現有很多系統的設定都可以使用它來幫我們達成,換言之,就算拿到一台空白完全沒有被碰過的伺服器你也可以撰寫一段 script 來建立所有的設定,相對於手動來說,會節省相當多的時間。

我想有機會的話仍然會多去點一些 DevOps 的技能,相對於開發來說,也可以說是一個相當有趣的領域呢!