Мне не удалось получить следующий фрагмент кода для вывода «Hello World!» в PS7
$("Hello World!" | ConvertTo-SecureString -AsPlainText -Force)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($string))
Приведенный выше код является примером расшифровки защищенной строки без указания длины.
Этот же код работает в PS6 и PS5 для полной расшифровки защищенной строки, но делает не работает в PS7. Единственный способ обойти это - использовать PtrToStringBSTR. Затем он работает, как и ожидалось, во всех версиях PS для этого варианта использования.
Я поднял проблему в репозитории Powershell на Github, но не получил никаких ответов. Я, честно говоря, просто ищу подтверждение того, что поведение у всех одинаковое.
https://github.com/PowerShell/PowerShell/issues/11953
Я бы подумал, что подобное будет серьезным изменением для большого количества кода, портируемого на PS7.
Вот что я нашел до сих пор:
Документация
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.ptrtostringauto?view=netframework-4.8
Согласно документации, при указании целого числа, PtrToStringAuto:
Allocates a managed String and copies the specified number of characters from a string stored in unmanaged memory into it.
Указание целого числа из 11 Возвращает «Hello», это потому, что каждый другой символ возвращается Null. В этом случае вы должны указать значение int, равное 23, чтобы вернуть полную строку «Hello World!» используя этот метод. Я сохранил вывод в переменной, чтобы продемонстрировать это.
$String = $("Hello World!" | ConvertTo-SecureString -AsPlainText -Force)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($string), 23)
$String[0] Returns H
$String[1] Returns NULL
$String[2] Returns E
$String[3] Returns NULL
etc....
Если целое число не указано, PtrToStringAuto:
Allocates a managed String and copies all characters up to the first null character from a string stored in unmanaged memory into it.
Я полагаю, что это предполагает, что либо Secure String хранится со значениями NULL, тогда как в PS6 это не было, или что поведение функции PtrToStringAuto изменилось, и теперь придерживается поведения, описанного в документации выше.
Это только проблема на macOS; однако использование PtrToStringBSTR вместо PtrToStringAuto для дешифрования Secure String работает, как и ожидалось, для windows и macOS.
Это, похоже, связано: { ссылка }
Я также нигде не вижу, чтобы было внесено изменение.