Сохранить PSCredential в файле
Я знаю, что могу сохранить пароль в файл:
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File $passwordfile
и прочитайте это из файла:
$secpasswd = (Get-Content $passwordfile | ConvertTo-SecureString)
и затем создайте объект PSCredential:
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
Но могу ли я сохранить $credential в файле, чтобы имя пользователя и его пароль хранились вместе?
3 ответа
Чтобы легко хранить и получать зашифрованные учетные данные, используйте встроенную сериализацию XML PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Для повторного импорта:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
Важно помнить, что по умолчанию используется API защиты данных Windows, а ключ, используемый для шифрования пароля, специфичен как для пользователя, так и для компьютера, на котором выполняется код.
В результате зашифрованные учетные данные не могут быть импортированы другим пользователем или одним и тем же пользователем на другом компьютере.
Зашифровав несколько версий одного и того же удостоверения для разных работающих пользователей и на разных компьютерах, вы можете получить один и тот же секрет для нескольких пользователей.
Введя имя пользователя и имя компьютера в имя файла, вы можете хранить все зашифрованные секреты таким образом, чтобы один и тот же код мог использовать их без какого-либо жесткого кодирования:
Encrypter
# run as each user, and on each computer
$credential = Get-Credential
$credential | Export-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
Код, который использует сохраненные учетные данные:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
Правильная версия файла для работающего пользователя будет загружена автоматически (или не удастся, потому что файл не существует).
Опираясь на Briantist & Graham: это запросит учетные данные и сохранит их при первом запуске, а затем повторно использует при последующих запусках из того же кода. В моем случае диск H - это домашний каталог пользователя, используемый для аккуратности, а не безопасности.
# the path to stored credential
$credPath = "H:\Secrets\Cred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
# check for stored credential
if ( Test-Path $credPath ) {
#crendetial is stored, load it
$cred = Import-CliXml -Path $credPath
} else {
# no stored credential: create store, get credential and save it
$parent = split-path $credpath -parent
if ( -not test-Path $parent) {
New-Item -ItemType Directory -Force -Path $parent
}
$cred = get-credential
$cred | Export-CliXml -Path $credPath
}
Этот блок кода можно разбить на любой скрипт, который в этом нуждается, и с тех пор проблема более или менее решается.
Возможно, также может проверить успешные учетные данные перед записью, если приложение разрешает это. Обратите внимание, что при изменении пароля пользователь должен удалить файл.
Команда Export-Clixml, безусловно, подойдет, но для пользователей, не использующих Windows, имейте в виду следующее, что содержится на соответствующей странице на сайте Learn.microsoft.com: Важно: Export-Clixml экспортирует только зашифрованные учетные данные в Windows . В операционных системах, отличных от Windows, таких как macOS и Linux, учетные данные экспортируются в виде обычного текста, хранящегося в виде массива символов Юникода. Это обеспечивает некоторую запутанность, но не обеспечивает шифрование.
Вот страница Export-Clixml, на которой есть отличная справка; в примере 3 конкретно рассматривается его использование для этой цели, с примечанием, которое я вставил выше: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-clixml?view=powershell-7.3