เพิ่มการรวมเข้ากับไซต์ 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ตัวแปรของฉัน/ ใช้กลไกอื่น ๆ เพื่อบรรลุเป้าหมายได้อย่างไร

คำตอบ:


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

15
ไม่ได้ แต่บางทีคุณควรมีส่วนร่วมในบทความด้านเทคนิคที่เกี่ยวข้องและทำซ้ำในบล็อกคำพูด ฉันแก้ไขในสิ่งที่ควรจะเพียงพอ
Mark Henderson

จำเป็นต้องรีสตาร์ท IIS เพื่อให้มีผลหรือไม่
Krunal

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 (The Keyset ไม่มีอยู่) และความล้มเหลวก็เพราะระบบไม่สามารถเข้าถึงคีย์ส่วนตัว

นั่นก็เพียงพอแล้วสำหรับฉันที่จะสร้างการเชื่อมโยง https การเชื่อมโยง http เป็นผลพลอยได้จากการใช้ cmdlet ของ New-WebSite หากไม่ได้มาฟรีฉันไม่พบการสร้างพอร์ต 80 ที่เชื่อมโยงกับ cmdlet New-WebBinding ให้เป็นสิ่งที่ท้าทาย


1
ฉันชื่นชมคำตอบนี้ แต่ดูเหมือนว่าจะมีเส้นทางที่ง่าย @ stackoverflow.com/questions/32390097/...
Peter Majeed

1
ฉันยอมรับว่าการเรียก AddSslCertificate มีความชื่นชอบมากกว่าไวยากรณ์ของรายการใหม่และฉันแทนที่มัน ความขัดข้องที่ฉันมีเมื่อทำงานผ่านสิ่งนี้คือข้อความแสดงข้อผิดพลาดที่ฉันได้รับและความจริงที่ว่าฉันไม่สามารถเชื่อมโยงพวกเขากลับไปยังการแก้ปัญหาโดยใช้การค้นหาของ Google ดังนั้นคำที่เหลือจะเกี่ยวข้องกับการทำให้กระบวนการนั้นง่ายขึ้นในอนาคตหรือเพื่อคนอื่น
Prof Von Lemongargle

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 )

(แก้ไข: แก้ไขการพิมพ์ผิดในไวยากรณ์อาร์เรย์ - เครื่องหมายจุลภาคที่ไม่เกี่ยวข้อง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.