带有WMI和Powershell v2的IIS 6 ServerBindings

时间:2010-01-30 16:42:22

标签: iis powershell iis-6 wmi

我早就为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,所以感谢您提供的任何帮助。

1 个答案:

答案 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更容易。