PowerShell 与 base64 编码有关的问题

Sta*_*Guy 2 powershell

我需要将逗号分隔值数组(.csv)转换为一些 JSON,如下所示:

"traits": {
  "file": {
    "content": "R0lGODlhABAQAIAAAAAAAP///yH7BAEAAAAALAAAAAAEAABAAAIBRAA5",
    "file_name": "test.png"
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下内容:

$traits = New-Object PSObject
$file = New-Object PSObject
$file | Add-Member -Type NoteProperty -Name file_name -Value "file.csv"
$file | Add-Member -Type NoteProperty -Name content -Value $([Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes(($domain.GPOs | ConvertTo-Csv))))
$traits | Add-Member -Type NoteProperty -Name group-policies -Value $file
Run Code Online (Sandbox Code Playgroud)

看来“内容”的内容编码不正确。为了排除故障,我将内容复制到www.freeformatter.com/base64-encoder.html,发现它们不匹配。

我缺少什么?

编辑:这是 .csv 的内容。这是我粘贴到https://www.freeformatter.com/base64-encoder.html#ad-output的内容:

#TYPE Selected.System.Xml.XmlElement
"Name","GUID","Linked To","Computer Settings","User Settings"
"Autodiscover - Shared Namespace","249b1923-523a-40b6-9180-cc2727414b9b","@{OU Name=servers; OU Path=domain.local/location/servers; Enabled=true; Enforced=false}","@{Enabled=true; Settings=}","@{Enabled=true; Settings=}"
Run Code Online (Sandbox Code Playgroud)

Powershell 输出如下:

IwBUAFkAUABFACAAUwBlAGwAZQBjAHQAZQBkAC4AUwB5AHMAdABlAG0ALgBYAG0AbAAuAFgAbQBsAEUAbABlAG0AZQBuAHQAIAAiAE4AYQBtAGUAIgAsACIARwBVAEkARAAiACwAIgBMAGkAbgBrAGUAZAAgAFQAbwAiACwAIgBDAG8AbQBwAHUAdABlAHIAIABTAGUAdAB0AGkAbgBnAHMAIgAsACIAVQBzAGUAcgAgAFMAZQB0AHQAaQBuAGcAcwAiACAAIgBBAHUAdABvAGQAaQBzAGMAbwB2AGUAcgAgAC0AIABTAGgAYQByAGUAZAAgAE4AYQBtAGUAcwBwAGEAYwBlACIALAAiADIANAA5AGIAMQA5ADIAMwAtADUAMgAzAGEALQA0ADAAYgA2AC0AOQAxADgAMAAtAGMAYwAyADcAMgA3ADQAMQA0AGIAOQBiACIALAAiAEAAewBPAFUAIABOAGEAbQBlAD0AcwBlAHIAdgBlAHIAcwA7ACAATwBVACAAUABhAHQAaAA9AGQAbwBtAGEAaQBuAC4AbABvAGMAYQBsAC8AbABvAGMAYQB0AGkAbwBuAC8AcwBlAHIAdgBlAHIAcwA7ACAARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAEUAbgBmAG8AcgBjAGUAZAA9AGYAYQBsAHMAZQB9ACIALAAiAEAAewBFAG4AYQBiAGwAZQBkAD0AdAByAHUAZQA7ACAAUwBlAHQAdABpAG4AZwBzAD0AfQAiACwAIgBAAHsARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAFMAZQB0AHQAaQBuAGcAcwA9AH0AIgA=
Run Code Online (Sandbox Code Playgroud)

该网站吐出:

I1RZUEUgU2VsZWN0ZWQuU3lzdGVtLlhtbC5YbWxFbGVtZW50DQoiTmFtZSIsIkdVSUQiLCJMaW5rZWQgVG8iLCJDb21wdXRlciBTZXR0aW5ncyIsIlVzZXIgU2V0dGluZ3MiDQoiQXV0b2Rpc2NvdmVyIC0gU2hhcmVkIE5hbWVzcGFjZSIsIjI0OWIxOTIzLTUyM2EtNDBiNi05MTgwLWNjMjcyNzQxNGI5YiIsIkB7T1UgTmFtZT1zZXJ2ZXJzOyBPVSBQYXRoPWRvbWFpbi5sb2NhbC9sb2NhdGlvbi9zZXJ2ZXJzOyBFbmFibGVkPXRydWU7IEVuZm9yY2VkPWZhbHNlfSIsIkB7RW5hYmxlZD10cnVlOyBTZXR0aW5ncz19IiwiQHtFbmFibGVkPXRydWU7IFNldHRpbmdzPX0i
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

存在三个(潜在的)问题:

  • 字符编码

    • www.freeformatter.com基于输入字符串的UTF-8编码进行 Base64 编码。
    • 您的PowerShell代码使用UTF-16LE(“ Unicode”)编码作为基础;[System.Text.Encoding]::UTF8.GetBytes()如果您需要 UTF-8,请改用。
  • 换行符的样式(行结尾)

    • 在www.freeformatter.com上粘贴的文本中的换行符会悄悄地转换为 Windows 样式的 CRLF 换行符,而您的输入可能具有 Unix 样式的仅 LF 换行符。
  • 换行符丢失

    • 您将 的输出ConvertTo-Csv(一个字符串数组)传递[System.Text.Encoding]::Unicode.GetBytes()给,它需要一个字符串。在PowerShell对数组进行字符串化的过程中,这意味着其元素以空格作为分隔符连接起来,因此原来的换行符被替换为空格,从而导致不同的编码输出。
    • ($domain.GPOs | ConvertTo-Csv)因此,不要使用 ,而是使用($domain.GPOs | ConvertTo-Csv) -join [Environment]::NewLine(它使用适合平台的换行符序列;或者,显式地使用"`n""`r`n";此外,您可能希望附加尾随换行符)。