====== Credential et mot de passe chiffré dans un fichier ====== [[http://stackoverflow.com/questions/6239647/using-powershell-credentials-without-being-prompted-for-a-password|http://stackoverflow.com/questions/6239647/using-powershell-credentials-without-being-prompted-for-a-password]] Quand on veut automatiser une tâche nécessitant la saisie d'une authentification on se retrouve confronté au problème du mot de passe. Généralement on utilise un script pour l'automatisation et souvent sans intervention de l'utilisateur donc pas de saisie au clavier. On doit donc fournir le mot de passe aux commandes. A moins d'utiliser des programmes tiers, les scripts batch ne permet pas de mettre en variable un mot de passe ciffré. Il faudra passer par du Powershell et utiliser PSCredential. Voici UNE manière de faire. (Il existe d'autre méhode) Il faudra d'abord chiffrer le mot de passe et l'enregistrer dans un fichier, ensuite utiliser ce mot de passe chiffré (jamais visible) dans le script. ===== Comment chiffrer le mot de passe. ===== J'utilise un script: @echo off cls TITLE Création d'un crédential rem fichier de mot de passe set cryptFileOut=cryptPwd.txt if "%cryptFileOut%"=="" set cryptFileOut=%1 :loop if "%cryptFileOut%"=="" set /p cryptFileOut=Fichier d'enregistrement du mot de passe à chiffrer: if "%cryptFileOut%"=="" (goto loop) else (echo.) powershell -Command "& {$cle = read-host -prompt 'Clé de chiffrage (16 caracteres)'|ConvertTo-SecureString -asplaintext -force; $passwd = read-host -assecurestring -prompt 'Mot de passe à chiffrer'; ConvertFrom-SecureString -securekey $cle -secureString $passwd | out-file "%~dp0\"%cryptFileOut%}" timeout /T 5 On peut fournir le nom d'un fichier de sortie dans le script qui servira pour enregistrer le mot de passe chiffré en renseignant la variable cryptFileOut. Si la variable est vide soit on passe le nom du fichier en argument du script soit le script le demande pendant l'execution. Pour pouvoir exécuter du powershell dans un script batch on utilise la commande powershell -Command "& { les commandes_powershell }" Détails des commandes powershell ( séparées par un ";" ) $cle = read-host -prompt 'Clé de chiffrage (16 caracteres)'|ConvertTo-SecureString -asplaintext -force //**Par défaut, le crédential généré par powershell ne peut être utilise que sur la machine qui l'a généré**// . Pour qu'on puisse l'utiliser sur d'autre machine on doit utiliser une clé qui va chiffrer et déchiffrer le mot de passe. On demande cette clé, ici 16 caractères. On ne peut pas mettre n'importe quelle longueur de caractère pour convertir en SecureString ([[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/convertto-securestring?view=powershell-7.1|SecureString]]). C'est au format SecureString que la clé va pouvoir chiffrer le mot de passe. $passwd = read-host -assecurestring -prompt 'Mot de passe à chiffrer' On demande le mot de passe à chiffrer. L'option //assecurestring// permet de ne pas afficher la saisie. ConvertFrom-SecureString -securekey $cle -secureString $passwd | out-file "%~dp0\"%cryptFileOut% On chiffre le mot de passe grâce à la clé. Le résultat chiffré est enregistré dans le fichier indiqué. On peut maintenant transmettre/déplacer ce fichier. Il faudra connaitre la clé pour déchiffrer le mot de passe. ===== Utiliser le fichier contenant le mot de passe chiffé ===== Example d'un script @echo off cls TITLE Lecture d'un crédential REM Utilisateur associé au mot de passe set user=beemoon-adm REM Fichier contenant le mot de passe chiffré set cryptFileIn=cryptPwd.txt REM cle de déchiffrement en 16, 24 ou 32 digits (128bits) à passer en paramètre au script REM la cle est celle utilisée pour chiffrer le mot de passe. set cle=%1 :loop if "%cle%"=="" set /p cle=Cle de déchiffrement: if "%cle%"=="" goto loop :loop2 if "%cryptFileIn%"=="" set /p cryptFileIn=Fichier d'enregistrement du mot de passe à déchiffrer: if "%cryptFileIn%"=="" (goto loop2) else (echo.) if not exist %cryptFileIn% set cryptFileIn="%~dp0\%cryptFileIn%" if not exist %cryptFileIn% echo Impossible de trouver %cryptFileIn% && exit 1 REM Examples d'usage REM Monter un lecteur réseau REM powershell -Command "& {$cle=ConvertTo-SecureString '%cle%' -asplaintext -force;$passwd=get-content %cryptFileIn%| ConvertTo-SecureString -securekey $cle;$Credential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList %user%,$passwd;New-PSDrive -name "G" -PSProvider FileSystem -Root \\mon-srv-smb\monPartage -Credential $Credential -Persist -Scope Global}" REM Pour executer une commande powershell en superAdmin et "en tant que" REM désactive le consentement UAC pour les admins REM set psCmd=New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0 -PropertyType DWORD -Force REM powershell -Command "& {$cle=ConvertTo-SecureString %cle% -asplaintext -force;$passwd=get-content %cryptFileIn%| ConvertTo-SecureString -securekey $cle;$Credential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList %user%,$passwd; Start-Process powershell.exe -WorkingDirectory %userprofile% -Cred $Credential -WindowStyle hidden -ArgumentList 'start-process powershell -Verb runAs -windowStyle hidden -ArgumentList ''%psCmd%'''}" REM set psCmd=New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0 -PropertyType DWORD -Force REM powershell -Command "& {$cle=ConvertTo-SecureString %cle% -asplaintext -force;$passwd=get-content %cryptFileIn%| ConvertTo-SecureString -securekey $cle;$Credential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList %user%,$passwd; Start-Process powershell.exe -WorkingDirectory %userprofile% -Cred $Credential -WindowStyle hidden -ArgumentList 'start-process powershell -Verb runAs -windowStyle hidden -ArgumentList ''%psCmd%'''}" REM set setupFile=C:\Program Files\Mozilla Firefox\firefox.exe REM Exécuter un programme en tant que REM powershell -Command "& {$cle=ConvertTo-SecureString '%cle%' -asplaintext -force;$passwd=get-content %cryptFileIn%| ConvertTo-SecureString -securekey $cle;$Credential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList %user%,$passwd;Start-Process powershell.exe -WorkingDirectory %userprofile% -Cred $Credential -WindowStyle Hidden -ArgumentList 'Start-Process ''%setupFile%'''}" REM Exécuter un programme "en tant que" et superadmin REM powershell -Command "& {$cle=ConvertTo-SecureString '%cle%' -asplaintext -force;$passwd=get-content %cryptFileIn%| ConvertTo-SecureString -securekey $cle;$Credential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList %user%,$passwd;Start-Process powershell.exe -WorkingDirectory %userprofile% -Cred $Credential -WindowStyle Hidden -ArgumentList 'Start-Process ''%setupFile%'' -Verb runAs'}" REM aide rem https://dev.to/frpsug/credential-comment-les-utiliser-1m03 rem https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-credential?view=powershell-7.1 Ce script doit etre automatisé (et donc sans aucune saisie de l'utilisateur si besoin). Il faudra donc renseigner les variables le cas échéant. set user: est l'identifiant associé au mot de passe chiffré set cryptFileIn: est le fichier contenant le mot de passe chiffré set cle: est la clé qui a servi pour chiffrer et donc ici pour déchiffrer le mot de passe. Le fait de renseigner ici la clé en claire implique que ce script **NE DOIT PAS** être en possession d'un utlisateur quelconque **AVEC** le fichier de mot de passe chiffré !!! A vous de mettre en oeuvre ce qu'il faut.