Remove-WebBindings 从所有 IIS 站点删除绑定

问题描述 投票:0回答:3

我正在使用 WebAdministration 模块创建一个 Powershell 脚本来创建几个站点并自动添加绑定

Import-Module WebAdministration

$config = @{
    Sites = @( 
        @{
            Name = "Site1";
            Path = "Path1";
            Bindings = @(
                @{ Protocol = "http"; Port = 80;},
                @{ Protocol = "https"; Port = 443;}
            );
        },
        @{
            Name = "Site2";
            Path = "Path2";
            Bindings = @(
                @{ Protocol = "http"; Port = 3009;}
            );
        }
    )
}

foreach($site in $config.Sites){
    $physicalPath = Get-Item "$($site.Path)"
    # Create the current site
    New-WebSite -Name "$($site.Name)" -PhysicalPath $physicalPath.FullName

    ## Trying to remove default port 80 binding for the current site
    Remove-WebBinding -Name $site.Name -Port 80 -Protocol "http"

    ## Add the desired bindings
    foreach ($binding in $site.Bindings){
        New-WebBinding -Name "$($site.Name)" -Protocol $binding.Protocol -Port $binding.Port
    }
}

当我这样做时,我在端口 80 Site1 上没有绑定。看起来

Remove-WebBinding -Name $site.Name -Port 80 -Protocol "http"
正在删除两个站点的绑定。

PS > Get-ChildItem IIS:\Sites

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Site1            1    Started    Path1                          https *:443: sslFlags=0
Site2            2    Stopped    Path2                          http *:3009:

如果我在不尝试修改任何绑定的情况下执行此操作

foreach($site in $config.Sites){
    $physicalPath = Get-Item "$($site.Path)"
    # Create the current site
    New-WebSite -Name "$($site.Name)" -PhysicalPath $physicalPath.FullName
}

我最终两个站点都绑定到端口 80

PS > Get-ChildItem IIS:\Sites

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Site1            1    Started    Path1                          http *:80:
Site2            2    Stopped    Path2                          http *:80:

我做错了什么?有没有更好的办法?这是一个错误吗?

powershell iis-10
3个回答
5
投票

我也见过类似的行为。我没有尝试显式查找并删除绑定条目,而是使用管道引用已识别的对象取得了更大的成功。

例如:

Get-Website -Name "$($site.Name)" | Get-WebBinding -Protocol "http" -Port 80 | Remove-WebBinding

0
投票

通过在创建站点时使用第一个绑定,然后迭代任何剩余的绑定,设法绕过

Remove-WebBinding

foreach($site in $config.Sites){
    $physicalPath = Get-Item "$($site.Path)"

    $defaultBinding = ($site.Bindings | Select-Object -First 1)

    # Use Splatting
    $newWebSiteParams = @{
        Name = $site.Name;
        PhysicalPath = $physicalPath.FullName;
        ApplicationPool = $site.ApplicationPool
        Port = $defaultBinding.Port
        SSL = $defaultBinding.Protocol -eq 'https'
    }

    # Create the current site with command splatting
    New-WebSite @newWebSiteParams

    ## Add the remaining bindings
    foreach ($binding in ($site.Bindings | Select-Object -Skip 1)){
        New-WebBinding -Name "$($site.Name)" -Protocol $binding.Protocol -Port $binding.Port
    }
}

仍然不确定为什么

Remove-WebBinding
似乎要从两个站点删除绑定。


0
投票

我刚刚经历了Remove-WebBinding 的这种错误行为。该工具肯定存在错误,或者至少实现不遵循自 2024 年 5 月版本 1.0.0 起的文档中概述的规范。语法变体 #1 允许通过站点名称、IP 地址和端口指定目标绑定,但对于无论出于何种原因,站点名称都会被忽略。如果您碰巧省略了 IP 地址或端口,则会推断默认值

*

按照您最初在外循环第二次迭代的问题中发布的代码,该工具被调用,其中

-port 80
进行计数,
-name Site2
被忽略,此时它从所有站点中删除端口 80 绑定。 如果您碰巧省略了 IP 地址和端口,则会有效地清除 IIS 中的所有绑定网站关联。不酷。

语法变体 #2(传递了 -InputObject 的变体)行为正确。这是页面上唯一示例中的一个,也是布兰登在上面的答案中推荐的一个。

© www.soinside.com 2019 - 2024. All rights reserved.