我早就为IIS 6做了一堆VBS自动化,包括在配对服务器的几个服务器场上获取/设置复杂服务器绑定的服务器,每个服务器都有几十个应用程序,每个应用程序有3到12个主机头。每个应用程序都有主机名,主机名完全限定和启用灾难恢复的主机名,因此手动维护可能会很麻烦。
我使用ADSI完成了所有的vbs工作,但我认为从完整的服务器维护角度来看,WMI可能比ADSI更灵活。如果我错了,请纠正我。所以现在我正在尝试升级到PowerShell + WMI以准备Windows 2008 + IIS 7.5。我很享受学习过程,但是我遇到了这个问题的障碍。
我可以在IIS 6 Web服务器上通过WMI获取/设置所有属性,但ServerBindings除外。我觉得我很接近,但是我错过了一些遏制层,我只是无法将我正在构建的对象转移到正确的自动化对象上。
以下代码获取并读取ServerBindings就好了。我根本无法找到一种方法来回写我的更改。欢迎任何建议。
$objWMI = [WmiSearcher] "Select * From IISWebServerSetting"
$objWMI.Scope.Path = "\\" + $server + "\root\microsoftiisv2"
$objWMI.Scope.Options.Authentication = 6
$sites = $objWMI.Get()
foreach ($site in $sites)
{
$bindings = $site.psbase.properties | ? {$_.Name -contains "ServerBindings"}
foreach ($pair in $bindings.Value.GetEnumerator())
{
# The pair object is a single binding and contains the correct data
$pair
$pair.IP
$pair.Port
$pair.Hostname
# And this line will successfully erase the contents of
# the ServerBindings
$bindings.Value = @{}
# but I can't figure out what to do to update $bindings.Value
}
$site.Put()
}
到目前为止,我很喜欢Powershell,所以感谢您提供的任何帮助。
答案 0 :(得分:1)
好的。我因主要磁盘故障而分心。乐趣永远不会停止。
无论如何,这个问题的解决方案比我做的更简单:
process
{
$bindings = $_.ServerBindings
foreach ($binding in $bindings)
{
$binding.IP = $ip
$binding.Port = $port
$binding.Hostname = $hostname
}
$_.ServerBindings = $bindings
$_.Put()
}
ServerBindings是一个数组,但它喜欢是一个自己的数组。我试图从头开始构建阵列,但是我的家庭阵列对Powershell来说没有正确的味道。因此,将数组从ServerBindings拉出一个新变量,操纵变量,然后将操纵变量分配回ServerBindings属性。这样可以保持所有正确的输入。它像丝绸一样光滑,看起来比ADSI更容易。