PowerShell : Scripting
Prérequis
L'outil de scripting de PowerShell s'appelle : "Powershell ISE".
Les commentaires se font avec #
Politique d'exécution
La politique d'exécution pour Windows PowerShell détermine comment vous pouvez exécuter les fichiers de configuration et les scripts. Pour connaitre la politique d’exécution actuelle il faut exécuter Get-ExecutionPolicy.
Pour modifier la politique d'exécution, la commande Set-ExecutionPolicy avec la politique souhaitée. Les politiques disponibles sont :
- Restricted
- AllSigned
- RemoteSigned
- Unrestricted
Pour la suite des exemples données ici nous utiliserons la politique "Unrestricted" (À faire en tant qu'administrateur). ELle permet de lancer n'importe quel script sur l'ordinateur.
Variables
Attributs
PS est un langage objet : il est donc possible et même intéressant de regarder les attributs.
Exemples :
- New-Item exemple.txt –Type File
- $fic = Get-ChildItem exemple.txt
- $fic.name
- $fic.extension
- $fic.length
- $fic.LastTimeAccess
- $fic.delete()
$? : Contient truesi la dernière opération à réussie et false si elle a échouée.
$_ : Stocke l'objet courant dans un ensemble d’objet du pipeline.
$home : Stocke le chemin complet du répertoire de l'utilisateur.
Simple quotes, doubles quotes
Vous pouvez placer les chaînes entre guillemets simples (' ') ou des guillemets doubles (" ").Lorsque vous placez une chaîne en single-quotation, la chaîne est passée à la commande exactement comme vous le tapez.
Exemples avec $varA = 200
- Write-Host 'The value of $varA is $varA.'
Renvoie : The value of $varAis $varA.
- Write-Host "The value of $varA is $varA."
Renvoie : The value of 200 is 200.
Tableaux ( ~ Équivalent des listes en python)
Nous avons des tableaux à une dimension ou bien à plusieurs dimensions.Pour déclarer et initialiser un tableau il faut indiquer le nom du tableau précédé de $puis des valeurs du tableau:
$tab = @(20,30,40)
$tab[0] #Pour l’accès aux valeurs il faut indiquer l’indice. Retourne 20
$tab[1]#Retourne 30
$tab[1]=60 #Affecte la valeur 60 à l’indice 1 du tableau
$tab[1]#Retourne 60 (a remplacé 30 dans le tableau)
$tab.length #Renvoie la longueur du tableau
Tableaux vs. Listes
Il existe des listes similaires à celles de Python en Powershell, mais elle sont un peu cachées :
#ARRAYS #Arrays are fixed-size, like the error says. RemoveAt() is an inherited method that doesn't apply to normal arrays. To remove the first entry in the array, you could overwrite the array by a copy that includes every item except the first, like this: $arr = 1..5 $arr 1 2 3 4 5 $arr = $arr[1..($arr.Length-1)] $arr 2 3 4 5 #If you need to remove values at different indexes then you should consider using a List. It supports Add(), Remove() and RemoveAt(): #If you only have a specific type of objects, like int, string etc. then you should edit `[System.Object] to [System.String], [int] etc. $list = [System.Collections.Generic.List[System.Object]](1..5) $list 1 2 3 4 5 $list.RemoveAt(0) $list 2 3 4 5
Opérateurs
Les opérateurs sont :
- -eq : Equal
- -ne : Not Equal
- -gt : Greater Than
- -lt : Lesser Than
Conditions
If
Exemple 1 :
$mavar = "lpasr" if($mavar -eq "lpasr"){ Write-Host "Ok!" }
Exemple 2 :
$mavar= 10 if($mavar–gt5){ #Si $mavarest plus grand #que 5 on rentre dans la condition Write-Host “Ok!” }
Boucles
for ($i=0;$i -lt 6;$i++){ #On initialise $i à 0 pour $i allant de 0 à 5 on rentre dans la boucle puis l’incrémente de 1 Write-host $i # Résultat : 0,1,2,3,4,5 }
$tab = “je”,”suis”,”heureux” foreach($item in $tab){ #On parcours les éléments d’une liste/tableau et on les affiche Write-host $item }
Fonctions
Pour créer une fonction, tapez le mot functionsuivi d'un nom pour la fonction. Tapez le texte de votre commande, et vous l'enfermez dans des accolades ({}). La syntaxe de base pour l'utilisation de paramètres avec les fonctions est :
function FunctionName{ param($Parameter1Name, $Parameter2Name, ...) Commandes }
Exemple :
function Get-USB{ Param($description) $noms_usb= get-wmiobjectwin32_logicaldisk foreach($nom in $noms_usb){ if($nom.VolumeName-eq$description){ write-host $nom.deviceID } } } Get-USB "TEST"
PowerShell et Active Directory
Nous allons ici voir différent cmdlet en lien avec Active Directory.
Il faut d'abord importer le module AD : Import-Module ActiveDirectory; de plus, l'aide d'une commande est dispo avec Get-Help ma_commande.
Demander les credentials d'un utilisateur
- La cmdlet Get-Credential offre la possibilité de saisir les credentials d'un utilisateur (elle ouvre une pop-up). Elle peut être utilisée avec les cmdlets prenant prenant le paramètre -credential :
$cred= Get-Credentialdauphine.fr\adeschamps Restart-Computer -Credential$cred
Lister des propriétés
- Get-Aduser : Lister les propriétés d'und es utilisateurs du domaine. Un paramètre de filtrage est nécessaire pour lister les utilisateurs. Les propriétés par défaut sont affichées, pour afficher toutes les propriétés il faut utiliser le paramètre "Properties"; "SearchBase permet de lister les utilisateurs d'une Unité d'Organisation.
Get-Aduser Administrateur #Liste l’utilisateur Administrateur
Get-Aduser –Filter* #Liste tous les utilisateurs Get-Aduser Administrateur –Properties * #Affiche les propriétés étendues de l’utilisateur
Get-ADUser -Filter* -SearchBase"ou=Compta,DC=lpasr,DC=loc" #Liste les usersde l’OU Compta
- Get-ADComputer : Lister les propriétés d'un objet ordinateur du domaine. Un paramètre de filtrage est nécessaire pour lister les ordinateurs.
Get-ADComputer Win-SRV-001 #Liste l’ordinateur Win-SRV-001 (A remplacer par votre nom de VM)
Get-ADComputer –Filter* #Liste tous les ordinateurs
Get-AdComputer Win-SRV-001 -Properties* #Affiche les propriétés étendues de l’ordinateur
Gestion de comptes utilisateurs et groupes
- New-ADuser : Cmdlet qui permet de créer un utilisateur de domaine. Le paramètre Name est obligatoire et sera utilisé comme SamAccountName (permettant de se connecter avec ce compte à un poste du domaine) si celui-ci n’est pas spécifié. Le compte ne pourra pas être activé si un mot de passe n’est pas défini. Le paramètre AccountPasswordnécessite une chaine de caractère sécurisée. Le mot de passe peut être défini ultérieurement avec la commande Set-ADAccountPassword.
$pass= Read-Host "Password" –AsSecureString#Permet de créer un mot de passe sécurisé
New-ADUser-Name "adeschamps" -GivenName "Aurelien" -UserPrincipalName ”adeschamps@lpasr.loc” -AccountPassword $pass -Enabled $true –PasswordNeverExpire $true
Ici on crée un nouvel utilisateur adeschamps avec un prenom Aurelien son login pour se connecter est adeschamps@lpasr.loc(ou LPASR\adeschamps) pour se connecter -> SAMAccountName) un mot de passe défini precedemment. Le compte est activé et le mot de passe n’expire jamais
- Enable-ADAccount / Disable-ADAccount : Activer ou désactiver un compte d'utilisateur, de service, ou un ordinateur
- Set-ADAccountPassword : Définir ou modifier le mot de passe d'un compte.
$pass = Read-Host "Password" –AsSecureString #On définit un mot de passe tapé par l’utilisateur
Set-ADAccountPassword toto –NewPassword $pass#Et on redéfinit le mot de passe
- New-ADGroup : Création de groupe Active Directory
New-ADGroup -Name gg_lpasr -GroupCategory security -GroupScope Global #Création d’un nouveau groupe de sécurité global
- Add-ADGroupMember: Cmdlet qui permet d’ajouter des utilisateurs/groupes au groupe ciblé.
Add-AdGroupMember -Identity gg_lpasr –Members toto,(...) #On ajoute un ou plusieurs utilisateur à un groupe (séparés par une virgule)
- New-ADOrganizationalUnit: Cmdlet de création d’unité d’organisation. Le paramètre path peut être indiqué pour définir l’emplacement de l’unité d’organisation et le paramètre ProtectedFromAccidentalDeletion peut être utilisé pour désactiver ou non la protection contre la suppression accidentelle de l’OU.
New-ADOrganizationalUnitDEV
New-ADOrganizationalUnit -Name Compta -Path "OU=DEV,DC=lpasr,DC=loc" –ProtectedFromAccidentalDeletion $false #Crée dans l’OU nouvellement crée (DEV)
- Remove-ADUser : Suppression de compte utilisateur de domaine. Le paramètres Confirm peut être utilisé pour eviter de devoir confirmer la suppression du compte.
Remove-ADUser test1 -Confirm:$false
- Remove-ADGroup : Suppression de groupe AD.
Précisions
- Les commandes AD étant potentiellement sensible le paramètre -Whatifpeut-être réellement utile
Remove-ADUsertoto -whatif
WhatIf: Opération «Remove» en cours sur la cible «CN=toto,CN=Users,DC=lpasr,DC=loc»
- Le paramètre -Server peut également être très utile pour lancer des scripts depuis un autre serveur, en général ce paramètre est accompagné du paramètre -Credential pour spécifier un login/password
Add-ADGroupMember -Identity $group -Member $login -server “lpasr.loc" -Credential $cred
Passer des paramètres au script
Pour passer des paramètres au script, il faut utiliser un bloc "Param". Celui-ci doit être *à la première ligne* du script.
<syntaxhighlight lang="powershell"> Param ( [string]$folder )
Write-Host $folder </syntaxhighlight>