Техника, которую вы показываете: , а не о создании команды больше безопасный - наоборот :
Вам необходимо проделать дополнительную работу, чтобы восстановить простой текстовый пароль из экземпляра [securestring]
, поскольку , чтобы передать пароль внешней внешней программе , например psftp.exe
вам нужно небезопасное текстовое представление , поскольку внешние программы ничего не знают о безопасных строках .NET .
Насколько безопасенSecureString? рассказывает вам о безопасных строках .NET и их ограничениях в целом.
В качестве отступления: команда для извлечения пароля в виде простого текста может быть немного упрощена с помощью aux.[pscredential]
экземпляр:
# Returns the plain-text content of secure string $secVal:
(New-Object pscredential somelogin, $secVal).GetNetworkCredential().Password
единственный безопасный подход заключается в во избежание использования простых текстовых паролей в целом и использование PKI вместо (на основе открытых и закрытых ключей) вместо этого, если поддерживается целевой программой.
К демонстрируют , что в виде простого текстаподход небезопасный (даже без использования промежуточной переменной для хранения незашифрованного пароля):
# Create a [pscredential] instance with a secure-string password:
# Note: To make this demo self-contained, I'm converting *from* plain
# text in order to construct the credential object.
# Note that you should never do that in production code.
# The need to specify -Force to do it is a reminder that it
# normally shouldn't be done.
$cred = New-Object pscredential someuser,
(ConvertTo-SecureString -AsPlainText -Force 'actualPassword')
# Open a new hidden window that passes the password *as plain text* to
# `cmd /c echo` (and then waits for a keypress, to keep the process alive).
$ps = Start-Process -PassThru -WindowStyle Hidden cmd "/c echo $($cred.GetNetworkCredential().Password) & pause"
# Now inspect the process' command line using CIM (WMI):
(Get-CimInstance Win32_Process -Filter "ProcessID = $($ps.ID)").CommandLine
# Kill (stop) the sample process.
$ps | Stop-Process
Выше приведено "C:\WINDOWS\system32\cmd.exe" /c echo actualPassword & pause
, демонстрирующее, что обычный текстпароль действительно может быть получен другими процессами.
Вы также можете использовать методы GUI для проверки работающего процесса 'командная строка : диспетчер задач (Taskmgr.exe
) илибез потенциального усечения SysInternals 'Process Explorer (procexp.exe
) , который, однако, должен быть установлен по требованию - см. этот ответ ServerFault .