Adicione uma ligação a um site do IIS usando powershell

17

Estou tentando controlar as ligações em um aplicativo do IIS usando o powershell. Gostaria de criar um site com uma ligação http e https usando um script.

Isso é o que eu tenho até agora:

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

Como adiciono ligações à minha variável $bindings / use algum outro mecanismo para atingir meu objetivo?

    
por Khanzor 09.12.2013 / 00:54

3 respostas

22

Você pode usar o recurso New-WebBinding: link

por exemplo,

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
    
por 19.12.2013 / 01:33
7

Eu passei pelo processo de tentar adicionar uma ligação https a um site e isso pode ser muito doloroso. Há muitas maneiras de realizar cada etapa e cada uma delas tem armadilhas. Estou deixando para trás a solução final, esperando que alguém ache útil.

Esta solução pressupõe que você tenha o IIS instalado e um site definido. Chame o site sample.contoso.com para os fins desta postagem. Suponha que você tenha um certificado em um arquivo sample.contoso.com.pfx que deseja usar também.

O primeiro passo é importar o certificado do arquivo.

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

Seria bom se isso fosse suficiente. E em alguns casos pode ser. No entanto, para mim, isso deixou o certificado sem acesso adequado à chave privada. Isso causou um erro PowerShell "Uma sessão de logon especificado não existe. Ele já pode ter sido finalizado" quando fui adicionar o certificado à ligação (consulte essa etapa mais tarde). Então, o próximo passo é consertar a ACL para a chave 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

Isso permitirá que o sistema local tenha acesso total à chave privada, se isso não for herdado da pasta que o contém.

Se você quiser obter um certificado já instalado, precisará do hash dele e recuperá-lo com Get-Item assim:

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

O próximo passo é criar a ligação.

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

É importante notar que "https" é sensível a maiúsculas e minúsculas. Se você usar "HTTPS", receberá um resultado de ligação realmente diferente.

Essa ligação ainda não tem um certificado anexado a ela, portanto, a última etapa é anexar o certificado. Se o certificado for confiável e a segurança estiver correta, essa etapa deverá ser bem-sucedida. Pode ser complicado se houver algum problema com o certificado.

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

Se isso falhar com uma mensagem sobre uma sessão de logon não existe, o certificado pode ter algum problema. Revise o visualizador de eventos para mais detalhes. Durante meus esforços, encontrei o evento 5061 no log de segurança. Quando falhou, mostrou que o OpenKey falhou com 80090016 (o conjunto de chaves não existe). E a falha ocorreu porque o SYSTEM não tinha acesso à chave privada.

Isso foi suficiente para eu criar a ligação https. A ligação http foi um subproduto do uso do cmdlet New-WebSite. Se ele não vier de graça, não acho que criar a ligação da porta 80 com o cmdlet New-WebBinding seja um desafio.

    
por 17.02.2016 / 19:12
4

Acho que o que você está procurando é o seguinte:

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

Basicamente você precisa passar uma matriz de ligações. Mais informações úteis aqui - ( link )

(Editar: erro de digitação fixo na sintaxe da matriz - vírgula estranha)

    
por 25.07.2015 / 04:58

Tags