IIS 6服务器与WMI和Powershell v2的绑定

IIS 6服务器与WMI和Powershell v2的绑定,iis,powershell,iis-6,wmi,Iis,Powershell,Iis 6,Wmi,长期以来,我一直有一系列针对IIS 6的VBS自动化,包括一个在多个成对服务器场上获取/设置复杂服务器绑定的自动化,每个服务器场都有几十个应用程序,每个应用程序都有3-12个主机头。每个应用程序都有主机名、主机名fullyqualified和启用灾难恢复的主机名,因此手动维护它们会很麻烦 我用ADSI做了所有的vbs工作,但我认为WMI从完整的服务器维护角度来看可能比ADSI更灵活。如果我错了,请纠正我。所以现在我正尝试升级到PowerShell+WMI,为Windows 2008+IIS 7.

长期以来,我一直有一系列针对IIS 6的VBS自动化,包括一个在多个成对服务器场上获取/设置复杂服务器绑定的自动化,每个服务器场都有几十个应用程序,每个应用程序都有3-12个主机头。每个应用程序都有主机名、主机名fullyqualified和启用灾难恢复的主机名,因此手动维护它们会很麻烦

我用ADSI做了所有的vbs工作,但我认为WMI从完整的服务器维护角度来看可能比ADSI更灵活。如果我错了,请纠正我。所以现在我正尝试升级到PowerShell+WMI,为Windows 2008+IIS 7.5做准备。我很享受学习过程,但在这个问题上我遇到了障碍

我可以通过WMI在IIS 6 web服务器上获取/设置除服务器绑定之外的所有属性。我觉得我离目标很近,但我缺少了一些控制层,我无法将我正在构建的对象转换为正确的自动化对象

下面的代码可以很好地获取和读取服务器绑定。我就是想不出一个方法来写回我的更改。欢迎任何建议

$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,所以感谢您提供的任何帮助

好的。我被严重的磁盘故障分散了注意力。乐趣从未停止

无论如何,这个问题的解决方案比我做的要简单:

process
{
    $bindings = $_.ServerBindings
    foreach ($binding in $bindings)
    {
        $binding.IP = $ip
        $binding.Port = $port
        $binding.Hostname = $hostname
    }
    $_.ServerBindings = $bindings
    $_.Put()
}

ServerBindings是一个数组,但它喜欢自己的数组。我试图从头开始构建阵列,但我的自制阵列闻起来不像Powershell。因此,将数组从ServerBindings中拉入一个新变量,操纵该变量,然后将操纵的变量分配回ServerBindings属性。这样可以保持所有正确的输入。它像丝绸一样光滑,看起来比ADSI容易

要使新阵列在powershell中工作,必须将该阵列强制转换为System.Management.ManagementBaseObject的阵列,例如$bindings=[System.Management.ManagementBaseObject[]]@(…)否则您将得到一个对象数组,因此会出现错误。谢谢,Chris。我很感激你添加了这张便条,我相信这就是解决办法。远程处理对你有用吗?我无法让服务器绑定与远程处理一起工作,如果有任何帮助,我将不胜感激。2个月后,但是。。。。对不起,我真的不明白这个问题。远程处理是对服务器进行的,不是吗?不是单个站点?