【发布时间】:2013-01-20 13:14:58
【问题描述】:
这里有点奇怪的问题。我们使用的脚本是:
$username = "itrpo"
$url = "https://homepages.domain.com/cgi-bin/checkperms.cgi?user=$username"
$homepagesUser = "REMOVED"
$homepagesPass = "REMOVED"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = new-object System.Net.NetworkCredential($homepagesUser, $homepagesPass)
$result = $webclient.DownloadString($url)
从我的桌面(Windows 8,使用 .NET v4.0.30319 的 PowerShell v3)运行它时,它可以工作。 从服务器(Windows Server 2008 R2、PowerShell v2 使用 .NET v2.0.50727)运行它时,它不会。最终它挂起并返回错误:使用“1”参数调用“DownloadString”的异常:“操作已超时”
使用 NetMon,我设法确定在服务器上它未能执行任何 TLS 客户端密钥交换。
homepages.domain.com 的 SSL 证书实际上是一个 SAN 证书,homepages 是实际服务器名称的别名(我们称之为 servera.domain.com)。当我在脚本中更改 $url 以使用实际的服务器名称时:
$url = "https://servera.domain.com/cgi-bin/checkperms.cgi?user=$username"
...它起作用了,但这并不理想(如果将服务移动到另一台机器,脚本将中断)。
似乎 PowerShell v2 (.NET v2) 的 SAN 证书有问题?支持这一点的进一步证据是,我们将上述样式脚本用于另一个具有标准 SSL 证书的服务器,它可以正常通信。
可能是因为使用的 WebClient 类不同吗?这是 .NET v2 下的文档: http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.80%29.aspx 以及 .NET v4 下的文档: http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.100%29.aspx
我对编程知之甚少,无法正确解释上述文档(或知道我是否走在正确的轨道上)。
理想情况下,我们希望该脚本在 PowerShell v2 和 .NET v2 下运行,而无需升级或强制 PowerShell 使用 .NET v4。如果我的怀疑是正确的,是否有参数我们可以指定/修改脚本以“修复”此问题的方法?
非常感谢您的建议。
【问题讨论】:
-
任何带有完整源代码示例的最终解决方案?
-
遗憾的是没有。我无法使以下建议起作用。我们正在将脚本迁移到 Server 2012 和 PowerShell v3。
-
任何使用 PS v3 的示例?
标签: .net powershell webclient powershell-2.0 powershell-3.0