我正在尝试使用 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)
(编辑:修复数组语法中的拼写错误——多余的逗号)