【问题标题】:Loop through all bindings configured in IIS with powershell使用 powershell 循环遍历 IIS 中配置的所有绑定
【发布时间】:2011-05-31 11:29:39
【问题描述】:

我正在寻找一种方法来检查已在我的 IIS 中配置的所有绑定设置。

我正在使用它来处理 Powershell 中的 IIS:

Import-Module WebAdministration

到目前为止,我能够获得所需的主要信息:

$Websites = Get-ChildItem IIS:\Sites

我的数组 $Websites 已正确填充并使用以下命令...

$Websites[2]

..我收到这个结果:

Name         ID   State    Physical Path       Bindings    
----         --   -----    -------------       --------------     
WebPage3      5            D:\Web\Page3        http  *:80:WebPage3  
                                               https *:443:WebPage3

现在是我遇到困难的部分:

我想检查绑定是否正确。为了做到这一点,我只需要绑定。我试过了:

foreach ($site in $Websites)
{
    $site = $Websites[0]
    $site | select-string "http"
}

调试该代码显示 $Site 不包含我预期的内容:“Microsoft.IIs.PowerShell.Framework.ConfigurationElement”。我目前不知道如何显式获取绑定信息以获取类似这样的信息(在 foreach 循环内):

 if ($site.name -eq "WebPage3" -and $site.Port -eq "80") {
    #website is ok    
 } 
 else {
    #remove all current binding
    #add correct binding
 }

感谢您的帮助!


解决方案:

Import-Module WebAdministration
$Websites = Get-ChildItem IIS:\Sites
foreach ($Site in $Websites) {

    $Binding = $Site.bindings
    [string]$BindingInfo = $Binding.Collection
    [string]$IP = $BindingInfo.SubString($BindingInfo.IndexOf(" "),$BindingInfo.IndexOf(":")-$BindingInfo.IndexOf(" "))         
    [string]$Port = $BindingInfo.SubString($BindingInfo.IndexOf(":")+1,$BindingInfo.LastIndexOf(":")-$BindingInfo.IndexOf(":")-1) 

    Write-Host "Binding info for" $Site.name " - IP:"$IP", Port:"$Port

    if ($Site.enabledProtocols -eq "http") {
        #DO CHECKS HERE     
    }
    elseif($site.enabledProtocols -eq "https") {
        #DO CHECKS HERE
    }
}

【问题讨论】:

  • 你试过get-webbinding、remove-webbinding和new-webbinding吗?
  • @empo:get-webbinding 工作正常(谢谢!)
  • 欢迎。我删除了我的答案,因为我收到了反对票(那里可能有问题),但您可以使用标准 cmdlet 正常工作。 remove-webbinding 和 new-webbinding 也可以正常工作。
  • 如果你只是想查看或列出所有绑定试试这个:stackoverflow.com/a/35158534/4502867

标签: windows powershell iis-7


【解决方案1】:

我不知道你到底想做什么,但我会试试的。我看到您引用了$Websites[2],即 webPage3。 你可以这样做:

$site = $websites | Where-object { $_.Name -eq 'WebPage3' }

那么当您查看$site.Bindings 时,您会意识到您需要Collection 成员:

$site.bindings.Collection

在我的机器上返回这个:

protocol                       bindingInformation
--------                       ------------------
http                           *:80:
net.tcp                        808:*
net.pipe                       *
net.msmq                       localhost
msmq.formatname                localhost
https                          *:443:

然后测试可能如下所示:

$is80 = [bool]($site.bindings.Collection | ? { $_.bindingInformation -eq '*:80:' })
if ($is80) {
    #website is ok    
} else {
    #remove all current binding
    #add correct binding
 }

我将Collection 的内容发送到管道并仅过滤属性bindingInformation 等于所需值的对象(更改它)。然后我把它投给[bool]。如果有需要的项目,这将返回$true,否则返回$false。

【讨论】:

  • $site.bindings.Collection 和 $_.bindingInformation 是我想要的! bool 方法有效,但我更愿意在我的帖子中检查它是否已编辑。
【解决方案2】:

我发现如果一个站点上有多个绑定,那么如果我需要编写脚本来访问绑定的各个部分,否则我只会得到第一个绑定。为了得到它们,我需要将脚本扩展如下:

Import-Module WebAdministration

$Websites = Get-ChildItem IIS:\Sites

foreach ($Site in $Websites) {

    $Binding = $Site.bindings

    [string]$BindingInfo = $Binding.Collection

    [string[]]$Bindings = $BindingInfo.Split(" ")

    $i = 0
    $header = ""
    Do{
        Write-Output ("Site    :- " + $Site.name + " <" + $Site.id +">")

        Write-Output ("Protocol:- " + $Bindings[($i)])

        [string[]]$Bindings2 = $Bindings[($i+1)].Split(":")

        Write-Output ("IP      :- " + $Bindings2[0])
        Write-Output ("Port    :- " + $Bindings2[1])
        Write-Output ("Header  :- " + $Bindings2[2])

        $i=$i+2
    } while ($i -lt ($bindings.count))
}

【讨论】:

    【解决方案3】:

    我的回答与上一个答案类似,但这更正了 HTTPS 站点并添加了更多有用的信息。

    Import-Module WebAdministration
    $hostname = hostname
    $Websites = Get-ChildItem IIS:\Sites
    $date = (Get-Date).ToString('MMddyyyy')
    foreach ($Site in $Websites) {
        $Binding = $Site.bindings
        [string]$BindingInfo = $Binding.Collection
        [string[]]$Bindings = $BindingInfo.Split(" ")#[0]
        $i = 0
        $status = $site.state
        $path = $site.PhysicalPath
        $fullName = $site.name
        $state = ($site.name -split "-")[0]
        $Collection = ($site.name -split "-")[1]
        $status = $site.State
        $anon = get-WebConfigurationProperty -Filter /system.webServer/security/authentication/AnonymousAuthentication -Name Enabled -PSPath IIS:\sites -Location $site.name | select-object Value
        $basic = get-WebConfigurationProperty -Filter /system.webServer/security/authentication/BasicAuthentication -Name Enabled -PSPath IIS:\ -location $site.name | select-object Value
        Do{
            if( $Bindings[($i)] -notlike "sslFlags=*"){
                [string[]]$Bindings2 = $Bindings[($i+1)].Split(":")
                $obj = New-Object PSObject
                $obj | Add-Member Date $Date
                $obj | Add-Member Host $hostname
                $obj | Add-Member State $state
                $obj | Add-Member Collection $Collection
                $obj | Add-Member SiteName $Site.name
                $obj | Add-Member SiteID $site.id
                $obj | Add-member Path $site.physicalPath
                $obj | Add-Member Protocol $Bindings[($i)]
                $obj | Add-Member Port $Bindings2[1]
                $obj | Add-Member Header $Bindings2[2]
                $obj | Add-member AuthAnon $Anon.value
                $obj | Add-member AuthBasic $basic.value
                $obj | Add-member Status $status
                $obj #take this out if you want to save to csv| export-csv "c:\temp\$date-$hostname.csv" -Append -notypeinformation
                $i=$i+2
            }
            else{$i=$i+1}
        } while ($i -lt ($bindings.count))
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 2015-11-29
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多