如何使用 PowerShell 在多台服務器上設置 IIS

如何使用 PowerShell 在多台服務器上設置 IIS

PowerShell 是管理與 Windows 相關的所有內容的絕佳工具。但是,在配置 Internet 信息服務 (IIS) 時,它也可以為您做很多工作,當您可以使用它來批量配置 IIS 服務器時,它會變得更好。

隨著您獲得越來越多的系統設計/管理經驗,您往往會問自己:“PowerShell 能讓我更輕鬆嗎?” 它幾乎總是從一個只能幫助您更好地理解 PowerShell 的教程開始。考慮到為多台服務器配置各種 IIS 組件的任務,這些步驟可以分解為邏輯步驟,這些步驟基本上是您必須在單個 Windows 服務器上的 GUI 中完成的步驟。讓我們通過一個簡短的步驟列表來幫助您入門,您可以選擇添加這些步驟以進行進一步的配置:

  • 從遠程共享導入 PFX 證書
  • 在 IIS 中為 https 創建新綁定
  • 將導入的證書附加到 https 錨點
  • 選中 IIS 管理器中的“需要 SSL”框。
  • 添加自定義日誌記錄以從負載均衡器獲取 X-Forwarded-For 值。

這些步驟中的大多數都是簡單的 GUI 單擊,那麼為什麼不能使用一些 PowerShell 命令來完成呢?或者更好的是,運行多個遠程服務器的列表來完成相同的任務?這篇文章中將演示的大部分步驟都是可以插入到典型 PowerShell 結構中的代碼片段。您可以擁有調試 PowerShell 腳本所特有的自定義日誌記錄和項目。如果沒有,您可以輕鬆地將它們鏈接在一起,以快速完成您需要為您的 IIS 配置執行的操作。

需要提前設置的幾件事

要開始,您需要一些變量。要配置的服務器的工作列表和 PFX 證書文件所在的可用網絡文件夾:

$Servers = Get-Content -Path C:WebServers.txt

$CertFolder = '\FileServer01SharedCerts'

這將從 .txt 文件中獲取服務器列表,並設置可以找到導入證書的位置。

如果您將在多台服務器上運行它,您最終需要確保您在在線的服務器上運行。Test-Connection cmdlet 的下一個用途是至少對每台服務器執行一次 ping 操作,以確保在繼續之前它處於活動狀態。如果服務器在線,邏輯會將包含證書的網絡共享文件夾複製到遠程服務器上的 C:WindowsTemp 文件夾。這樣,用於導入證書的 Invoke-Command cmdlet 在從網絡位置複製時不會遇到權限問題:

foreach ($Server in $Servers) {

if (Test-Connection -ComputerName $Server -Quiet -Count 1) {

複製項目-路徑 $CertFolder`

-目標 \\$Server\C$\Windows\Temp\CertAssets `

-遞歸-強制

Write-Host “資產複製成功!”

}

別的 {

Write-Host “$Server 似乎離線!”

}

…下面展示的代碼…

}

請注意,運行此命令時,使用 Write-Host 行向控制台提供反饋很有用。如果你用它來包裝你的腳本,添加到現有日誌中也會很好。現在我們知道哪些服務器在線並且在本地複制了資產。現在我們準備好繼續前進了。

導入證書並創建新綁定

此操作使用 Invoke-Command cmdlet 執行,該 cmdlet 在每台服務器上本地執行此操作。根據您要實施的安全級別,您可以使用導入 PFX 證書所需的密碼執行一些操作。您可以使用 Get-Credential 即時保存它,也可以只輸入嵌入在用於導入的命令中的純文本密碼。我建議至少使用 Get-Credential 來保護密碼,儘管還有很多其他方法可以在這里安全地輸入密碼。要收集密碼,您可以使用:

$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'

這將存儲證書的密碼,而不必在腳本中以純文本形式保存密碼。我們將使用 $Using: 組件將此局部變量傳遞給遠程命令。因為 Invoke-Command 及其附帶的腳本塊在不同的範圍內(遠程機器本地)執行,所以它不知道在腳本塊之外定義的任何局部變量。這允許您將任何局部變量傳遞給遠程會話並適當地使用它們。

