我尝试创建一个包含德语变音符号的密码的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
在这种情况下,我收到以下错误信息:
当我使用例如Fiddler捕获流量时,我看到New-WebServiceProxy:请求失败,HTTP状态为401:未经授权。
New-WebServiceProxy
cmdlet正在添加凭据作为基本授权,并使用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 将 Umlauts 编码为 ANSI 字符串。 当我手动对凭据进行 base64 编码时(使用
dXNlckBkYjphYsOcMzEyIQ==
而不是 dXNlckBkYjphYtwzMTIh
),并回复 Fiddler 请求,我得到了预期的响应。不幸的是,我无法使用此解决方法,因为
New-WebServiceProxy
不允许我自己添加授权标头。有任何想法吗?
New-WebServiceProxy
在PowerShell(Core)中已不再可用,但奇怪的是它仍然是源代码的一部分:https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs。 GitHub问题及讨论:https://github.com/PowerShell/PowerShell/issues/9838 - mklement0