使用Powershell向IIS站点添加绑定


19

我正在尝试使用Powershell控制IIS应用程序中的绑定。我想使用脚本创建同时具有http和https绑定的网站。

到目前为止,这是我所拥有的:

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

如何为$bindings变量添加绑定/使用其他机制实现目标?

Answers:


24

您可以使用New-WebBinding:http ://technet.microsoft.com/en-us/library/ee790567.aspx

例如

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

虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Mark Henderson

您是否认为我会比Technet文章的底部提供更好的示例?
MatthewP 2013年

15
不,但是也许您应该阅读Technet文章中与之相关的部分,并在此处用引号引起来。我已经编辑了一些足够的东西。
Mark Henderson

这是否需要重新启动IIS才能生效?
克鲁纳尔

10

我经历了尝试向网站添加https绑定的过程,这可能会很痛苦。有很多方法可以完成每个步骤,每个步骤都有陷阱。我留下了最终的解决方案,希望有人会发现它有用。

此解决方案假定您已安装IIS并定义了一个网站。出于本帖子的目的,请致电网站sample.contoso.com。假设您也要使用sample.contoso.com.pfx文件中的证书。

第一步是从文件导入证书。

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

那就足够了。在某些情况下可能是这样。但是,对我而言,这使证书无法正确访问私钥。当我去将证书添加到绑定中时,这导致了powershell错误“指定的登录会话不存在。它可能已经终止”(请参阅​​稍后的步骤)。因此,下一步是修复私钥的ACL。

$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

如果不从包含文件夹继承的私钥,这将允许本地系统完全访问私钥。

如果要获取已安装的证书,则需要它的哈希值,并可以使用Get-Item检索它,如下所示:

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

下一步是创建绑定。

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

重要的是要注意“ https”区分大小写。如果改用“ HTTPS”,则会得到完全不同的绑定结果。

此绑定尚未附加证书,因此最后一步是附加证书。如果证书受到适当信任并且安全性正确,则此步骤应该成功。如果证书有任何问题,可能会很挑剔。

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

如果失败并显示有关登录会话的消息,则证书可能有问题。查看事件查看器以获取更多详细信息。在我的努力中,我在安全日志中找到了事件5061。如果失败,则表明OpenKey失败,出现80090016(密钥集不存在)。失败是因为SYSTEM无法访问私钥。

这足以创建https绑定。http绑定是使用New-WebSite cmdlet的副产品。如果不是免费提供的,我发现使用New-WebBinding cmdlet创建端口80绑定并不是一个挑战。


1
我很欣赏这个答案,但似乎有一条更简单的路线@ stackoverflow.com / questions / 32390097/…
Peter Majeed

1
我同意AddSslCertificate调用比new-item语法更令人愉快,因此我将其替换。解决此问题时,我感到沮丧的是我收到的错误消息以及我无法使用Google搜索将它们与解决方案相关联的事实。因此,其余的字词与将来或为其他人简化该过程有关。
冯·柠檬格尔教授

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.