Question [Concours ] import/export credentials (validé)

Plus d'informations
il y a 18 ans 3 mois #1299 par Jacques Barathon
Hello,

Je ravive le concours un peu en jachère ces derniers temps!

Pour un redémarrage, j'y vais tranquille, en postant deux petits scripts pour le prix d'un. En fait, je viens de les poster en réponse à un fil sur le forum \"Entraide débutants\", et je me suis dit \"ben, pourquoi pas les soumettre au concours?\". Or donc, voilà.

Ces deux scripts s'appellent export-credential et import-credential. Ils permettent de sauvegarder dans un fichier les credentials d'un utilisateur de manière à pouvoir les recharger à volonté (par exemple dans un script).

La manip est particulièrement utile quand on veut interroger des serveurs distants avec get-wmiobject mais que son propre compte n'a pas accès à ces serveurs:

Il faut alors utiliser get-credential pour saisir un nouveau couple login/mdp et passer le résultat à get-wmiobject via son paramètre -credential.

Problème, si on doit répéter la manip régulièrement au cours de sessions PowerShell différentes, voire si on doit scripter la manip, l'interactivité de get-credential devient une contrainte.

C'est là que mes petits scripts interviennent:

Etape 1: sauvegarde des credentials (à faire une fois pour toutes)

[code:1]
# export-credential.ps1
# v1
# janel, 27/11/07

param ($credential, $filename)

$credential.username > $filename
convertfrom-securestring $credential.password >> $filename
[/code:1]
Etape 2: chargement des Credentials (à utiliser à volonté)

[code:1]
# import-credential.ps1
# v1
# janel, 27/11/07

param ($filename)

$username,$password = type $filename
$pwd = convertto-securestring $password
new-object system.management.automation.PSCredential $username,$pwd
[/code:1]
Exemple d'usage:

[code:1]
# Une fois pour toutes:
PS> $cred = get-credential
PS> export-credential $cred c:\scripts\admin.txt

# Dans un script qui a besoin d'utiliser les credentials:
$cred = import-credential c:\scripts\admin.txt
get-wmiobject win32_operatingsystem -computer MONSERVEUR -credential $cred
[/code:1]
Voilà. L'avantage de cette technique (outre le fait qu'elle autorise la récupération des credentials sans avoir besoin de repasser par le popup Windows) est qu'elle préserve la confidentialité du mot de passe en le stockant sous sa forme cryptée.

La contrainte (liée à l'avantage) est qu'on ne peut importer les credentials qu'à partir du même compte qui les a saisis avec get-credential. En effet, la SecureString est générée à partir d'une clé détenue par le compte actif. Attention donc si vous utilisez import-credential dans un script: vous ne pourrez pas le planifier avec un autre compte. Ou alors, il faudra avoir exécuté la première étape à partir de cet autre compte également.

Janel

Message édité par: janel, à: 27/11/07 18:57<br><br>Message édité par: robin, à: 18/12/07 09:33

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 18 ans 3 mois #1372 par Robin Lemesle
Astucieux.

Validé

Robin MVP PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 18 ans 1 mois #1654 par daniel soares
ces deux scripts sont devenus indispensables pour moi

alors je me suis permis de faire une petite modif
comme je gere beaucoup de comptes differents j'ai tout integré dans le meme fichier
mais voila ca bug quand j'utilise import-credential avec des comptes identiques dont l'un est dans un domaine et l'autre en workgroup
du genre
domaine1\comptegeneric
et
\comptegeneric (utilisé pour du workgroup
la recherche sur \&quot;comptegeneric\&quot; donnant 2 resultats ca plante mon select-string

la solution de contournement que j'ai trouvé n'est pas tres elegante
elle consiste a ajouter l'argument -list qui va selectionner la premiere occurence mais ca m'oblige a penser a stoquer dans mon fichier le compte \comptegeneric ( c'est a dire celui qui est le plus court)
avant le compte domaine1\comptegeneric
j'espere avoir ete clair :)
il est clair aussi que ce script ne fonctionnerai pas avec deux comptes identiques ayant des mdp differents

[code:1]
# import-credential.ps1

param ($credential)
$filename = \&quot;$home\admin.txt\&quot;
$credential = $credential |foreach {$_.Replace(\&quot;\\&quot;,\&quot;\\\&quot;«»)}
$loccred =(select-string $credential $filename -list).LineNumber
$account = get-content $filename | where {$_.readcount -gt $loccred-1 -and $_.readcount -lt $loccred+2}
$username = $account[0]
$password = $account[1]
$secpwd = convertto-securestring $password
new-object system.management.automation.PSCredential $username,$secpwd
[/code:1]

[code:1]
# export-credential.ps1

$credential = Get-Credential
$filename = \&quot;$home\admin.txt\&quot;
if ((Test-Path $filename) -eq $false) {New-Item $filename}
$domaine,$account = $credential.username.split(\&quot;\\\&quot;«»)
$loccred =(select-string \&quot;^$domaine\\$account\&quot; $filename).LineNumber
if ($loccred -eq $null){
$credential.username | Out-File $filename -Encoding oem -Append -Force
convertfrom-securestring $credential.password | Out-File $filename -Encoding oem -Append -Force
\&quot;compte créé\&quot;
}
else {
$result = get-content $filename
$result[$loccred] = convertfrom-securestring $credential.password
$result | Set-Content $filename
\&quot;mot de passe modifié\&quot;
}
[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 18 ans 1 mois #1656 par Robin Lemesle
Très bien dan,

Je vais de ce pas rajouter ce script à notre bibliothèque de scripts B)

Robin MVP PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.080 secondes
Propulsé par Kunena