Je sais que je peux enregistrer le mot de passe dans le fichier:
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File $passwordfile
et le lire depuis le fichier:
$secpasswd = (Get-Content $passwordfile | ConvertTo-SecureString)
puis créez un objet PSCredential:
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
Mais puis-je sauvegarder $ credential dans le fichier, donc le nom d'utilisateur et son mot de passe ont été conservés ensemble
Pour stocker et récupérer facilement les informations d'identification chiffrées, utilisez la sérialisation XML intégrée de PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Pour réimporter:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
Il est important de se rappeler que, par défaut, il utilise l'API de protection des données Windows et que la clé utilisée pour chiffrer le mot de passe est spécifique à l'utilisateur et à la machine sous laquelle le code est exécuté.
Par conséquent, les informations d'identification cryptées ne peuvent pas être importées par un autre utilisateur ni par le même utilisateur sur un autre ordinateur.
En cryptant plusieurs versions de la même information d'identification avec différents utilisateurs en cours d'exécution et sur différents ordinateurs, vous pouvez avoir le même secret disponible pour plusieurs utilisateurs.
En plaçant le nom d'utilisateur et le nom de l'ordinateur dans le nom du fichier, vous pouvez stocker tous les secrets chiffrés de manière à ce que le même code puisse les utiliser sans coder en dur:
# 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"
La version correcte du fichier pour l'utilisateur en cours d'exécution sera chargée automatiquement (ou elle échouera car le fichier n'existe pas).
Construire sur Briantist & Graham: Ceci demandera un identifiant et le stockera lors de la première exécution, puis le réutilisera lors des exécutions suivantes à partir du même code. Dans mon cas, le lecteur H est le répertoire de base de l'utilisateur, utilisé pour la propreté, pas pour la sécurité.
# 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
}
Ce bloc de code peut être inséré dans n'importe quel script qui en a besoin et le problème est plus ou moins résolu à partir de ce moment.
Peut éventuellement aussi vérifier la validité des informations d'identification avant de l'écrire si l'application le permet. Notez que si le mot de passe change, l'utilisateur doit supprimer le fichier.