jeudi 18 juillet 2013

Executer en tant que (RunAs).

Dans l'exemple suivant, nous allons voir comment exécuter une commande avec un compte spécifique et un mot de passe intégré. Tout d'abord nous devons créer un mot de passe sécurisé et crypté. Pour cela j'utilise la commande suivante :

 
#Création d'un mot de passe crypté.
read-host -assecurestring | convertfrom-securestring | out-file C:\secstring.txt
#Fin.

Cette commande ouvre une fenêtre qui demande de taper votre mot de passe. Le mot de passe est ensuite et enregistré dans le fichier securestring.txt.

Le script suivant fait la même chose qu'au dessus mais avec un formulaire. Le mot de passe crypté s'affiche directement dans la fenêtre.

 
#Ce script affiche une fenêtre qui permet de crypter un mot de passe.
#Celui-ci pourra être utiliser ensuite dans un script.

#Ouvre une fenêtre.
[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$form1 = New-Object Windows.Forms.Form
$form1.text = "Génère un mot de passe crypté."
$form1.Size = New-Object System.Drawing.Size(290,155)

#Création d'un label (Label).
$label1 = New-Object Windows.Forms.Label
$label1.Location = New-Object Drawing.Point 15,18
$label1.Size = New-Object System.Drawing.Size(60,16)
$label1.text = "Password"

#Création d'un Text (TextBox).
$textpwd = New-Object Windows.Forms.TextBox
$textpwd.Location = New-Object Drawing.Point 80,15
$textpwd.Size = New-Object System.Drawing.Size(120,30)
$textpwd.PasswordChar = "*"
$textpwd.Text = ""

#Création d'un bouton (Button).
$bouton1 = New-Object Windows.Forms.Button
$bouton1.Location = New-Object Drawing.Point 204,14
$bouton1.Size = New-Object System.Drawing.Size(60,22)
$bouton1.text = "Crypter"
$bouton1.add_click({
             #Mot de passe format String.
             $pwd = $textpwd.Text
             #Converti le mot de passe String en SecureString.
             $pwdss = ConvertTo-SecureString -String $pwd -AsPlainText -Force
             #Crypte le mot de passe depuis un SecureString.
             $pwdcypt = ConvertFrom-SecureString -SecureString $pwdss
             #Affiche le résultat.
             $textcypt.Text = $pwdcypt
                   })

#Création d'un label (Label).
$label2 = New-Object Windows.Forms.Label
$label2.Location = New-Object Drawing.Point 15,48
$label2.Size = New-Object System.Drawing.Size(60,16)
$label2.text = "Pwd crypté"
                        
#Création d'un Text (TextBox).
$textcypt = New-Object Windows.Forms.TextBox
$textcypt.Location = New-Object Drawing.Point 80,45
$textcypt.Size = New-Object System.Drawing.Size(183,60)
$textcypt.Multiline = $true    #Active le multiligne.
$textcypt.ReadOnly = $true     #La textbox est en lecture seul.
$textcypt.BackColor = "white"  #Force le fond en blanc.
$textcypt.Text = ""

#Attache les contrôles à la fenêtre.
$form1.controls.add($label1)
$form1.controls.add($label2)
$form1.controls.add($bouton1)
$form1.controls.add($textpwd)
$form1.controls.add($textcypt)

#Affiche le tout.
$form1.ShowDialog()

#Fin.

Le mot de passe généré ressemble à quelques choses comme ça : 01000000d08c9ddf0115d1118c7a00c04fc297eb010000003632ceda2f9ab841aac0ef746f42b3320000000002000000000010660000000100002000000067056e68af62f3a3cd8c2b92138309ba79c538a3e6c9e0681220fd1720a40451000000000e8000000002000020000000b725bd3c36b772b9394ab9f9ee462a045e3fdec2c12afdf6392053f07166700a20000000ece095b2a5111a023f188b76e98360faf243ff88e8d9cb79af832c0d3ab595124000000040a8eebba2a6322f5fed6397156d1b91ba49379f4d7108e7dcbd726904ca1bfac467b291e6b0cfc5f40534e80297a05bd2454edf32e8bc4d5472d68b1356a865

Une fois le mot de passe crypté créé, nous allons pouvoir l'intégrer à notre script et l'utiliser pour exécuter notre commande.

 
#Utilisation du mot de passe crypté pour lancer une commande.
#Authentification.
$username = "domain\utilisateur"
$passcrypt = "copier le mot de passe crypté ici en conservant les guillemets"

#Décrypte le mot de passe.
$password = convertto-securestring $passcrypt

#Création de l’environnement d’authentification.
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

#Lance la commande avec l’authentification crée précédemment.
Start-Process "C:\WINDOWS\system32\mmc.exe" -Credential $cred -ArgumentList "services.msc"

#Fin.

Pour sécuriser le tout, je vous conseille d'encapsuler le script dans un .exe afin d’empêcher toutes modifications (notamment de la commande "exécuter" dans le script).