在两个站点之间交换IIS绑定

时间:2016-01-21 22:30:37

标签: powershell iis

我试图在两个站点之间交换绑定是Powershell中的IIS。下面的脚本正在运行,但似乎有点太复杂了:

$site1Name = ''
$site2Name = ''

$site1 = Get-Website | Where {$_.Name -eq $site1Name}
$site2 = Get-Website | Where {$_.Name -eq $site2Name}
$site1Bindings = $site1 | Get-WebBinding
$site2Bindings = $site2 | Get-WebBinding

$site1 | Get-WebBinding | Remove-WebBinding
$site2 | Get-WebBinding | Remove-WebBinding

function Copy-Bindings
{
 param($siteA_Bindings,  [string]$siteB_Name )

    foreach ($binding in $siteA_Bindings)
    {
        $bindingInformation = $binding['bindingInformation'].Split(':')
        $ip = $bindingInformation[0]
        $port = $bindingInformation[1]

        if ($bindingInformation.Length > 2)
        {   
            $hostRecord = $bindingInformation[2]
        }
        else
        {   
            $hostRecord = ''
        }

        $protocol = $binding['protocol']
        New-WebBinding -Name $siteB_Name -Port $port -Protocol $protocol -IPAddress $ip -HostHeader $hostRecord
    }
}

Copy-Bindings $site1Bindings $site2Name
Copy-Bindings $site2Bindings $site1Name

我想要的是更像这样的东西(伪代码):

$site1Name = ''
$site2Name = ''

$site1 = Get-Website | Where {$_.Name -eq $site1Name}
$site2 = Get-Website | Where {$_.Name -eq $site2Name}
$site1Bindings = $site1 | Get-WebBinding
$site2Bindings = $site2 | Get-WebBinding

$site1 | Get-WebBinding | Remove-WebBinding
$site2 | Get-WebBinding | Remove-WebBinding

$site1Bindings | New-WebBinding -Name $site2Name
$site2Bindings | New-WebBinding -Name $site1Name

有没有办法简化它?

谢谢,

1 个答案:

答案 0 :(得分:0)

简短回答,不,它不能简化到所需的psudocode所代表的程度。当前功能对于IPv4站点绑定运行良好,但需要对IPv6绑定进行更多调整(拆分为[和] in除了:)。

help file for New-WebBinding显示虽然所需的参数确实采用管道输入,但是ByPropertyName(如果属性名称匹配则有效)不是ByValue(如果对象类型匹配则有效)。

仔细研究我们从$site1Bindings变量的示例结果中得到的结果,说明原因。首先,让我们看一下对象类型:

PS C:\windows\system32> $site2Bindings | GM

   TypeName:
Microsoft.IIs.PowerShell.Framework.ConfigurationElement#bindings#binding

不幸的是,New-WebBinding不接受该对象类型以输入任何参数。这排除了直接使用它来流水线化New-WebBinding。但是,$site2Bindings内的属性名称怎么样?以下是一个示例:

PS C:\windows\system32> $site2Bindings | FL

protocol           : http
bindingInformation : [2002:4000:200:9:900:e45e:e501:aa37]:80:
sslFlags           : 0

嗯,protocol匹配参数的名称,因此可以通过管道输入使用,但这是唯一的。因此,您必须将结果信息切断并将其分配给变量,就像您在函数中所做的那样。可能有一种更简洁的方法来删除结果,但在使用New-WebBinding时无法避免它。