Boucle à travers toutes les liaisons configurées dans IIS avec powershell

Je cherche un moyen de passer en revue tous les parameters de liaison déjà configurés dans mon IIS.

Je l’utilise pour travailler avec IIS dans Powershell:

Import-Module WebAdministration 

Jusqu’à présent, j’ai pu obtenir les principales informations requirejses:

 $Websites = Get-ChildItem IIS:\Sites 

Mon tableau $ Sites Web est rempli correctement et avec la commande suivante …

 $Websites[2] 

..Je reçois ce résultat:

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

Maintenant, voici la partie avec laquelle j’ai du mal avec:

Je veux vérifier si la liaison est correcte. Pour ce faire, je n’ai besoin que de la liaison. J’ai essayé:

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

Déboguer ce code me montre que $ Site ne contient pas ce que j’attendais: “Microsoft.IIs.PowerShell.Framework.ConfigurationElement”. Je n’ai actuellement aucune idée de comment accéder explicitement aux informations de liaison pour arriver à quelque chose comme ça (dans la boucle foreach):

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

Merci de votre aide!


Solution:

 Import-Module WebAdministration $Websites = Get-ChildItem IIS:\Sites foreach ($Site in $Websites) { $Binding = $Site.bindings [ssortingng]$BindingInfo = $Binding.Collection [ssortingng]$IP = $BindingInfo.SubSsortingng($BindingInfo.IndexOf(" "),$BindingInfo.IndexOf(":")-$BindingInfo.IndexOf(" ")) [ssortingng]$Port = $BindingInfo.SubSsortingng($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 } } 

Je ne sais pas exactement ce que vous essayez de faire, mais je vais essayer. Je vois que vous faites référence à $Websites[2] qui est webPage3 . Vous pouvez le faire comme ceci:

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

Ensuite, lorsque vous regardez $site.Bindings , vous réalisez que vous avez besoin du membre Collection :

 $site.bindings.Collection 

Sur ma machine cela retourne ceci:

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

Et le test pourrait alors ressembler à ceci:

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

J’ai envoyé du contenu de Collection au pipeline et filtré uniquement les objects dont la propriété bindingInformation est égale à la valeur souhaitée (modifiez-la). Puis je le jette à [bool] . Cela retournera $true s’il y a un élément désiré, $false sinon.

J’ai trouvé que s’il y avait plusieurs liaisons sur un site, si je devais écrire un script pour accéder à des parties individuelles des liaisons, sinon, je n’obtiendrais que la première liaison. Pour les obtenir tous, j’avais besoin que le script soit étendu comme suit:

 Import-Module WebAdministration $Websites = Get-ChildItem IIS:\Sites foreach ($Site in $Websites) { $Binding = $Site.bindings [ssortingng]$BindingInfo = $Binding.Collection [ssortingng[]]$Bindings = $BindingInfo.Split(" ") $i = 0 $header = "" Do{ Write-Output ("Site :- " + $Site.name + " <" + $Site.id +">") Write-Output ("Protocol:- " + $Bindings[($i)]) [ssortingng[]]$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)) } 

J’avais quelque chose de similaire à la dernière réponse, mais cela corrige les sites HTTPS et ajoute un peu plus d’informations utiles.

 Import-Module WebAdministration $hostname = hostname $Websites = Get-ChildItem IIS:\Sites $date = (Get-Date).ToSsortingng('MMddyyyy') foreach ($Site in $Websites) { $Binding = $Site.bindings [ssortingng]$BindingInfo = $Binding.Collection [ssortingng[]]$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=*"){ [ssortingng[]]$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)) }