Aggiungere un'associazione a un sito IIS utilizzando PowerShell


19

Sto cercando di controllare i collegamenti in un'app IIS usando PowerShell. Vorrei creare un sito con un'associazione http e https usando uno script.

Questo è quello che ho finora:

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

Come aggiungo i binding alla mia $bindingsvariabile / utilizzo qualche altro meccanismo per raggiungere il mio obiettivo?

Risposte:


24

È possibile utilizzare New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

per esempio

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

Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Mark Henderson

Pensi che avrò un esempio migliore che in fondo all'articolo di technet?
Matteo P

15
No, ma forse dovresti prendere la parte dell'articolo di technet che è rilevante e riprodurla qui in un blocco di virgolette. Ho modificato qualcosa che dovrebbe essere sufficiente.
Mark Henderson

Questo richiede il riavvio di IIS per avere effetto?
Krunal,

10

Ho provato ad aggiungere un'associazione https a un sito e può essere piuttosto doloroso. Ci sono molti modi per compiere ogni passo e ognuno ha insidie. Lascio alle spalle la soluzione finale sperando che qualcuno la troverà utile.

Questa soluzione presuppone che IIS sia installato e che sia stato definito un sito Web. Chiamare il sito sample.contoso.com ai fini di questo post. Supponiamo di avere un certificato in un file sample.contoso.com.pfx che si desidera utilizzare anche.

Il primo passo è importare il certificato dal 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

Sarebbe bello se fosse sufficiente. E in alcuni casi potrebbe essere. Tuttavia, per me, questo ha lasciato il certificato senza un accesso adeguato alla chiave privata. Ciò ha causato un errore PowerShell "Una sessione di accesso specificata non esiste. Potrebbe essere già stata terminata" quando sono andato per aggiungere il certificato all'associazione (vedere il passaggio successivo). Quindi, il prossimo passo è sistemare l'ACL per la chiave privata.

$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

Ciò consentirà al sistema locale di avere pieno accesso alla chiave privata se questa non è ereditata dalla cartella contenente.

Se si desidera ottenere un certificato già installato, è necessario l'hash per esso e è possibile recuperarlo con Get-Item in questo modo:

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

Il prossimo passo è creare l'associazione.

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

È importante notare che "https" fa distinzione tra maiuscole e minuscole. Se invece usi "HTTPS", otterrai un risultato di associazione molto diverso.

Questa associazione non ha ancora un certificato allegato, quindi l'ultimo passaggio è quello di allegare il certificato. Se il certificato è correttamente attendibile e la sicurezza è corretta, questo passaggio dovrebbe avere esito positivo. Può essere pignolo se c'è qualche problema con il certificato però.

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

Se ciò non riesce con un messaggio su una sessione di accesso non esiste, il certificato potrebbe presentare qualche problema. Controlla il visualizzatore eventi per maggiori dettagli. Durante i miei sforzi, ho trovato l'evento 5061 nel registro di sicurezza. Quando falliva, mostrava che OpenKey falliva con 80090016 (il Keyset non esiste). E l'errore è stato dovuto al fatto che SYSTEM non aveva accesso alla chiave privata.

Questo è stato sufficiente per me per creare l'associazione https. Il binding http era un sottoprodotto dell'utilizzo del cmdlet New-WebSite. Se non viene fornito gratuitamente, non ho trovato la creazione del binding della porta 80 con il cmdlet New-WebBinding essere una sfida.


1
Ho apprezzato questa risposta, ma sembra che ci sia un percorso più semplice @ stackoverflow.com/questions/32390097/… .
Peter Majeed,

1
Sono d'accordo che la chiamata AddSslCertificate è più piacevole della sintassi del nuovo elemento e l'ho sostituita. La frustrazione che ho avuto durante l'elaborazione di questo è stata i messaggi di errore che ho ricevuto e il fatto che non sono riuscito a collegarli a una risoluzione utilizzando una ricerca su Google. Quindi, le parole rimanenti sono legate all'agevolazione di tale processo in futuro o per qualcun altro.
Prof. Von Lemongargle,

4

Penso che ciò che cerchi sia il seguente:

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

Fondamentalmente è necessario passare una serie di associazioni. Ulteriori informazioni utili qui - ( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks )

(Modifica: errore di battitura fisso nella sintassi dell'array - virgola estranea)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.