Проблема PowerShell с кодировкой base64 - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно превратить массив значений, разделенных запятыми (.csv), в бит JSON, который выглядит следующим образом:

"traits": {
  "file": {
    "content": "R0lGODlhABAQAIAAAAAAAP///yH7BAEAAAAALAAAAAAEAABAAAIBRAA5",
    "file_name": "test.png"
  }
}

Я использую следующее:

$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

Похоже, что содержимое "контента" неправильно закодировано.Чтобы устранить неполадки, я скопировал содержимое на 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=}"

Powershell выводит это:

IwBUAFkAUABFACAAUwBlAGwAZQBjAHQAZQBkAC4AUwB5AHMAdABlAG0ALgBYAG0AbAAuAFgAbQBsAEUAbABlAG0AZQBuAHQAIAAiAE4AYQBtAGUAIgAsACIARwBVAEkARAAiACwAIgBMAGkAbgBrAGUAZAAgAFQAbwAiACwAIgBDAG8AbQBwAHUAdABlAHIAIABTAGUAdAB0AGkAbgBnAHMAIgAsACIAVQBzAGUAcgAgAFMAZQB0AHQAaQBuAGcAcwAiACAAIgBBAHUAdABvAGQAaQBzAGMAbwB2AGUAcgAgAC0AIABTAGgAYQByAGUAZAAgAE4AYQBtAGUAcwBwAGEAYwBlACIALAAiADIANAA5AGIAMQA5ADIAMwAtADUAMgAzAGEALQA0ADAAYgA2AC0AOQAxADgAMAAtAGMAYwAyADcAMgA3ADQAMQA0AGIAOQBiACIALAAiAEAAewBPAFUAIABOAGEAbQBlAD0AcwBlAHIAdgBlAHIAcwA7ACAATwBVACAAUABhAHQAaAA9AGQAbwBtAGEAaQBuAC4AbABvAGMAYQBsAC8AbABvAGMAYQB0AGkAbwBuAC8AcwBlAHIAdgBlAHIAcwA7ACAARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAEUAbgBmAG8AcgBjAGUAZAA9AGYAYQBsAHMAZQB9ACIALAAiAEAAewBFAG4AYQBiAGwAZQBkAD0AdAByAHUAZQA7ACAAUwBlAHQAdABpAG4AZwBzAD0AfQAiACwAIgBAAHsARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAFMAZQB0AHQAaQBuAGcAcwA9AH0AIgA=

Сайт выплевывает:

I1RZUEUgU2VsZWN0ZWQuU3lzdGVtLlhtbC5YbWxFbGVtZW50DQoiTmFtZSIsIkdVSUQiLCJMaW5rZWQgVG8iLCJDb21wdXRlciBTZXR0aW5ncyIsIlVzZXIgU2V0dGluZ3MiDQoiQXV0b2Rpc2NvdmVyIC0gU2hhcmVkIE5hbWVzcGFjZSIsIjI0OWIxOTIzLTUyM2EtNDBiNi05MTgwLWNjMjcyNzQxNGI5YiIsIkB7T1UgTmFtZT1zZXJ2ZXJzOyBPVSBQYXRoPWRvbWFpbi5sb2NhbC9sb2NhdGlvbi9zZXJ2ZXJzOyBFbmFibGVkPXRydWU7IEVuZm9yY2VkPWZhbHNlfSIsIkB7RW5hYmxlZD10cnVlOyBTZXR0aW5ncz19IiwiQHtFbmFibGVkPXRydWU7IFNldHRpbmdzPX0i

1 Ответ

0 голосов
/ 05 декабря 2018

Существует три (потенциальные) проблемы:

  • Кодировка символов :

    • www.freeformatter.com основывает кодировку Base64 на кодировке UTF-8 входной строки.
    • Ваш код PowerShell использует кодировку UTF-16LE ("Unicode") в качестве основы;вместо этого используйте [System.Text.Encoding]::UTF8.GetBytes(), если хотите UTF-8.
  • Стиль новых строк (окончания строк)

    • Новые строки в тексте, вставленные на www.freeformatter.com , тихо преобразуются в новые строки CRLF в стиле Windows, тогда как ваш ввод может иметь новые строки только для LF в Unix-стиле.*
    • Новые строки теряются :

      • Вы передаете вывод из ConvertTo-Csv, который является массивом строк в [System.Text.Encoding]::Unicode.GetBytes(), что предполагает одну строку.В процессе PowerShell преобразует в массив массив, что означает, что его элементы объединяются с пробелом в качестве разделителя, поэтому исходные символы новой строки заменяются пробелами, что приводит к различным кодированным выводам.1052 *
      • Поэтому вместо ($domain.GPOs | ConvertTo-Csv) используйте ($domain.GPOs | ConvertTo-Csv) -join [Environment]::NewLine (в котором используется соответствующая платформе последовательность новой строки; в качестве альтернативы используйте "`n" или "`r`n" явно; также вы можете добавить трейлинг перевод строки).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...