No he tenido éxito en obtener el siguiente fragmento de código para generar "¡Hola mundo!" en PS7
$string = $("Hello World!" | ConvertTo-SecureString -AsPlainText -Force)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($string))
El código anterior es un ejemplo de cómo descifrar una cadena segura sin especificar una longitud.
Este mismo código funciona en PS6 y PS5 para descifrar completamente Secure String, pero no funciona en PS7. La única forma de evitar esto que he encontrado es usar PtrToStringBSTR. Entonces funciona como se esperaba en todas las versiones de PS para este caso de uso.
Planteé un problema en el repositorio de Powershell en Github, pero no he recibido ninguna respuesta. Honestamente, solo estoy buscando alguna confirmación de que el comportamiento es el mismo para los demás.
https://github.com/PowerShell/PowerShell/issues/11953
Creo que algo como esto sería un cambio radical para una gran cantidad de código que se está portando a PS7.
Esto es lo que he encontrado hasta ahora:
Documentación
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.ptrtostringauto?view=netframework-4.8
Según la documentación, al especificar un número entero, PtrToStringAuto:
Allocates a managed String and copies the specified number of characters from a string stored in unmanaged memory into it.
Especificar un int de 11 devuelve "Hola", esto se debe a que todos los demás caracteres devueltos son nulos. En este caso, debe especificar un int de 23 para devolver la cadena completa "¡Hola mundo!" usando este método. He almacenado la salida en una variable para demostrar esto.
$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....
Si no se especifica ningún entero, PtrToStringAuto:
Allocates a managed String and copies all characters up to the first null character from a string stored in unmanaged memory into it.
Creo que esto sugiere que Secure String se está almacenando con valores NULL, mientras que en PS6 no lo estaba, o que el comportamiento de la función PtrToStringAuto ha cambiado y ahora se adhiere al comportamiento que describe la documentación anteriormente.
Este es solo un problema en macOS; sin embargo, el uso de PtrToStringBSTR en lugar de PtrToStringAuto para descifrar Secure String funciona como se esperaba en Windows y macOS.
Esto parece relacionado: https://stackoverflow.com/a/11022662/4257163
Tampoco veo en ninguna parte que se haya realizado un cambio.