[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']"」
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 來完成
總之先看一下語法吧
$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 - 參數化
$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://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://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