[Memo]如何用 PowerShell 修改 IIS 站台的設定 v3–HTTP Request Header 並處理 XML 結果

[Memo]如何用 Command line 修改 IIS 站台的設定–HTTP Request Header

 

大約是 4 月的時候 T 公司的某部門提問到 IIS 中的進階設定如何做成自動化的腳本

 

雖然這些都是 IIS 上的指令,而且還是在 MSDN 上就可以找到得到。但為了日後方便還是整理一下

 

要注意的就是必須要有足夠的權限才行,第二就是 appcmd 並不在 path 中,請記得到 system32 下的 inetsrv 執行

 

「appcmd.exe set config "Default Web Site/NopCommerce" -section:system.webServer/httpProtocol /+"customHeaders.[name='X-UA-Compatible',value='IE=Edge']"」

image

 

http://www.iis.net/configreference/system.webserver/httpprotocol/customheaders

http://technet.microsoft.com/zh-tw/library/cc730918(v=ws.10).aspx

大推

http://blogs.msdn.com/b/mikezh/archive/2012/04/23/iis-appcmd-quick-reference.aspx

http://technet.microsoft.com/en-us/library/ee619764(WS.10).aspx

 

 

追加 v2 - 判斷 Request Header 是否存在

 

上述說明了如何用 Command line 的方式增加 Request Header 定義項目,但是相同的項目無法重複增加導致指令可能無法重複使用。勢必需要有判斷該項目是否存在,而這個設定除了用 GUI、Command line 外還可以直接寫在 Web.config 之中。

 

這次的判斷方式是用 Command line 的方式處理,所以初步寫了一下 PowerShell 來完成

總之先看一下語法吧

 

image

$result =[xml] (C:\Windows\System32\inetsrv\appcmd.exe list config "Default Web Site/NopCommerce" -section:httpProtocol)

$CustomHeaders = $result.'system.webServer'.httpProtocol.customHeaders

$CompareResult = $false


foreach($customHeader in $CustomHeaders.ChildNodes)
{
    Write-Host $customHeader.Name
   
    if ($customHeader.Name.CompareTo('X-UA-Compatible'))
    {
        Write-Host "CustomHeader 已經有 X-UA-Compatible"
        $CompareResult = $true
    }
}

if ($CompareResult)
{
    Write-Host "X-UA-Compatible 已存在"
    C:\Windows\System32\inetsrv\appcmd.exe set config "Default Web Site/NopCommerce" -section:system.webServer/httpProtocol /-"customHeaders.[name='X-UA-Compatible',value='IE=Edge']"
    Write-Host "X-UA-Compatible 刪除完畢"
}

C:\Windows\System32\inetsrv\appcmd.exe set config "Default Web Site/NopCommerce" -section:system.webServer/httpProtocol /+"customHeaders.[name='X-UA-Compatible',value='IE=Edge']"

 

 

 

判斷的方式是透過 List config 的方式來取得 Http Request Header 的 XML 字串後,再單獨透過 XML 物件列舉 (intelliSense) 的方式取得 CustomHeaders 的項目,逐一判斷每一個內容後再決定是否要刪除。

 

比較特別的就是第二行 $Result 後面列舉的部分是用 IntelliSense 按下 「點」後就會找到相關對應的 XML Node 的名稱,就可以節省用 Select XML 指令的用法。比較直覺

 

追加 v3 - 參數化

 

image

$siteName = $args[0]  #"Default Web Site/NopCommerce"
$HeaerName = $args[1] #"X-UA-Compatible"
$value = $args[2] #"IE=Edge"
$customHeaderString = "customHeaders.[name='" + $HeaerName + "',value='" + $value + "']"

$result =[xml] (C:\Windows\System32\inetsrv\appcmd.exe list config $siteName -section:httpProtocol)

$CustomHeaders = $result.'system.webServer'.httpProtocol.customHeaders

$CompareResult = $false


foreach($customHeader in $CustomHeaders.ChildNodes)
{
    Write-Host $customHeader.Name
   
    if ($customHeader.Name.CompareTo($HeaerName))
    {
        Write-Host "CustomHeader 已經有 " $HeaerName
        $CompareResult = $true
    }
}

if ($CompareResult)
{
    Write-Host $HeaerName " 已存在"
    C:\Windows\System32\inetsrv\appcmd.exe set config $siteName -section:system.webServer/httpProtocol /-$customHeaderString
    Write-Host $HeaerName " 刪除完畢"
}

C:\Windows\System32\inetsrv\appcmd.exe set config $siteName -section:system.webServer/httpProtocol /+$customHeaderString

 

 

 

有興趣的朋友可以自行調整 微笑

 

 

參考連結

http://technet.microsoft.com/en-us/library/ee619764(WS.10).aspx

http://blogs.msdn.com/b/vivekkum/archive/2009/05/07/iis-7-7-5-net-configuration-settings-using-appcmd-exe-and-iis-manager.aspx

http://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe#HowToUse

http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-custom-logging

http://technet.microsoft.com/en-us/library/cc772183(v=ws.10).aspx

http://technet.microsoft.com/en-us/library/hh831621.aspx

http://technet.microsoft.com/en-us/library/cc754791(v=ws.10).aspx

http://blogs.msdn.com/b/finbar_ryan/archive/2013/06/05/application-request-routing-and-server-headers-quot-x-powered-by-arr-2-5-quot.aspx

http://support.microsoft.com/kb/930909/zh-tw

http://www.codeproject.com/Articles/61900/PowerShell-and-XML

http://stackoverflow.com/questions/17583373/selecting-attributes-in-xml-using-xpath-in-powershell