New-WebServiceProxy 中包含德语变音符号的 PSCredential
PSCredential containing German umlauts in New-WebServiceProxy
我尝试使用包含 german umlauts 的密码创建 PSCredential
object 并将其传递给 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 : The request failed with HTTP status 401: Unauthorized.
当我使用 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
)并回复 fiddler 请求时,我得到了所需的响应。
不幸的是,我无法使用此解决方法,因为 New-WebServiceProxy
不允许我自己添加授权 header。
有什么想法吗?
链接的 引导我找到了解决方案:
脚本是使用 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
我认为这对任何字符都不起作用,但我对编码的了解还不够多,无法确定。
我尝试使用包含 german umlauts 的密码创建 PSCredential
object 并将其传递给 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 : The request failed with HTTP status 401: Unauthorized.
当我使用 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
)并回复 fiddler 请求时,我得到了所需的响应。
不幸的是,我无法使用此解决方法,因为 New-WebServiceProxy
不允许我自己添加授权 header。
有什么想法吗?
链接的
脚本是使用 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
我认为这对任何字符都不起作用,但我对编码的了解还不够多,无法确定。