kb2506146 - octopus powershell iis
Mostrar todos los sitios y enlaces en powershell (7)
Encontré esta pregunta porque quería generar una página web con enlaces a todos los sitios web que se ejecutan en mi IIS. Utilicé la answer Alexander Shapkin para llegar a lo siguiente para generar un montón de enlaces.
$hostname = "localhost"
Foreach ($Site in get-website) {
Foreach ($Bind in $Site.bindings.collection) {
$data = [PSCustomObject]@{
name=$Site.name;
Protocol=$Bind.Protocol;
Bindings=$Bind.BindingInformation
}
$data.Bindings = $data.Bindings -replace ''(:$)'', ''''
$html = "<a href=""" + $data.Protocol + "://" + $data.Bindings + """>" + $data.name + "</a>"
$html.Replace("*", $hostname);
}
}
Luego pego los resultados en este HTML escrito apresuradamente.
<html>
<style>
a { display: block; }
</style>
{paste powershell results here}
</body>
</html>
Realmente no conozco Powershell, así que no dudes en editar mi respuesta para limpiarla.
Estoy documentando todos los sitios y enlaces relacionados con el sitio desde el IIS. ¿Se pregunta si hay una manera fácil de obtener esta lista a través del script de PowerShell en lugar de escribir manualmente mirando IIS?
Quiero que el resultado sea algo como esto:
Site Bindings
TestSite www.hello.com
www.test.com
JonDoeSite www.johndoe.site
La forma más fácil que vi:
Foreach ($Site in get-website) { Foreach ($Bind in $Site.bindings.collection) {[pscustomobject]@{name=$Site.name;Protocol=$Bind.Protocol;Bindings=$Bind.BindingInformation}}}
Prueba esto
function DisplayLocalSites
{
try{
Set-ExecutionPolicy unrestricted
$list = @()
foreach ($webapp in get-childitem IIS:/Sites/)
{
$name = "IIS:/Sites/" + $webapp.name
$item = @{}
$item.WebAppName = $webapp.name
foreach($Bind in $webapp.Bindings.collection)
{
$item.SiteUrl = $Bind.Protocol +''://''+ $Bind.BindingInformation.Split(":")[-1]
}
$obj = New-Object PSObject -Property $item
$list += $obj
}
$list | Format-Table -a -Property "WebAppName","SiteUrl"
$list | Out-File -filepath C:/websites.txt
Set-ExecutionPolicy restricted
}
catch
{
$ExceptionMessage = "Error in Line: " + $_.Exception.Line + ". " + $_.Exception.GetType().FullName + ": " + $_.Exception.Message + " Stacktrace: " + $_.Exception.StackTrace
$ExceptionMessage
}
}
Pruebe algo como esto para obtener el formato que deseaba:
Get-WebBinding | % {
$name = $_.ItemXPath -replace ''(?:.*?)name=''''([^'''']*)(?:.*)'', ''$1''
New-Object psobject -Property @{
Name = $name
Binding = $_.bindinginformation.Split(":")[-1]
}
} | Group-Object -Property Name |
Format-Table Name, @{n="Bindings";e={$_.Group.Binding -join "`n"}} -Wrap
Si solo desea enumerar todos los sitios (es decir, para encontrar un enlace)
Cambie el directorio de trabajo a C: / Windows / system32 / inetsrv
cd c: / Windows / system32 / inetsrv
A continuación, ejecute el sitio de la lista appcmd y genere un archivo. por ejemplo c: / IISSiteBindings.txt
sitio de lista de aplicaciones> c: / IISSiteBindings.txt
Ahora abra con el bloc de notas desde el símbolo del sistema.
Bloc de notas c: / IISSiteBindings.txt
prueba esto
Import-Module Webadministration
Get-ChildItem -Path IIS:/Sites
Debería devolver algo que se parece a esto:
Name ID State Physical Path Bindings
---- -- ----- ------------- --------
ChristophersWeb 22 Started C:/temp http *:8080:ChristophersWebsite.ChDom.com
Desde aquí puede refinar los resultados, pero tenga cuidado. Un enlace a la declaración de selección no le proporcionará lo que necesita. En función de sus requisitos, crearía un objeto personalizado o hashtable.
function Get-ADDWebBindings {
param([string]$Name="*",[switch]$http,[switch]$https)
try {
if (-not (Get-Module WebAdministration)) { Import-Module WebAdministration }
Get-WebBinding | ForEach-Object { $_.ItemXPath -replace ''(?:.*?)name=''''([^'''']*)(?:.*)'', ''$1'' } | Sort | Get-Unique | Where-Object {$_ -like $Name} | ForEach-Object {
$n=$_
Get-WebBinding | Where-Object { ($_.ItemXPath -replace ''(?:.*?)name=''''([^'''']*)(?:.*)'', ''$1'') -like $n } | ForEach-Object {
if ($http -or $https) {
if ( ($http -and ($_.protocol -like "http")) -or ($https -and ($_.protocol -like "https")) ) {
New-Object psobject -Property @{Name = $n;Protocol=$_.protocol;Binding = $_.bindinginformation}
}
} else {
New-Object psobject -Property @{Name = $n;Protocol=$_.protocol;Binding = $_.bindinginformation}
}
}
}
}
catch {
$false
}
}