Додайте прив'язку до веб-сайту IIS за допомогою посилання shell


19

Я намагаюсь керувати прив’язками в додатку IIS за допомогою повороту. Я хотів би створити сайт із прив’язкою 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змінної / використовувати якийсь інший механізм для досягнення своєї мети?

Відповіді:


24

Ви можете використовувати New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

напр

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

Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Марк Хендерсон

Ви думаєте, що я придумаю кращий приклад, ніж внизу статті 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

Було б добре, якби цього було достатньо. А в деяких випадках це може бути. Однак для мене це дозволило залишити сертифікат без належного доступу до приватного ключа. Це спричинило помилку в оболонці повноважень "Вказаний сеанс входу не існує. Можливо, його вже припинено", коли я пішов додати сертифікат до прив'язки (див. Цей крок пізніше). Отже, наступним кроком є ​​налаштування 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-representative-iis-ui-tasks )

(Редагувати: виправлена ​​помилка в синтаксисі масиву - стороння кома)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.