【问题标题】:PSCredential containing German umlauts in New-WebServiceProxy在 New-WebServiceProxy 中包含德语变音符号的 PSCredential
【发布时间】: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


【解决方案1】:

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

让我知道这是否有效。

$pw = 'abÜ312!'
# incorrectly encode the UTF8-bytes as ANSI (this yields abÜ312!)
$dummy = [Text.Encoding]::Default.GetString([Text.Encoding]::UTF8.GetBytes($pw))
$secp = ConvertTo-SecureString $dummy -AsPlainText -Force

我认为这不适用于任何字符,但我对编码的了解还不够,无法确定。

【讨论】:

    【解决方案2】:

    链接的answer from mklement0 引导我找到解决方案:

    脚本是使用 PowerShell ISE 编写和保存的。我刚刚意识到 ISE 正在使用 UTF-8 和 BOM 编码保存文件。如果我将编码更改为 UTF-8 一切正常。

    这是一个将文件编码更改为 UTF-8 的简短脚本:

    $scriptPath = "c:/path/to/script.ps1"
    $content = Get-Content -Raw $scriptPath
    [System.IO.File]::WriteAllLines($scriptPath, $content, (New-Object System.Text.UTF8Encoding))
    

    【讨论】:

    • 有趣。我只是这样理解:这是一个解决方法,它依赖于故意让 Windows PowerShellmisinterpret 您的 UTF-8 编码脚本为 ANSI 编码,对吗?
    • @mklement0 是的,从我的测试看来,这正是发生的情况。这背后的想法并不全是坏事,我用它作为我回答方法的基础。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2016-07-14
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多