2013-03-20 4 views
29

Ich dokumentiere alle Websites und Bindung im Zusammenhang mit der Website aus dem IIS. Sie fragen sich, ob es eine einfache Möglichkeit gibt, diese Liste durch ein Powershell-Skript zu erhalten, anstatt manuell auf IIS zu tippen?Zeigen Sie alle Websites und Bindungen in Powershell

Ich möchte die Ausgabe etwas wie folgt aus:

Site       Bindings 
TestSite      www.hello.com 
          www.test.com 
JonDoeSite     www.johndoe.site 
+1

Welche Version von Windows/IIS haben Sie? Mit IIS unter Windows Server 2012 können Sie einfach 'Get-WebBinding' verwenden, wenn ich mich richtig erinnere. –

+0

Ja, es ist Server 2012. Das Ausführen von Get-Webbinding gibt protocal, bindinginformaiton, sslFlags zurück. nicht im selben Format wie ich meine Ausgabe möchte. – sanjeev40084

Antwort

28

Versuchen Sie, wie das ist etwas, das Format bekommen Sie wollte: (. Dh eine Bindung zu finden)

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 
+2

Sehr schön. Ich hätte nicht gedacht, Regex hinzuzufügen, um die Objekte auszuwerten, aber das ist eine gute Verwendung der Cmdlets New \ Group-Object. Ich werde deswegen einen Code aktualisieren müssen. –

+0

Verwenden von powershell.exe zum Aufrufen von myscript.ps1, Formatieren-Tabelle funktioniert nicht zum Anzeigen (Ausgabe) – Kiquenet

+1

In Windows 2008 R2 SP1 löst dies den Fehler aus _ "Der Begriff 'Get-WebBinding' wird nicht als Name eines Cmdlets erkannt. Funktion, Skriptdatei oder ausführbares Programm Überprüfen Sie die Schreibweise des Namens oder, falls ein Pfad enthalten war, vergewissern Sie sich, dass der Pfad korrekt ist, und versuchen Sie es erneut. "_ (Die zweite Antwort funktioniert, wenn sie leicht geändert wird). – Abel

52

versuchen diese

Import-Module Webadministration 
Get-ChildItem -Path IIS:\Sites 

etwas zurückgeben sollte, die wie folgt aussieht:

Name    ID State  Physical Path     Bindings 
----    -- -----  -------------     -------- 
ChristophersWeb 22 Started C:\temp    http *:8080:ChristophersWebsite.ChDom.com 

Von hier können Sie Ergebnisse verfeinern, aber sei vorsichtig. Eine Pipe zu der Select-Anweisung gibt Ihnen nicht das, was Sie brauchen. Basierend auf Ihren Anforderungen würde ich ein benutzerdefiniertes Objekt oder Hashtable erstellen.

+0

funktioniert. genial :) – sanjeev40084

+0

wie funktioniert es?Ich meine es funktioniert, aber egal wo ich meine Dateien habe? die IIS: \ Sites werden immer Elemente aus IIS auswählen? oder ist das an eine Spezifikation gebunden? Pfad? – RayofCommand

+1

@RayofCommand - dies funktioniert, indem der in den IIS-Webkonfigurationsdateien definierte Speicherort analysiert wird, der die IIS 5/6 Metabase ersetzt hat. Dies sind von Natur aus XML-Dateien und befinden sich in C: \ Windows \ System32 \ inetsrv \ config –

2

Versuchen Sie, diese

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 
} 
} 
+0

dieser zeigt nur meine erste Domäne in jedem IIS: \ Sites \ und nicht alle anderen Domänennamen Bindings ich innerhalb der gleichen Website konfiguriert. –

9

Wenn Sie nur alle Seiten auflisten möchten

Ändern Sie das Arbeitsverzeichnis in C: \ Windows \ system32 \ inetsrv

cd c: \ Windows \ system32 \ inetsrv

Nächster Lauf appcmd Liste Website und Ausgabe in eine Datei. z c: \ IISSiteBindings.txt

appcmd Liste site> c: \ IISSiteBindings.txt

jetzt offen mit Notizblock aus Ihrer Eingabeaufforderung.

Notizblock c: \ IISSiteBindings.txt

+0

Keine PS-Antwort; aber kurz und bündig und listet ID-Nummern auf, die zum Scannen von IIS-Protokollen nützlich sein können. –

2
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 
    } 
} 
9

Die einfachste Art und Weise, wie ich sah:

Foreach ($Site in get-website) { Foreach ($Bind in $Site.bindings.collection) {[pscustomobject]@{name=$Site.name;Protocol=$Bind.Protocol;Bindings=$Bind.BindingInformation}}} 
0

ich diese Frage gefunden, weil ich eine Web-Seite mit Links generieren wollte alle Websites, die auf meinem IIS ausgeführt werden. Ich habe Alexander Shapkins answer verwendet, um das Folgende zu erstellen, um eine Reihe von Links zu generieren.

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

Dann füge ich die Ergebnisse in diesen hastig geschriebenen HTML ein.

Ich weiß nicht wirklich Powershell, so zögern Sie nicht, meine Antwort zu bearbeiten, um es aufzuräumen.

+0

Ich nehme an, ich könnte den HTML-Code wahrscheinlich in das Skript einfügen und auf das Einfügen verzichten. –