Ajouter une liaison à un site IIS à l'aide de PowerShell

19

J'essaie de contrôler les liaisons dans une application IIS à l'aide de 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 à ma $bindingsvariable / utiliser un autre mécanisme pour atteindre mon objectif?

Khanzor
la source

Réponses:

24

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
MatthewP
la source
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Mark Henderson
Pensez-vous que je vais trouver un meilleur exemple qu'au bas de l'article technet?
MatthewP
15
Non, mais vous devriez peut-être prendre la partie de l'article technet qui est pertinente et la reproduire ici dans un bloc de devis. J'ai édité quelque chose qui devrait être suffisant.
Mark Henderson
Cela nécessite-t-il de redémarrer IIS pour prendre effet?
Krunal
10

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 installé IIS et défini un site Web. Appelez le site sample.contoso.com aux fins de cet article. Supposons que vous disposez d'un certificat dans un fichier sample.contoso.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 ce n'est pas gratuit, je n'ai pas trouvé difficile de créer la liaison du port 80 avec l'applet de commande New-WebBinding.

Prof Von Lemongargle
la source
1
J'ai apprécié cette réponse, mais il semble y avoir un itinéraire plus facile @ stackoverflow.com/questions/32390097/… .
Peter Majeed
1
Je reconnais que l'appel AddSslCertificate est plus agréable que la syntaxe du nouvel élément et je l'ai remplacée. La frustration que j'ai ressentie lors de la résolution de ce problème était les messages d'erreur que j'ai reçus et le fait que je ne pouvais pas les relier à une résolution à l'aide d'une recherche Google. Ainsi, les mots restants sont liés à faciliter ce processus à l'avenir ou pour quelqu'un d'autre.
Prof Von Lemongargle
4

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)

Taras Alenin
la source