Пароль от SecureString приводит к зависанию скрипта

$password = Get-Content 'c:\temp\tmp1\pw.dat' | ConvertTo-SecureString 
& "C:\Program Files\PuTTY\pscp.exe" -P 2222 -pw $password 'c:\temp\tmp1\test.txt' 'root@localhost:/home/root/temp'

Приведенный выше код просто завис; Однако приведенный ниже код работал.

$password='mypw'
& "C:\Program Files\PuTTY\pscp.exe" -P 2222 -pw $password 'c:\temp\tmp1\test.txt' 'root@localhost:/home/root/temp'

Любое предложение? Я не думаю, что ввел пароль неправильно, так как делал это несколько раз. Кроме того, я ожидаю сообщения об ошибке, если пароль был введен неправильно. Кстати, задача скрипта - передать файл на линуксовую коробку.


person Seaport    schedule 09.05.2019    source источник
comment
Что, по вашему мнению, должно произойти, когда вы передаете SecureString в качестве параметра командной строки исполняемому файлу? То есть будет заменено текстовым содержимым SecureString? (подсказка: это не так)   -  person user4003407    schedule 09.05.2019
comment
@PetSerAl, я понимаю твою точку зрения. Мое намерение состоит в том, чтобы защитить пароль корня Linux. Может быть, SecureString не подходит для использования? Я признал, что до сих пор все примеры кода, которые я нашел на SecureString, касались его использования для создания объекта учетных данных. Если я на неправильном пути, есть ли другой способ защитить пароль?   -  person Seaport    schedule 09.05.2019
comment
пароль в виде простого текста в pw.dat? Кроме того, вы будете единственным человеком, запускающим этот скрипт от одного и того же пользователя?   -  person ArcSet    schedule 09.05.2019
comment
@ПетСерАл. Все ваши вопросы прямо в точку. Файл pw.dat создается из кода read-host -AsSecureString | ConvertFrom-SecureString | вне файла. Мой вход в Windows будет запускать скрипт все время, либо вручную, либо через запланированное задание.   -  person Seaport    schedule 09.05.2019
comment
ОК, тогда у меня есть решение для вас. Дайте мне секунду, чтобы написать это.   -  person ArcSet    schedule 09.05.2019


Ответы (1)


Как указано в комментарии, файл .dat создается с использованием

read-host -AsSecureString | ConvertFrom-SecureString | out-file

Итак, я знаю 2 способа сделать это.

$EncryptedString = read-host -AsSecureString | ConvertFrom-SecureString

$SecureString = $EncryptedString | ConvertTo-SecureString

$Pointer = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)

$PlainTextPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Pointer)

$PlainTextPassword

Секрет здесь - [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString), который превращает строку в байты и возвращает указатель на то, где она находится.

Следующая часть [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Pointer) переходит к указателю и превращает байты в строку.

Другим способом было бы превратить безопасную строку в PSCredential.

$EncryptedString = read-host -AsSecureString | ConvertFrom-SecureString

$SecureString = $EncryptedString | ConvertTo-SecureString

$PlainTextPassword = ([PsCredential]::new("DoesntMatter",$SecureString)).GetNetworkCredential().Password

$PlainTextPassword

Это превращает Secure String в PSCredential, где вы можете получить пароль NetworkCredential в виде простого текста.

person ArcSet    schedule 09.05.2019