Menambahkan ikatan ke situs IIS menggunakan PowerShell

19

Saya mencoba untuk mengontrol binding dalam aplikasi IIS menggunakan PowerShell. Saya ingin membuat situs yang mengikat http dan https menggunakan skrip.

Inilah yang saya miliki sejauh ini:

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

Bagaimana cara menambahkan binding ke $bindingsvariabel saya / menggunakan beberapa mekanisme lain untuk mencapai tujuan saya?

Khanzor
sumber

Jawaban:

24

Anda dapat menggunakan New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

misalnya

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Mark Henderson
Apakah Anda pikir saya akan memberikan contoh yang lebih baik daripada di bagian bawah artikel teknis?
MatthewP
15
Tidak, tapi mungkin Anda harus mengambil bagian dari artikel teknis yang relevan dan mereproduksi di sini di blok kutipan. Saya telah mengedit sesuatu yang seharusnya cukup.
Mark Henderson
Apakah ini perlu me-restart IIS untuk berlaku?
Krunal
10

Saya telah melalui proses mencoba untuk menambahkan https mengikat ke situs dan itu bisa sangat menyakitkan. Ada banyak cara untuk mencapai setiap langkah dan masing-masing memiliki jebakan. Saya meninggalkan solusi terakhir dengan harapan seseorang akan merasakan manfaatnya.

Solusi ini mengasumsikan bahwa Anda telah menginstal IIS dan situs web yang ditentukan. Hubungi situs sample.contoso.com untuk keperluan posting ini. Asumsikan Anda memiliki sertifikat dalam file sample.contoso.com.pfx yang juga ingin Anda gunakan.

Langkah pertama adalah mengimpor sertifikat dari file.

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

Akan lebih baik jika itu sudah cukup. Dan dalam beberapa kasus mungkin. Namun, bagi saya, ini meninggalkan sertifikat tanpa akses yang tepat ke kunci pribadi. Ini menyebabkan kesalahan powershell "Sesi masuk yang ditentukan tidak ada. Mungkin sudah dihentikan" ketika saya pergi untuk menambahkan sertifikat ke penjilidan (lihat langkah itu nanti). Jadi, langkah selanjutnya adalah memperbaiki ACL untuk kunci privat.

$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

Ini akan memungkinkan sistem lokal untuk memiliki akses penuh ke kunci pribadi jika itu tidak diwarisi dari folder yang berisi.

Jika Anda ingin mendapatkan sertifikat yang sudah diinstal, Anda memerlukan hash untuk itu dan dapat mengambilnya dengan Get-Item seperti:

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

Langkah selanjutnya adalah membuat ikatan.

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

Penting untuk dicatat bahwa "https" adalah case-sensitive. Jika Anda menggunakan "HTTPS" sebagai gantinya, Anda mendapatkan hasil pengikatan yang sangat berbeda.

Ikatan ini belum memiliki sertifikat, jadi langkah terakhir adalah melampirkan sertifikat. Jika sertifikat dipercaya dengan benar dan keamanannya benar, langkah ini harus berhasil. Itu bisa menjadi rewel jika ada masalah dengan sertifikat sekalipun.

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

Jika ini gagal dengan pesan tentang sesi masuk tidak ada, maka sertifikat mungkin memiliki beberapa masalah. Tinjau penampil acara untuk detail lebih lanjut. Selama upaya saya, saya menemukan peristiwa 5061 di log keamanan. Ketika gagal, itu menunjukkan bahwa OpenKey gagal dengan 80090016 (The Keyset Tidak Ada). Dan kegagalannya adalah karena SISTEM tidak memiliki akses ke kunci pribadi.

Itu cukup bagi saya untuk membuat ikatan https. Ikatan http adalah produk sampingan dari menggunakan cmdlet New-WebSite. Jika tidak datang secara gratis, saya tidak menemukan membuat port 80 yang mengikat dengan cmdlet New-WebBinding menjadi tantangan.

Prof Von Lemongargle
sumber
1
Saya menghargai jawaban ini, tetapi sepertinya ada rute yang lebih mudah @ stackoverflow.com/questions/32390097/… .
Peter Majeed
1
Saya setuju bahwa panggilan AddSslCertificate lebih menyenangkan daripada sintaks item baru dan saya menggantinya. Rasa frustrasi yang saya alami ketika mengerjakan ini adalah pesan kesalahan yang saya dapatkan dan fakta bahwa saya tidak dapat menghubungkannya kembali ke resolusi menggunakan pencarian google. Jadi, kata-kata yang tersisa terkait dengan pelonggaran proses itu di masa depan atau untuk orang lain.
Prof Von Lemongargle
4

Saya pikir apa yang Anda kejar adalah sebagai berikut:

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

Pada dasarnya Anda harus memasukkan serangkaian ikatan. Informasi lebih lanjut di sini - ( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks )

(Edit: Memperbaiki kesalahan ketik dalam array sintaks - koma asing)

Taras Alenin
sumber