web-dev-qa-db-fra.com

Ajouter une liaison à un site IIS utilisant powershell

J'essaie de contrôler les liaisons dans une application IIS utilisant powershell. Je voudrais créer un site avec une liaison http et https à l'aide d'un script.

Voici ce que j'ai jusqu'à présent:

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

Comment ajouter des liaisons à mon $bindings variable/utiliser un autre mécanisme pour atteindre mon objectif?

20
Khanzor

Vous pouvez utiliser New-WebBinding: http://technet.Microsoft.com/en-us/library/ee790567.aspx

par exemple.

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
25
MatthewP

J'ai essayé d'ajouter une liaison https à un site et cela peut être assez douloureux. Il existe de nombreuses façons d'accomplir chaque étape et chacune a ses pièges. Je laisse la solution finale en espérant que quelqu'un la trouvera utile.

Cette solution suppose que vous avez IIS installé et un site Web défini. Appelez le site sample.contoso.com aux fins de cette publication. Supposons que vous avez un certificat dans sample.contoso. fichier com.pfx que vous souhaitez également utiliser.

La première étape consiste à importer le certificat à partir du fichier.

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

Ce serait bien si cela suffisait. Et dans certains cas, cela peut être le cas. Cependant, pour moi, cela a laissé le certificat sans accès approprié à la clé privée. Cela a provoqué une erreur PowerShell "Une session d'ouverture de session spécifiée n'existe pas. Elle peut déjà avoir été terminée" lorsque je suis allé ajouter le certificat à la liaison (voir cette étape plus tard). La prochaine étape consiste donc à réparer l'ACL pour la clé privée.

$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

Cela permettra au système local d'avoir un accès complet à la clé privée si elle n'est pas héritée du dossier contenant.

Si vous souhaitez obtenir un certificat qui est déjà installé, vous avez besoin du hachage pour celui-ci et pouvez le récupérer avec Get-Item comme ceci:

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

L'étape suivante consiste à créer la liaison.

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

Il est important de noter que "https" est sensible à la casse. Si vous utilisez "HTTPS" à la place, vous obtenez un résultat de liaison vraiment différent.

Cette liaison n'a pas encore de certificat attaché, donc la dernière étape consiste à attacher le certificat. Si le certificat est correctement approuvé et que la sécurité est correcte, cette étape doit réussir. Cela peut être difficile s'il y a un problème avec le certificat.

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

Si cela échoue avec un message sur une session d'ouverture de session n'existe pas, le certificat peut avoir un problème. Consultez l'Observateur d'événements pour plus de détails. Au cours de mes efforts, j'ai trouvé l'événement 5061 dans le journal de sécurité. Lorsqu'il a échoué, il a montré que OpenKey a échoué avec 80090016 (le jeu de clés n'existe pas). Et l'échec était dû au fait que SYSTEM n'avait pas accès à la clé privée.

Cela m'a suffi pour créer la liaison https. La liaison http était un sous-produit de l'utilisation de l'applet de commande New-WebSite. Si cela ne vient pas gratuitement, je n'ai pas trouvé que la création de la liaison du port 80 avec l'applet de commande New-WebBinding soit un défi.

12
Prof Von Lemongargle

Je pense que ce que vous recherchez est le suivant:

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

Fondamentalement, vous devez passer un tableau de liaisons. Plus d'informations utiles ici --- (http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks )

(Edit: Correction d'une faute de frappe dans la syntaxe du tableau - virgule superflue)

4
Taras Alenin