====== 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.