【发布时间】:2021-04-28 13:03:17
【问题描述】:
我尝试创建一个PSCredential 对象,其密码包含德语变音符号,并将其传递给New-WebServiceProxy cmdlet。只要密码不包含以下示例中的任何变音符号,代码就会按预期工作:
$secp = ConvertTo-SecureString 'abÜ312!' -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential('\user@db', $secp)
$proxy = New-WebServiceProxy -Uri "https://example.com/webservice/myWs?wsdl" -Credential $mycreds
在这种情况下,我收到以下错误消息:
New-WebServiceProxy :请求失败,HTTP 状态为 401:未授权。
当我使用 e 捕获流量时。 G。 Fiddler,我看到 New-WebServiceProxy cmdlet 正在将凭据添加为 Basic Authorization 并使用 base64 编码:
GET https://example.com/webservice/myWs?wsdl HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)
Authorization: Basic dXNlckBkYjphYtwzMTIh
Host: example.com
这是解码后的 Base64 字符串在 Utf8 中的样子:
所以看起来 PowerShell 将元音变音编码为 ANSI 字符串。当我手动对凭据进行 base64 编码(dXNlckBkYjphYsOcMzEyIQ== 而不是 dXNlckBkYjphYtwzMTIh)并回复提琴手请求时,我得到了所需的响应。
很遗憾,我无法使用此解决方法,因为 New-WebServiceProxy 不允许我自己添加授权标头。
有什么想法吗?
【问题讨论】:
-
那太糟糕了。除了避免使用非 ASCII 字符的用户名和密码之外,将整个系统切换到 UTF-8,如this answer 中所述可能有效,但即使这样做也会产生深远的影响。跨度>
-
不敢相信这是 2021 年,我们仍然必须处理这样的问题。从快速查看源代码来看,它似乎是
WebRequest类的实现细节,或者任何一种 .NET 实现细节,所以除了不使用变音符号或自己构建代理之外,我没有想到任何解决方案使用other tools。 -
我同意你的看法@marsze。很难相信我们现在还要处理这些问题。
-
@MartinBrandl:希望是的 - 至少找出解决方法是否有帮助会很好。一些背景信息(绝对不是我的专业领域):
New-WebServiceProxy在 PowerShell(核心)中不再可用,但奇怪的是,它仍然是源代码的一部分:github.com/PowerShell/PowerShell/blob/master/src/…。带有讨论的 GitHub 问题:github.com/PowerShell/PowerShell/issues/9838
标签: powershell encoding