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=admin
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 Le fichier contenant le mot de passe chiffr‚ n'existe pas (%cryptFileIn%) && echo. && pause && exit 1

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

REM Examples d'usage
REM désactive le consentement UAC pour les admins pour le runAs (à faire en tant que super administrateur)
REM reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /d 0 /t REG_DWORD /f

    REM Monter un lecteru 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 Ex‚cuter un programme en tant que
    set progFolder='C:\'
    set setupFile=test.bat
    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; set-location %progFolder%;Start-Process -FilePath .\%setupFile% -Cred $Credential}"
    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; set-location %progFolder%;Start-Process powershell.exe -Cred $Credential -WindowStyle Hidden -ArgumentList 'Start-Process -Verb runAs .\%setupFile%'}"

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/07/16