Я пытаюсь управлять привязками в приложении IIS с помощью PowerShell. Я хочу создать сайт с привязкой как http, так и https с помощью скрипта.
Вот что у меня есть на данный момент:
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
Как мне добавить привязки к моему $bindings
переменная / использовать какой-то другой механизм для достижения моей цели?
Вы можете использовать New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx
например
IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
Я прошел через процесс попытки добавить привязку https к сайту, и это может быть довольно болезненно. Есть много способов выполнить каждый шаг, и у каждого есть подводные камни. Я оставляю окончательное решение в надежде, что оно кому-то пригодится.
Это решение предполагает, что у вас установлен IIS и определен веб-сайт. Для целей этой публикации позвоните на сайт sample.contoso.com. Предположим, у вас есть сертификат в файле sample.contoso.com.pfx, который вы также хотите использовать.
Первый шаг - импортировать сертификат из файла.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Было бы неплохо, если бы этого было достаточно. А в некоторых случаях может быть. Однако для меня это оставило сертификат без надлежащего доступа к закрытому ключу. Это вызвало ошибку PowerShell «Указанный сеанс входа в систему не существует. Возможно, он уже был прерван», когда я пошел добавлять сертификат в привязку (см. Этот шаг позже). Итак, следующий шаг - исправить ACL для закрытого ключа.
$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
Это позволит локальной системе иметь полный доступ к закрытому ключу, если он не унаследован от содержащей его папки.
Если вы хотите получить уже установленный сертификат, вам понадобится его хеш, и вы можете получить его с помощью Get-Item следующим образом:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Следующим шагом будет создание привязки.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Важно отметить, что https чувствителен к регистру. Если вы вместо этого используете «HTTPS», вы получите совершенно другой результат привязки.
К этой привязке еще не прикреплен сертификат, поэтому последний шаг - прикрепить сертификат. Если сертификат является надежным и безопасность правильная, этот шаг должен быть успешным. Однако это может быть привередливым, если есть какие-либо проблемы с сертификатом.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Если это не удается с сообщением о том, что сеанс входа в систему не существует, возможно, возникла проблема с сертификатом. Для получения более подробной информации просмотрите программу просмотра событий. Во время своих усилий я обнаружил событие 5061 в журнале безопасности. Когда это не удалось, он показал, что OpenKey не работает с 80090016 (набор ключей не существует). И сбой был из-за того, что SYSTEM не имела доступа к закрытому ключу.
Этого мне было достаточно, чтобы создать привязку https. Привязка http была побочным продуктом использования командлета New-WebSite. Если он не предоставляется бесплатно, создание привязки порта 80 с помощью командлета New-WebBinding не представлялось проблемой.
Я думаю, что вам нужно следующее:
$bindings = @(
@{protocol="http";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord},
@{protocol="https";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord}
)
В основном вам нужно передать массив привязок. Более полезная информация здесь - (http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-presentative-iis-ui-tasks)
(Изменить: исправлена опечатка в синтаксисе массива - лишняя запятая)