如何使用 Powershell 更新 IIS6 中的 HTTP 自定义标头?

如何使用 Powershell 更新 IIS6 中的 HTTP 自定义标头?

我有以下 Powershell 脚本,它使用 WMI 来更新 IIS 6 中网站上的 HTTP 自定义标头。

脚本似乎运行良好,没有生成任何错误,并且生成的 $website 对象正确显示了更新的 HttpCustomHeaders 值。但是,当我在 IIS 中查看该站点时,值尚未更新。通过访问该站点并查看 Firebug 中的标头也可以验证这一点 - 这些值未保存。

知道我做错了什么吗?

$website = Get-WmiObject -Class IIsWebServerSetting -Namespace "root\microsoftiisv2" -ComputerName $computerName -filter "ServerComment = '$websiteName'" -Authentication 6

$headers = $webSite.HttpCustomHeaders
$headers[0].Keyname = 'P3P: policyref="http://somewebsite.com/p3p.xml", CP="IDC DSP COR CUR DEV PSA IVA IVD CONo HIS TELo OUR DEL UNRo BUS UNI"'
$headers[0].Value = $null
$website.HttpCustomHeaders = $headers
$website.Put()

我非常愿意接受一个替代脚本,该脚本提供了一种更好的方式来设置这个值,因为上面假设已经存在至少有一个标题。

我也尝试过Set-WmiInstance -InputObject $website$website.Put()但没有什么区别。

答案1

您的代码示例将值保存到元数据库,但它保存到根对象(w3svc/1)而不是根 vdir(w3svc/1/root)。

以下是可以替代您已有内容的方法:

$website = Get-WmiObject -Class IIsWebServerSetting -Namespace "root\microsoftiisv2" -ComputerName $computerName -filter "ServerComment = '$websiteName'" -Authentication 6

$path = $website.name + '/root'
$vdir = [wmi]"root\MicrosoftIISv2:IIsWebVirtualDirSetting='$path'"

$headers = $vdir.HttpCustomHeaders
$headers[0].Keyname = 'P3P: policyref="http://somewebsite.com/p3p.xml", CP="IDC DSP COR CUR DEV PSA IVA IVD CONo HIS TELo OUR DEL UNRo BUS UNI"'
$headers[0].Value = $null
$vdir.HttpCustomHeaders = $headers
$vdir.Put()

但是,还有一点需要注意,那就是这会替换第一个值,而不是添加新值。今天我没有时间利用我有限的 PowerShell 专业知识来弄清楚如何处理,但它将类似于以下内容:

$bindingClass = [wmiclass]'root\MicrosoftIISv2:HttpCustomHeader'
$newheader = $bindingClass.CreateInstance()
$newheader.KeyName = "New Value"
$newheader.Value = $null

$headers += $header

存在转换错误,所以不太正确,但希望这能为您指明正确的方向。

答案2

在测试时先尝试输出当前值。然后您就可以知道您是否正确绑定到了您期望的站点。例如,对于 $headers= 后面的行,执行 Write-Host $headers[0].Keyname。或者执行 Write-Host $webSite.ServerComment。

基本上,缩小范围以确保您能够访问正确的网站。

另外,我现在还不太了解 PowerShell,但您可以编辑 [0] 并让其“添加”一个条目吗?我敢打赌,您需要做其他事情才能真正将值添加到数组中。

相关内容