Powershell 更新 IIS 绑定

Posted

技术标签:

【中文标题】Powershell 更新 IIS 绑定【英文标题】:Powershell update IIS Bindings 【发布时间】:2011-06-17 09:01:30 【问题描述】:

我正在尝试更新我可以使用的特定站点上的 http 绑定:

Set-ItemProperty "IIS:\Sites\SiteName" -Name bindings -Value @protocol="http";bindingInformation=*:80:hostname.site.net

我遇到的问题是这个命令完全替换了绑定信息,所以如果有一个 https 绑定,那么它会被 Set-ItemProperty 删除。

有没有人知道一种只更新特定绑定(如 HTTP)而无需删除其他绑定或重新创建整个绑定字符串的方法?

【问题讨论】:

【参考方案1】:

在一个网站的绑定集合中UPDATE一个绑定的步骤,这个过程其实就是获取网站的绑定集合,修改具体的绑定,然后重新设置整个集合。

Function ReplaceWebsiteBinding 

    Param(
        [string] $sitename,
        [string] $oldBinding,
        [string] $newValue
    );
    import-module webadministration;
    $wsbindings = (Get-ItemProperty -Path "IIS:\Sites\$sitename" -Name Bindings)
    for($i=0;$i -lt ($wsbindings.Collection).length;$i++)
        if((($wsbindings.Collection[$i]).bindingInformation).Contains($oldBinding))
            ($wsbindings.Collection[$i]).bindingInformation = $newValue;
        
    
    Set-ItemProperty -Path "IIS:\Sites\$sitename" -Name Bindings -Value $wsbindings


ReplaceWebsiteBinding "Default Web Site" "*:80:" "192.168.1.101:80:SomeHostHeader.domain";

[注:已编辑 20131016:清理答案以便于查看] [注:已编辑 20160817:更正了参数变量类型定义]

【讨论】:

我认为这个解决方案不够好,因为如果您有多个绑定,它会删除所有绑定,只留下指定的一个。 我不同意它完全回答了这个问题,但我认为这与针对 IIS 的 powershell 一样好。我想看到类似$b = Get-WebBinding; $b.SetAttribute('Port', 9999); $b.Save; 的东西,但这不起作用。除非您更改答案(!),否则我无法删除反对票...很奇怪。 已通过更改在答案中提供了 Spoonfed 解决方案。请查看您的反对意见。 @JonnyG 我面临的问题与 OP 中的问题完全相同。您提供的解决方案是某种错误的解决方法?或者预计在更新http 绑定时使用cmdlt Set-ItemProperty 时现有绑定将被清除?【参考方案2】:

这是另一种语法形式。我更喜欢这个,因为它看起来更自然。如果您尚未加载 webadministration PS 模块,请先导入该模块 (import-module webadministration)。

New-WebBinding -name test03 -port 443 -Protocol https -HostHeader test03.int -IPAddress "*"

【讨论】:

是的 - 这里有一些关于如何做到这一点的更多信息:iis.net/learn/manage/powershell/… 请注意,此命令行开关是随 Windows Server 2012 引入的。如果您仍在使用 Server 2008,则必须使用 JohnnyG 的解决方案。 值得注意的是:New-WebBinding cmdlet 实际上并没有更新特定的绑定(用新的绑定值替换旧的绑定值) - 如原始问题中所述;但确实将新绑定添加到站点上的绑定列表中。如果您需要更新现有绑定,则必须使用我上面的函数。 同意,只要您不需要 msmq 绑定,这样添加时会搞砸【参考方案3】:

这是我最近编写的一个 Powershell 脚本,可以根据需要进行调整:

# Updates IIS bindings across all sites by replacing all occurrences
# of $searchString for $replaceString in the binding host header.
# Note that the search and replace is case insensitive.

