2013-03-20 5 views
29

Dokumentuję wszystkie witryny i powiązania związane z witryną z IIS. Zastanawiasz się, czy istnieje prosty sposób, aby uzyskać tę listę za pomocą skryptu powłoki, zamiast ręcznego wpisywania w systemie IIS?Wyświetl wszystkie witryny i powiązania w pakiecie uprawnień

chcę coś wyjściowe tak:

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

jaka wersja systemu Windows/IIS posiadasz? Dzięki IIS na Windows Server 2012 możesz po prostu użyć 'Get-WebBinding' jeśli dobrze pamiętam. –

+0

Tak, to jest serwer 2012. Uruchamianie funkcji Get-Webbinding zwraca protokół, bindinformation, sslFlags. nie w tym samym formacie, co moje wyjście. – sanjeev40084

Odpowiedz

28

Spróbuj coś takiego dostać format chciałeś: (tj. Znaleźć wiązania)

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

Bardzo ładne. Nie pomyślałbym o dodaniu wyrażenia regularnego do oceny obiektów, ale jest to bardzo dobre użycie poleceń cmdlet New \ Group-Object. W związku z tym będę musiał zaktualizować niektóre kody. –

+0

Użycie powershell.exe do wywołania myscript.ps1, Format-Table nie działa w celu wyświetlenia (wyprowadzenia) – Kiquenet

+1

W Windows 2008 R2 SP1, powoduje to błąd _ "Termin" Get-WebBinding "nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcja, plik skryptu lub działający program. Sprawdź pisownię nazwy lub, jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest prawidłowa i spróbuj ponownie. "_ (druga odpowiedź poniżej działa, jeśli jest lekko zmieniona). – Abel

52

spróbować

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

Gdyby coś, co wygląda jak ten powrót:

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

Stąd można udoskonalić rezultaty, ale bądź ostrożny. Rura do instrukcji select nie dostarczy Ci tego, czego potrzebujesz. W oparciu o twoje wymagania zbudowałbym obiekt niestandardowy lub hakowatą.

+0

działa. niesamowite :) – sanjeev40084

+0

jak to działa?Mam na myśli, że działa, ale nie ważne gdzie mam moje pliki? IIS: \ Sites zawsze wybierze elementy z IIS? czy jest to związane ze specyfikacją? ścieżka? – RayofCommand

+1

@RayofCommand - działa poprzez analizowanie lokalizacji zdefiniowanej w internetowych plikach konfiguracyjnych IIS, które zastąpiły metabo IIS 5/6. Są to pliki xml z natury i znajdują się w C: \ Windows \ System32 \ inetsrv \ config –

2

Spróbuj

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

, ten pokazuje tylko moją pierwszą domenę w każdym IIS: \ Sites \, a nie wszystkie inne powiązania nazw domen, które skonfigurowałem w tej samej witrynie. –

9

Jeśli chcesz po prostu wymienić wszystkie miejsca

Zmień katalog roboczy na C: \ Windows \ system32 \ inetsrv

cd c: \ Windows \ system32 \ inetsrv

Następna strona z aplikacją appcmd i wyjście do pliku. np c: \ IISSiteBindings.txt

appcmd lista strona> c: \ IISSiteBindings.txt

teraz otwarty z notatnika z linii poleceń.

notepad c: \ IISSiteBindings.txt

+0

Brak odpowiedzi PS; ale krótkie i słodkie, a także listy numerów identyfikacyjnych, które mogą być przydatne do skanowania dzienników IIS. –

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

Najłatwiej jak widziałem:

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

znalazłem na to pytanie, ponieważ chciałam, aby wygenerować stronę z linkami do wszystkie witryny działające na moim IIS. Użyłem Alexander Shapkin's answer, aby wymyślić następujące, aby wygenerować kilka linków.

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

Następnie wklejam wyniki do tego pośpiesznie napisanego HTML.

<html> 
<style> 
    a { display: block; } 
</style> 
{paste powershell results here} 
</body> 
</html> 

Naprawdę nie znam Powershell, więc proszę, edytuj moją odpowiedź, aby to wyczyścić.

+0

Prawdopodobnie mógłbym dołączyć kod HTML do skryptu i zrezygnować z wklejania. –