私はファイルにパスワードを保存できることを知っています:
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を保存して、ユーザー名とパスワードを一緒に保存できますか?
暗号化された資格情報を簡単に保存および取得するには、PowerShellの組み込みXMLシリアル化(Clixml)を使用します。
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
再インポートするには:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
覚えておくべき重要なことは、デフォルトでこれはWindowsデータ保護APIを使用し、パスワードの暗号化に使用されるキーは、コードが実行されているユーザーとマシンの両方に固有であることです。
その結果、暗号化された資格情報は、別のユーザーや別のコンピューターの同じユーザーがインポートすることはできません。
異なる実行中のユーザーおよび異なるコンピューター上で同じ資格情報の複数のバージョンを暗号化することにより、複数のユーザーが同じシークレットを使用できるようになります。
ユーザー名とコンピューター名をファイル名に含めることにより、暗号化されたすべての秘密を、同じコードでハードコーディングせずに使用できるように保存できます。
# 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
}
このコードブロックは、それを必要とする任意のスクリプトに組み込むことができ、それ以降、問題は多かれ少なかれ解決されます。
アプリケーションで許可されている場合、書き込む前に成功した資格情報を確認することもできます。パスワードが変更された場合、ユーザーはファイルを削除する必要があることに注意してください。