Powershell PSCredential在新的WebServiceProxy中包含德国UMLAUT

Powershell PSCredential在新的WebServiceProxy中包含德国UMLAUT,powershell,encoding,Powershell,Encoding,我尝试使用包含德语umlauts的密码创建PSCredential对象,并将其传递给新WebServiceProxycmdlet。只要密码不包含任何UMLAUT(如以下示例所示),代码就可以正常工作: $secp = ConvertTo-SecureString 'abÜ312!' -AsPlainText -Force $mycreds = New-Object System.Management.Automation.PSCredential('\user@db', $secp) $prox

我尝试使用包含德语umlauts的密码创建
PSCredential
对象,并将其传递给
新WebServiceProxy
cmdlet。只要密码不包含任何UMLAUT(如以下示例所示),代码就可以正常工作:

$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。GFiddler,我看到
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
)并回复小提琴手请求时,我得到了所需的响应

不幸的是,我无法使用此解决方法,因为
新的WebServiceProxy
不允许我自己添加授权标头

有什么想法吗?

链接让我找到了解决方案:

脚本是使用PowerShell ISE编写和保存的。我刚刚意识到ISE正在使用带有BOM编码的UTF-8保存文件。如果我将编码更改为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))

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

让我知道这是否有效

$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

我想这对任何字符都不起作用,但我对编码的了解还不够,不能肯定。

Thät sücks。除了避免使用非ASCII字符的用户名和密码外,将整个系统切换到UTF-8(如5月所述)是可行的,但即使如此,也会产生深远的影响。不敢相信现在是2021年,我们仍然必须处理类似的问题。快速查看源代码,它看起来像是
WebRequest
类的一个实现细节,或者是一个.NET实现细节,所以除了不使用umlauts或自己使用构建代理之外,我没有想到任何解决方案。我同意你@marsze的观点。很难相信我们现在还必须处理这样的问题。@MartinBrandl:希望如此,是的-至少能找到解决办法是否有用。一些背景信息(肯定不是我的专业领域):
新的WebServiceProxy
在PowerShell(核心)中不再可用,但奇怪的是,它仍然是源代码的一部分:。GitHub问题与讨论:耐人寻味。正如我所理解的:这是一个解决方案,它依赖于故意让Windows PowerShell将UTF-8编码的脚本误解为ANSI编码,对吗?@mklement0是的,从我的测试来看,这似乎正是发生的情况。这背后的想法并不全是坏事,我在回答中把它作为方法的基础。