在 New-WebServiceProxy 中包含德语变音的 PSCredential

Mar*_*ndl 5 powershell encoding

我尝试PSCredential使用包含德语变音符号的密码创建一个对象,并将其传递给New-WebServiceProxycmdlet。只要密码不包含以下示例中的任何变音符号,代码就会按预期工作:

$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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我收到以下错误消息:

New-WebServiceProxy :请求失败,HTTP 状态为 401:未经授权。

当我使用例如 Fiddler 捕获流量时,我看到New-WebServiceProxycmdlet 将凭据添加为具有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
Run Code Online (Sandbox Code Playgroud)

这是解码后的 Base64 字符串在 Utf8 中的样子:

UTF8 中的字符串

所以看起来 PowerShell 正在将元音符号编码为ANSI字符串。当我手动对凭据(dXNlckBkYjphYsOcMzEyIQ==而不是dXNlckBkYjphYtwzMTIh)进行 base64 编码并回复提琴手请求时,我得到了所需的响应。

不幸的是,我无法使用此解决方法,因为New-WebServiceProxy它不允许我自己添加 Authorization 标头。

有任何想法吗?

mar*_*sze 2

有趣的。您的解决方法使我找到了这个更通用的解决方法,它不依赖于保存错误编码的脚本文件。相反,它仅错误地对密码字符串进行编码

\n

让我知道这个是否奏效。

\n
$pw = 'ab\xc3\x9c312!'\n# incorrectly encode the UTF8-bytes as ANSI (this yields ab\xc3\x83\xc5\x93312!)\n$dummy = [Text.Encoding]::Default.GetString([Text.Encoding]::UTF8.GetBytes($pw))\n$secp = ConvertTo-SecureString $dummy -AsPlainText -Force\n
Run Code Online (Sandbox Code Playgroud)\n

我认为这对任何字符都不起作用,但我对编码的了解还不够确定。

\n