Credential et mot de passe chiffré dans un fichier

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 (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.
Dernière modification : le 2022/01/25