Поиск…


Вступление

В Powershell, чтобы избежать сохранения пароля в ясном тексте, мы используем разные методы шифрования и сохраняем его как защищенную строку. Если вы не укажете ключ или ключ безопасности, это будет работать только для одного и того же пользователя на одном компьютере, и вы сможете расшифровать зашифрованную строку, если вы не используете Keys / SecureKeys. Любой процесс, который работает под той же учетной записью пользователя, сможет расшифровать эту зашифрованную строку на том же компьютере.

Запрос учетных данных

Чтобы запросить учетные данные, вы должны почти всегда использовать командлет Get-Credential :

$credential = Get-Credential

Предварительно заполненное имя пользователя:

$credential = Get-Credential -UserName 'myUser'

Добавить пользовательское приглашение:

$credential = Get-Credential -Message 'Please enter your company email address and password.'

Доступ к паролю Plaintext

Пароль в объекте учетных данных является зашифрованным [SecureString] . Самый простой способ - получить [NetworkCredential] который не хранит пароль в зашифрованном виде:

$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password

Вспомогательный метод ( .GetNetworkCredential() ) существует только на [PSCredential] .
Чтобы напрямую иметь дело с [SecureString] , используйте методы .NET:

$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)

Работа со хранимыми учетными данными

Чтобы легко хранить и извлекать зашифрованные учетные данные, используйте встроенную 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"

Правильная версия файла для текущего пользователя будет загружена автоматически (или он не будет работать, потому что файл не существует).

Сохранение учетных данных в зашифрованном виде и передача его в качестве параметра, когда требуется

$username = "[email protected]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString 
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.


## Import Password with AES

$username = "[email protected]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd

# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever you want.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow