使用 powershell 向 IIS 站点添加绑定

使用 powershell 向 IIS 站点添加绑定

我正在尝试使用 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变量/使用其他机制来实现我的目标?

答案1

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

例如

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

答案2

我尝试过将 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 绑定并不困难。

答案3

我认为您所追求的是以下内容:

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

基本上你需要传递一个绑定数组。更多有用的信息在这里 - (http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks

(编辑:修复数组语法中的拼写错误——多余的逗号)

相关内容