Перебрать все привязки, настроенные в IIS с powershell - PullRequest
7 голосов
/ 31 мая 2011

Я ищу способ просмотреть все параметры привязки , уже настроенные в моем IIS.

Я использую это для работы с IIS в Powershell:

Import-Module WebAdministration

Пока я смог получить необходимую основную информацию:

$Websites = Get-ChildItem IIS:\Sites

Мой массив $ Веб-сайты заполнены правильно и с помощью следующей команды ...

$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
    }
}

Ответы [ 3 ]

7 голосов
/ 31 мая 2011

Я не знаю точно, что вы пытаетесь сделать, но я постараюсь. Я вижу, что вы ссылаетесь на $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 в противном случае.

1 голос
/ 01 июля 2014

Я обнаружил, что если на сайте было несколько привязок, тогда, если мне нужно было написать сценарий доступа к отдельным частям привязок, в противном случае я получил только первую привязку.Чтобы получить их все, мне нужно было расширить скрипт, как показано ниже:

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))
}
0 голосов
/ 03 октября 2015

У меня было что-то похожее на последний ответ, но это исправляет 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...