Adicionar uma ligação a um site IIS usando o PowerShell

19

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

Isto é o que 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 $bindingsvariável / uso algum outro mecanismo para alcançar meu objetivo?

Khanzor
fonte

Respostas:

24

Você pode usar o New-WebBinding: http://technet.microsoft.com/en-us/library/ee790567.aspx

por exemplo

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite
MatthewP
fonte
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Mark Henderson
Você acha que vou apresentar um exemplo melhor do que na parte inferior do artigo da technet?
MatthewP
15
Não, mas talvez você deva participar do artigo relevante e reproduzi-lo aqui em um bloco de cotações. Eu editei algo que deveria ser suficiente.
Mark Henderson
Isso requer a reinicialização do IIS para entrar em vigor?
Krunal 11/07
10

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

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

A primeira etapa é 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 no PowerShell "Não existe uma sessão de logon especificada. Ela já pode ter sido encerrada" quando adicionei o certificado à ligação (consulte essa etapa posteriormente). Portanto, a próxima etapa é corrigir a ACL da 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ê deseja obter um certificado que já está instalado, é necessário o hash e pode recuperá-lo com Get-Item da seguinte forma:

$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 observar que "https" diferencia maiúsculas de minúsculas. Se você usar "HTTPS", obterá um resultado de ligação realmente diferente.

Essa ligação ainda não possui um certificado anexado; portanto, a última etapa é anexar o certificado. Se o certificado for adequadamente confiável e a segurança estiver correta, esta etapa 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 existir, o certificado poderá ter algum problema. Revise o visualizador de eventos para obter 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 teve acesso à chave privada.

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

Prof Von Lemongargle
fonte
11
Apreciei esta resposta, mas parece haver uma rota mais fácil @ stackoverflow.com/questions/32390097/… .
precisa
11
Concordo que a chamada AddSslCertificate é mais agradável do que a sintaxe do novo item e a substituí. A frustração que tive ao solucionar isso foram as mensagens de erro que recebi e o fato de não poder relacioná-las a uma resolução usando uma pesquisa no google. Portanto, as palavras restantes estão relacionadas a facilitar esse processo no futuro ou para outra pessoa.
Prof Von Lemongargle 15/03/19
4

Eu acho que o que você procura é o seguinte:

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

Basicamente, você precisa passar uma matriz de ligações. Informações mais úteis aqui - ( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks )

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

Taras Alenin
fonte