Agregue un enlace a un sitio IIS usando powershell

19

Estoy tratando de controlar los enlaces en una aplicación IIS usando powershell. Me gustaría crear un sitio con enlaces http y https usando un script.

Esto es lo que tengo hasta ahora:

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

¿Cómo agrego enlaces a mi $bindingsvariable / uso algún otro mecanismo para lograr mi objetivo?

Khanzor
fuente

Respuestas:

24

Puede usar New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

p.ej

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
fuente
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Mark Henderson
¿Crees que encontraré un mejor ejemplo que al final del artículo de Technet?
MatthewP
15
No, pero quizás deberías tomar la parte del artículo de Technet que sea relevante y reproducirlo aquí en un bloque de citas. He editado algo que debería ser suficiente.
Mark Henderson
¿Esto requiere reiniciar IIS para que surta efecto?
Krunal
10

Pasé por el proceso de intentar agregar un enlace https a un sitio y puede ser bastante doloroso. Hay muchas maneras de lograr cada paso y cada una tiene dificultades. Estoy dejando atrás la solución final con la esperanza de que alguien la encuentre útil.

Esta solución supone que tiene IIS instalado y un sitio web definido. Llame al sitio sample.contoso.com para los fines de esta publicación. Suponga que tiene un certificado en un archivo sample.contoso.com.pfx que también desea usar.

El primer paso es importar el certificado del archivo.

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

Sería bueno si eso fuera suficiente. Y en algunos casos puede ser. Sin embargo, para mí, esto dejó el certificado sin el acceso adecuado a la clave privada. Esto provocó un error de PowerShell "No existe una sesión de inicio de sesión especificada. Es posible que ya haya finalizado" cuando agregué el certificado al enlace (consulte ese paso más adelante). Entonces, el siguiente paso es arreglar la ACL para la clave privada.

$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

Esto permitirá que el sistema local tenga acceso completo a la clave privada si no se hereda de la carpeta que lo contiene.

Si desea obtener un certificado que ya está instalado, necesita el hash y puede recuperarlo con Get-Item de la siguiente manera:

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

El siguiente paso es crear el enlace.

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

Es importante tener en cuenta que "https" distingue entre mayúsculas y minúsculas. Si utiliza "HTTPS" en su lugar, obtendrá un resultado de enlace realmente diferente.

Este enlace aún no tiene un certificado adjunto, por lo que el último paso es adjuntar el certificado. Si el certificado es de confianza y la seguridad es correcta, este paso debe ser exitoso. Sin embargo, puede ser complicado si hay algún problema con el certificado.

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

Si esto falla con un mensaje sobre una sesión de inicio de sesión no existe, entonces el certificado puede tener algún problema. Revise el visor de eventos para más detalles. Durante mis esfuerzos, encontré el evento 5061 en el registro de seguridad. Cuando falló, mostró que OpenKey falló con 80090016 (El conjunto de claves no existe). Y el fallo se debió a que SYSTEM no tenía acceso a la clave privada.

Eso fue suficiente para crear el enlace https. El enlace http fue un subproducto del uso del cmdlet New-WebSite. Si no es gratis, no creo que crear el enlace del puerto 80 con el cmdlet New-WebBinding sea un desafío.

Prof Von Lemongargle
fuente
1
Aprecié esta respuesta, pero parece que hay una ruta más fácil @ stackoverflow.com/questions/32390097/… .
Peter Majeed
1
Estoy de acuerdo en que la llamada AddSslCertificate es más agradable que la sintaxis del nuevo elemento y la reemplacé. La frustración que tuve al trabajar en esto fue los mensajes de error que recibí y el hecho de que no podía relacionarlos con una resolución usando una búsqueda en Google. Por lo tanto, las palabras restantes están relacionadas con facilitar ese proceso en el futuro o para otra persona.
Prof. Von Lemongargle