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?

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

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.


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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.