Fügen Sie mithilfe von Powershell eine Bindung zu einer IIS-Site hinzu

19

Ich versuche, Bindungen in einer IIS-App mithilfe von Powershell zu steuern. Ich möchte eine Site mit einer http- und einer https-Bindung mithilfe eines Skripts erstellen.

Das habe ich bisher:

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

Wie füge ich meiner $bindingsVariablen Bindungen hinzu / verwende einen anderen Mechanismus, um mein Ziel zu erreichen?

Khanzor
quelle

Antworten:

24

Sie können New-WebBinding verwenden: http://technet.microsoft.com/en-us/library/ee790567.aspx

z.B

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
quelle
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Mark Henderson
Denken Sie, dass ich ein besseres Beispiel finden werde als am Ende des Technet-Artikels?
MatthewP
15
Nein, aber vielleicht sollten Sie den Teil des Technet-Artikels, der relevant ist, hier in einem Zitatblock wiedergeben. Ich habe etwas bearbeitet, das ausreichen sollte.
Mark Henderson
Ist ein Neustart von IIS erforderlich, um wirksam zu werden?
Krunal
10

Ich habe versucht, eine https-Bindung zu einer Site hinzuzufügen, was ziemlich schmerzhaft sein kann. Es gibt viele Möglichkeiten, um jeden Schritt auszuführen, und jeder hat Fallstricke. Ich lasse die endgültige Lösung hinter mir und hoffe, dass jemand sie nützlich findet.

Diese Lösung setzt voraus, dass Sie IIS installiert und eine Website definiert haben. Rufen Sie die Site sample.contoso.com für die Zwecke dieses Beitrags auf. Angenommen, Sie haben ein Zertifikat in einer sample.contoso.com.pfx-Datei, das Sie ebenfalls verwenden möchten.

Der erste Schritt besteht darin, das Zertifikat aus der Datei zu importieren.

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

Es wäre schön, wenn das ausreichen würde. Und in einigen Fällen kann es sein. Für mich blieb das Zertifikat jedoch ohne ordnungsgemäßen Zugriff auf den privaten Schlüssel. Dies verursachte einen Powershell-Fehler "Eine angegebene Anmeldesitzung existiert nicht. Möglicherweise wurde sie bereits beendet", als ich das Zertifikat zur Bindung hinzufügte (siehe diesen Schritt später). Der nächste Schritt besteht also darin, die ACL für den privaten Schlüssel zu reparieren.

$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

Auf diese Weise kann das lokale System uneingeschränkt auf den privaten Schlüssel zugreifen, wenn dieser nicht vom übergeordneten Ordner geerbt wird.

Wenn Sie ein Zertifikat erhalten möchten, das bereits installiert ist, benötigen Sie den Hash dafür und können ihn mit Get-Item wie folgt abrufen:

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

Der nächste Schritt besteht darin, die Bindung zu erstellen.

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

Es ist wichtig zu beachten, dass "https" zwischen Groß- und Kleinschreibung unterscheidet. Wenn Sie stattdessen "HTTPS" verwenden, erhalten Sie ein wirklich anderes Bindungsergebnis.

An diese Bindung ist noch kein Zertifikat angehängt. Der letzte Schritt ist das Anhängen des Zertifikats. Wenn das Zertifikat ordnungsgemäß als vertrauenswürdig eingestuft ist und die Sicherheit korrekt ist, sollte dieser Schritt erfolgreich sein. Es kann jedoch schwierig sein, wenn ein Problem mit dem Zertifikat vorliegt.

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

Wenn dies mit der Meldung fehlschlägt, dass keine Anmeldesitzung vorhanden ist, liegt möglicherweise ein Problem mit dem Zertifikat vor. Überprüfen Sie die Ereignisanzeige auf weitere Details. Während meiner Bemühungen fand ich Ereignis 5061 im Sicherheitsprotokoll. Wenn es fehlschlug, zeigte es, dass OpenKey mit 80090016 fehlschlug (das Keyset existiert nicht). Der Fehler war, dass SYSTEM keinen Zugriff auf den privaten Schlüssel hatte.

Das hat mir ausgereicht, um die https-Bindung zu erstellen. Die http-Bindung war ein Nebenprodukt der Verwendung des Cmdlets New-WebSite. Wenn dies nicht kostenlos ist, empfand ich das Erstellen der Port 80-Bindung mit dem Cmdlet New-WebBinding nicht als Herausforderung.

Prof. Von Lemongargle
quelle
1
Ich habe diese Antwort geschätzt, aber es scheint eine einfachere Route zu geben: stackoverflow.com/questions/32390097/… .
Peter Majeed
1
Ich stimme zu, dass der Aufruf von AddSslCertificate ansprechender ist als die Syntax für neue Elemente, und ich habe sie ersetzt. Die Frustration, die ich hatte, als ich das durchgearbeitet habe, waren die Fehlermeldungen und die Tatsache, dass ich sie nicht über eine Google-Suche mit einer Auflösung in Verbindung bringen konnte. Die verbleibenden Wörter beziehen sich also auf die Beschleunigung dieses Prozesses in der Zukunft oder für eine andere Person.
Prof Von Lemongargle
4

Ich denke, was Sie suchen, ist Folgendes:

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

Grundsätzlich müssen Sie eine Reihe von Bindungen übergeben. Weitere hilfreiche Informationen finden Sie hier ( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks ).

(Edit: Tippfehler in der Array-Syntax behoben - Fremdkomma)

Taras Alenin
quelle