繁体   English   中英

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

[英]Swap IIS Bindings Between Two Sites

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

    $site1Name = ''
    $site2Name = ''
    
    $site1 = Get-Website | Where-Object {$_.Name -eq $site1Name}
    $site2 = Get-Website | Where-Object {$_.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 -gt 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-Object {$_.Name -eq $site1Name}
    $site2 = Get-Website | Where-Object {$_.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

有什么办法可以简化吗?

谢谢,

简短的回答,不,它不能简化到所需的伪代码所代表的程度。当前函数对于 IPv4 站点绑定来说工作得很好,但需要对 IPv6 绑定进行更多调整(除 [ 和 ] 之外,还需要: )。

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方法来分割结果,但在使用New-WebBinding时无法避免它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM