Dodaj powiązanie do witryny IIS za pomocą programu PowerShell

19

Próbuję kontrolować powiązania w aplikacji IIS za pomocą programu PowerShell. Chciałbym utworzyć witrynę z powiązaniem http i https za pomocą skryptu.

Oto co mam do tej pory:

Param(
    [Parameter(Mandatory=$True,Position=1)]
    [string]$hostname,
    [Parameter(Mandatory=$True,Position=2)]
    [string]$installPath,
    [Parameter(Mandatory=$False,Position=3)]
    [string]$ip
)

Import-Module WebAdministration

$appPoolName =  $hostname + 'Pool'

$port = 80
$hostRecord = $hostname+'.example.com'

$bindings = @{protocol="http";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord}

New-Item IIS:\AppPools\$appPoolName
Set-ItemProperty IIS:\AppPools\$appPoolName managedRuntimeVersion v4.0

New-Item IIS:\Sites\$hostname -Bindings $bindings -PhysicalPath $installPath
Set-ItemProperty IIS:\Sites\$hostname -Name applicationPool -Value $appPoolName

Jak dodać powiązania do mojej $bindingszmiennej / użyć innego mechanizmu, aby osiągnąć swój cel?

Khanzor
źródło

Odpowiedzi:

24

Możesz użyć New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

na przykład

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
źródło
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Mark Henderson
Myślisz, że wymyślę lepszy przykład niż na dole artykułu o technecie?
MatthewP
15
Nie, ale być może powinieneś wziąć udział w odpowiednim artykule z technetu i odtworzyć go tutaj w bloku cytatu. Zredagowałem coś, co powinno wystarczyć.
Mark Henderson
Czy to wymaga ponownego uruchomienia IIS, aby zadziałało?
Krunal
10

Przeszedłem przez proces dodawania powiązania https do witryny i może to być dość bolesne. Istnieje wiele sposobów na osiągnięcie każdego kroku i każdy z nich ma pułapki. Zostawiam ostatnie rozwiązanie, mając nadzieję, że ktoś uzna je za przydatne.

To rozwiązanie zakłada, że ​​masz zainstalowane IIS i zdefiniowano witrynę internetową. Zadzwoń na stronę sample.contoso.com do celów tego postu. Załóżmy, że masz certyfikat w pliku sample.contoso.com.pfx, którego również chcesz użyć.

Pierwszym krokiem jest zaimportowanie certyfikatu z pliku.

$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd

Byłoby miło, gdyby to wystarczyło. A w niektórych przypadkach może tak być. Jednak dla mnie pozostawiło to certyfikat bez odpowiedniego dostępu do klucza prywatnego. Spowodowało to błąd PowerShell „Określona sesja logowania nie istnieje. Być może została już zakończona”, gdy poszedłem dodać certyfikat do powiązania (zobacz ten krok później). Kolejnym krokiem jest naprawa listy ACL dla klucza prywatnego.

$privateKeyFilename = $webServerCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$privateKeyFullPath = "c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"+$privateKeyFilename
$aclRule = "SYSTEM", "Full", "Allow"
$aclEntry = New-Object System.Security.AccessControl.FileSystemAccessRule $aclRule
$privateKeyAcl = (Get-Item $privateKeyFullPath).GetAccessControl("Access")
$privateKeyAcl.AddAccessRule($aclEntry)
Set-Acl $privateKeyFullPath $privateKeyAcl

Umożliwi to systemowi lokalnemu pełny dostęp do klucza prywatnego, jeśli nie zostanie on odziedziczony z folderu zawierającego.

Jeśli chcesz uzyskać certyfikat, który jest już zainstalowany, potrzebujesz do niego skrótu i ​​możesz go pobrać za pomocą Get-Item:

$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95

Następnym krokiem jest utworzenie powiązania.

New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"

Należy zauważyć, że w „https” rozróżniana jest wielkość liter. Jeśli zamiast tego użyjesz „HTTPS”, otrzymasz naprawdę inny wynik wiązania.

Wiązanie to nie ma jeszcze dołączonego certyfikatu, więc ostatnim krokiem jest dołączenie certyfikatu. Jeśli certyfikat jest poprawnie zaufany, a bezpieczeństwo jest prawidłowe, ten krok powinien zakończyć się powodzeniem. Może to być trudne, jeśli wystąpią jakiekolwiek problemy z certyfikatem.

$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")

Jeśli to się nie powiedzie, komunikat o sesji logowania nie istnieje, może to oznaczać problem z certyfikatem. Przejrzyj przeglądarkę zdarzeń, aby uzyskać więcej informacji. Podczas moich wysiłków znalazłem zdarzenie 5061 w dzienniku bezpieczeństwa. Gdy zawiodło, pokazało, że OpenKey zawiódł z 80090016 (zestaw kluczy nie istnieje). A błąd polegał na tym, że SYSTEM nie miał dostępu do klucza prywatnego.

To wystarczyło mi, aby utworzyć powiązanie https. Powiązanie http było produktem ubocznym użycia polecenia cmdlet New-WebSite. Jeśli nie przyjdzie za darmo, tworzenie powiązania portu 80 za pomocą polecenia cmdlet New-WebBinding nie jest wyzwaniem.

Prof. von Lemongargle
źródło
1
Doceniam tę odpowiedź, ale nie wydaje się być łatwiejsza trasa @ stackoverflow.com/questions/32390097/... .
Peter Majeed,
1
Zgadzam się, że wywołanie AddSslCertificate jest przyjemniejsze niż składnia nowego elementu i zastąpiłem je. Frustracja, jaką miałem podczas pracy nad tym, to komunikaty o błędach, które otrzymałem oraz fakt, że nie mogłem powiązać ich z rozwiązaniem za pomocą wyszukiwarki Google. Tak więc pozostałe słowa są związane z ułatwieniem tego procesu w przyszłości lub dla kogoś innego.
Prof. von Lemongargle,