Добавить привязку к сайту IIS с помощью powershell

19

Я пытаюсь контролировать привязки в приложении 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переменной / использовать какой-то другой механизм для достижения моей цели?

Khanzor
источник

Ответы:

24

Вы можете использовать New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

например

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
источник
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Марк Хендерсон
Как вы думаете, я приведу лучший пример, чем в конце статьи о Technet?
MatthewP
15
Нет, но, возможно, вам следует принять соответствующую статью Technet и воспроизвести ее здесь в блоке цитат. Я редактировал что-то, что должно быть достаточно.
Марк Хендерсон
Требуется ли перезагрузка IIS для вступления в силу?
Крунал
10

Я попытался добавить привязку 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.

Профессор фон Лемонгаргл
источник
1
Я оценил этот ответ, но, кажется, есть более простой маршрут @ stackoverflow.com/questions/32390097/… .
Питер Маджид
1
Я согласен, что вызов AddSslCertificate более приятен, чем синтаксис нового элемента, и я заменил его. Разочарование, которое я испытывал при работе с этим, было сообщениями об ошибках, которые я получил, и фактом, что я не мог связать их с разрешением, используя поиск Google. Таким образом, остальные слова относятся к облегчению этого процесса в будущем или для кого-то еще.
Профессор фон Лемонгаргл
4

Я думаю, что вы ищете следующее:

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

В основном вам нужно передать массив привязок. Более полезная информация здесь - ( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representive-iis-ui-tasks )

(Правка: исправлена ​​опечатка в синтаксисе массива - посторонняя запятая)

Тарас Аленин
источник