$searchString = "ovh-ws0"
$replaceString = "ovh-ws1"
foreach ($website in Get-Website) 
    "Site: 0" -f $website.name
    $bindings = Get-WebBinding -Name $website.name
    foreach ($binding in $website.bindings.Collection) 
        $bindingInfo = $binding.bindingInformation
        "    Binding: 0" -f $bindingInfo
        if ($bindingInfo -imatch $searchString) 
            $oldhost = $bindingInfo.Split(':')[-1]
            $newhost = $oldhost -ireplace $searchString, $replaceString
            "        Updating host: 0 ---> 1" -f $oldhost, $newhost
            Set-WebBinding -Name $website.name -BindingInformation $bindingInfo -PropertyName "HostHeader" -Value $newhost
        
    

这是上面脚本的示例输出:

Site: alpha
    Binding: 100.101.102.103:80:alpha.redacted.com
    Binding: 100.101.102.103:80:ovh-ws0-alpha.redacted.com
        Updating host: ovh-ws0-alpha.redacted.com ---> ovh-ws1-alpha.redacted.com
    Binding: 100.101.102.103:443:ovh-ws0-alpha.redacted.com
        Updating host: ovh-ws0-alpha.redacted.com ---> ovh-ws1-alpha.redacted.com
    Binding: 100.101.102.103:443:alpha.redacted.com
Site: beta
    (etc)
Site: release
    (etc)

当然,脚本可以通过其他方式修改绑定。例如,以下脚本将更新 IP 地址:

# Updates IIS bindings across all sites by replacing all IP addresses from $oldIP to $newIP.

$oldIP = "100.101.102.103"
$newIP = "*"
foreach ($website in Get-Website) 
    "Site: 0" -f $website.name
    $bindings = Get-WebBinding -Name $website.name
    foreach ($binding in $website.bindings.Collection) 
        $bindingInfo = $binding.bindingInformation
        "    Binding: 0" -f $bindingInfo
        if ($bindingInfo -imatch $oldIP) 
            "        Updating IP: 0 ---> 1" -f $oldIP, $newIP
            Set-WebBinding -Name $website.name -BindingInformation $bindingInfo -PropertyName "IPAddress" -Value $newIP
        
    

【讨论】:

【参考方案4】:

Set-WebBinding -Name 'Default Web Site' -BindingInformation "*:80:" -PropertyName Port -Value 12

子组

【讨论】:

你应该尝试在你的答案中包含更多的解释。 为了让其他人稍微澄清一下,前两个参数,即名称和 BindingInformation,实际上是更改的搜索条件。第三和第四个参数是需要改变的东西。在上面的示例中,我们正在搜索默认网站,并且我们希望将端口 80 绑定调整为端口 12。这最终对我有用,所以我想我会添加到描述中以帮助未来的人们。【参考方案5】:

使用“New-ItemProperty”添加使用“Set-ItemProperty”更新现有的。

http://www.iis.net/learn/manage/powershell/powershell-snap-in-making-simple-configuration-changes-to-web-sites-and-application-pools

【讨论】:

【参考方案6】:

我想在不清除 SSL 证书和其他设置的情况下更新现有绑定。

WebAdministration 模块中的 Set-WebBinding 对我有用

https://docs.microsoft.com/en-us/powershell/module/webadminstration/set-webbinding?view=winserver2012-ps

例如

Set-WebBinding -PropertyName HostHeader -Value newhostnamevalue.site.net -HostHeader hostname.site.net -IPAddress * -Name MyWebSite -Port 80

对于语法,PropertyName 表示要更新的绑定部分,而 Value 是要更新的内容

【讨论】:

以上是关于Powershell 更新 IIS 绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中显示所有站点和绑定

powershell 更新power shell中的帮助系统。第二个文件在Windows中显示帮助文件。第三个文件显示来自在线来源的帮助。

power shell 更新后的版本号

我可以在IIS中更改证书指纹:使用PowerShell进行SSLBindings吗?

无法在 IIS 托管的 .net web api 项目中运行 powershell 脚本

如何在Windows Server 2008 R2上开启Windows Power Shell ISE