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 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 fourir le nom d'un fichier de sortie qui serrvira pour enregistrer le mot de passe chiffré en renseignant la variable cryptFileOut. Si la variable est vide soit on la passe 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 etre 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 affichier 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échiffrage en 16, 24 ou 32 digits (128bits)
set cle=azertyuiopqsdfgh

if "%cryptFileIn%"=="" set cryptFileIn=%1
:loop
if "%cryptFileIn%"=="" set /p cryptFileIn=Fichier d'enregistrement du mot de passe à déchiffrer:
if "%cryptFileIn%"=="" (goto loop) else (echo.)
if not exist %cryptFileIn% set cryptFileIn="%~dp0\%cryptFileIn%"
if not exist %cryptFileIn% echo Impossible de trouver %cryptFileIn% && exit 1

if "%cle%"=="" if exist %1 set cle=%2
if "%cle%"=="" if not exist %1 set cle=%1

:loop2
if "%cle%"=="" set /p cle=Cle de déchiffrage:
if "%cle%"=="" goto loop2

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 \\iut1e-srv-gdp\Express -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
    set psCmd=New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0 -PropertyType DWORD -Force
    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%'''}"

    set psCmd=New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0 -PropertyType DWORD -Force
    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%'''}"

    set setupFile=c:\test.bat
    REM Exécuter un programme en tant que
    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 mettre ici la clé 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.

(à finir)

Create the Secure String Password

Open a PowerShell session with administrator privileges. First piece is to create a variable and execute Get-Credential to popup a box for us to type in the credentials we need to connect.

$credential = Get-Credential

Next step is to write the secure string to a file for reference. You can change the location where you want to store the password. You will recieve a popup in which you will need to add the DOMAIN\username and password to access the share.

$credential.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt

sample usage to mount a network drive

$encrypted = Get-Content c:\temp\password.txt | ConvertTo-SecureString

$credential = New-Object System.Management.Automation.PsCredential("DOMAIN\username_associate_to_pwd", $encrypted)

New-PSDrive -name "G" -PSProvider FileSystem -Root \\SERVER\share -Persist -Credential $credential

Vous pouvez donc générer le fichier contenant le mot de passe crypté de 2 façons: directement depuis une console powershell (ou script ps1) ou depuis une console DOS (ou script batch)

depuis powershell:

$cle=ConvertTo-SecureString "malongcle" -asplaintext -force
$passwd = toto
Convertfrom-securestring -securekey $cle -secureString $passwd  | out-file cryptPwd.txt

NOTE:

la cle ($cle) permet de pouvoir déchiffrer le mot de passe sur une autre machine. Sinon seule la machine qui a chiffré le mot de passe peut le déchiffrer.

script PS1

#clé pour crypter
$cle = read-host -prompt 'cle de cryptage (16 caracteres)'|ConvertTo-SecureString -asplaintext -force

#mot de passe à crypter
$passwd = read-host -assecurestring -prompt 'Votre mode de passe'

#cryptage du mot de passe
Convertfrom-securestring -securekey $cle -secureString $passwd  | out-file cryptPwd.txt

depuis DOS

il faut executer les commandes powershell ci-dessus dans le DOS avec

powershell -Command "& { commande_powershell }"

Pour tout enchainer (passage de variable à l'intérieur de powershell oblige)

powershell -Command "& {$cle = ConvertTo-SecureString '%cle%' -asplaintext -force; $passwd = read-host -assecurestring -prompt 'Votre mode de passe';Convertfrom-securestring -securekey $cle -secureString $passwd  | out-file cryptPwd.txt}"
Dernière modification: le 2021/08/20