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