我們會將證書導入個人(我的)計算機帳戶證書存儲。

以下代碼執行以下步驟:

  1. 在遠程服務器上啟動進程
  2. 使用 Get-Credential 步驟中提供的密碼導入操作
  3. 在端口 443 上創建 https 綁定。
  4. 將導入的證書添加到 https 錨點

*這仍然在上面定義的 foreach 循環內:

調用命令 -ComputerName $Server -ScriptBlock {

$SiteName = “我的網站”

Import-PfxCertificate -Password $Using:MyPwd.Password`

-CertStoreLocation 證書:\LocalMachine\My `

-FilePath C:\Windows\Temp\CertAssets\MyCert.pfx

導入模塊 WebAdministration

New-WebBinding -Name $SiteName -IP “*” -Port 443 -Protocol https

$SSLCert = Get-ChildItem -Path Cert:\LocalMachine\My `

| Where-Object {$_.Subject.Contains(“CertFriendlyName”)}

$Binding = Get-WebBinding -Name $SiteName -Protocol “https”

$Binding.AddSslCertificate($SSLCert.GetCertHashString(), “我的”)

寫入主機“設置成功:$env:COMPUTERNAME”

}

除了作為您自己設置的一部分強制輸出到控制台的任何輸出之外,證書導入操作在成功導入後還會有一些輸出。

清理你的爛攤子也很好,所以添加幾行來刪除文件夾。pfx 複製到機器上。這將在 foreach 循環內,最好靠近結尾:

Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force

Write-Host "Cleanup on $Server completed!"

在您的網站上需要 SSL

部署部署時將使用下一個命令片段。如果您希望立即需要它,只需將其添加到上面的其餘代碼中即可。您可能需要分階段推出,您可能希望在特定服務器上啟用此功能。無論如何,你創造它,作品的精髓就在這幾行:

Import-Module WebAdministration

Set-WebConfiguration-位置“我的網站”`

-Filter 'system.webserver/security/access' -Value "Ssl"

請注意,-Location 參數是需要 SSL 的 IIS 站點的名稱。現在,這將使用適當的證書強制所有安全連接到您的新錨點。在 GUI 中,這相當於在 IIS 管理器中為您的特定站點單擊“SSL 設置”圖標並選中“需要 SSL”框:

配置 IIS 日誌記錄選項

如果您管理負載平衡器後面的一組 IIS 服務器,則可以利用負載平衡器從傳入連接中收集的信息。假設您的特定負載平衡器被配置為捕獲 X-Forwarded-For 值,您可以獲取到 IIS 服務器的所有傳入連接的傳入 IP 地址,並在已知的 IIS 日誌中查看它們。這在對可能導致特定服務器錯誤的某些資源的連接跟踪問題進行故障排除時特別有用。

因此,IIS 不會收集 X-Forwarded-For 值。它需要配置為自定義值,以便 IIS 可以捕獲和註冊它。還有一種方法可以在 GUI 中進行設置,但您可以將此命令添加到我們當前的配置腳本中,以便從一開始就將其放置到位:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `

-過濾“system.applicationHost/sites/siteDefaults/logFile/customFields”`

-名稱“。”`

-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}

完成後,您可以通過打開 IIS 管理器並單擊“我的服務器”>“日誌記錄”>“日誌文件”來驗證此自定義字段是否已在服務器級別添加到 IIS:選擇字段…

完成此操作後,您將能夠在傳統 IIS 日誌中看到與 IIS 服務器的傳入連接的 IP 地址。

這些只是您可以在 IIS 服務器上配置的設置的幾個示例。您以相同方式管理和設置的服務器越多,您節省的點擊次數就越多,這總是一件好事。我建議在同一台服務器上測試不同的命令以獲得所需的設置。一旦你有了一個服務器的進程,就可以按照本文中給出的結構在任意數量的服務器上重複它。

這應該足以開始節省時間並在您的環境中進行更標準化的 IIS 部署。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *