Vous êtes sur la page 1sur 19

Scripting powershell

C’est le fait de mettre des commandes dans un fichier pour automatiser les
actions/procédures. Il sera demandé à l’épreuve de savoir lire et expliquer un script.

Scripts automatisés: On nous demande pas de partir de zéro et d’en faire un. On utilise des
commandes (des petits programmes légers) on va les mettre ensemble pour avoir une
action automatisée.

Scripts interactifs : il posera des questions à l’admin et le script se lancera en fonction des
réponses (add user sur linux, installation pfsense, sconfig sur powershell).

Dans powershell je peux aussi faire des commandes bash (ex: ipconfig, hostname, etc…)

ISE = Integrated Scripting Environment


Dans ISE, on peut exécuter des commandes et écrire, tester et déboguer des scripts dans
une seule interface utilisateur graphique Windows

IDE = Integrated development Environment

Commandes Powershell

Touche >TAB pour compléter une commande

Pour ajouter:
>add-
>new-

Pour obtenir des informations:(équivalent du show sur cisco)


>get-

Pour changer des réglages :


>set-

Chercher des commandes:


>get-command ( toutes les commandes concernant le get-)
>get-command get-* ou set-* (toutes les commandes qui commencent par get- ou set-)
>get-command *dhcp* (cherche toutes les commandes avec dhcp)

Supprimer :
>remove-

PowerShell fonctionne avec des modules, qui sont importés lorsqu’on installe une appli ou
un logiciel. On peut importer un module en faisant :
>Import-Module *nom du module*
aide:
>get-help *nom de la commande* parfois il faudra les télécharger sur internet donc
connexion

màj aide : >update-help

Variables :
>$+*nom de la variable*=”contenu” (ex : $test=”message” ou 3 ou ipconfig)
si entre “ “ = chaîne de caractère
La variable est propre à la session, si on ferme la console powershell et qu’on l’on ré-ouvre
une la variable ne sera plus.

Il faut faire attention à ne pas faire de conflits avec une variable déjà existante.
Ne pas utiliser _ ou __ après $
Pour éviter les conflits, mettre des noms en français.

Afficher les variables enregistrées :


>Get-Variable

Ouvrir PowerShell ISE ( dans menu démarrer)

Tout le contenu à droite est l’équivalent du get-help.

La partie haute est un fichier test afin d’écrire notre script et la partie basse est une fenêtre
powershell afin de tester nos commandes en même temps.
exemple: Attention lorsqu’on fait des tests utiliser une VM afin de ne pas modifier les
paramètres de notre machine physique.

On créer une variable prénom qui affichera veuillez entrer votre prénom

La deuxième ligne reprend la première ligne afin de dire bonjour au prénom entré par
l’utilisateur:

Pour tester faire F5 ou le petit bouton play vert ce qui a pour conséquence de lancer le
script:
On ajoute une condition >if (variable)

Dans la commande, nous demandons d'entrer un prénom, si le prénom est ali, nous aurons
le message Bonjour Administrateur en vert.
Sinon (autre prénom que ali) nous aurons le message Bonjour “le prénom” en noir.
exemple 2: script pour ajouter adresse IP :

Tout d’abord on cherche la commande pour l’ip


Get-command new-net car on a rien trouvé avec add-
On trouve New-NetIPAddress

On test :

Script pour configurer l’adresse IP manuellement:


Ici dans le script on définit d’abord les éléments puis on met le tout à la suite de la
commande new-netipaddress en indiquant les variables au lieux de nos valeurs :(astuce : on
utilise *alt gr + 7* pour pouvoir sauter une ligne sans changer de variable)
Pour perfectionner le script qui ici ne fait qu’ajouter une ip supplémentaire sans supprimer
l’ancienne, nous allons tout d’abord demander à powershell de nous afficher les adresses ip
existantes afin de pouvoir les effacer afin de la remplacer par la nouvelle.

Ici on demande à afficher les adresses IP en IPv4 sur l’interface ethernet:

Pour affiner la commande on ajoute $().IPAddress afin d’afficher uniquement la première


ligne:

Pour le masque:

Pour la gateway, la commande est différente:

Dans le script on ajoute:


Aide:
-Mettre en automatique pour obtenir une adresse APIPA
-Supprimer les passerelles dans la rubrique Avancé

Lancer le script:

--> script fonctionnel


modification du script en ajoutant la demande pour le dhcp :
- attention pensez à mettre des guillemets sur le nom de l’interface si ce n’est pas
celle par défaut (si pas ethernet = “ethernet 2”)
-on met les variables “anciennes” qui correspondent à la commande pour remove en
premier
-on met la variable pour le dhcp
-on demande si la réponse pour le dhcp est “oui” alors on supprime l’adresse ip puis on
active le DHCP
-sinon (else) on nous demande de rentrer une adresse ip statique comme précédemment

→Deuxième manière de faire où l’on place la commande remove-netipaddress avant de


façon à ne pas avoir à la réécrire deux fois:
Aide: Ici nous avons ajouté une variable pour l’apipa afin qu’on ai plus l’erreur lorsque la
commande pour supprimer l’adresse ip supprime aussi la gateway hors en apipa il n’y en a
pas donc on avait du rouge.

Du coup la variable apipa indique que si l’adresse est en 169.254 on ne retire pas la
gateway mais si c’est autre chose ça supprime la gateway.

Le .split(“.”))[0,1] -join “.” signifie qu’on prends les 2 premiers octets de l'adresse en apipa et
qu’on les joint avec un “.” pour les séparer.

Script du screenshot a copier coller :

 ancienneip=$(Get-NetIPAddress -InterfaceAlias ethernet -AddressFamily IPv4).IPAddress


$
$ancienmasque=$(Get-NetIPAddress -InterfaceAlias ethernet -AddressFamily
IPv4).PrefixLength
$anciennegateway=$($(Get-NetIPConfiguration).IPv4defaultgateway).nexthop
$dhcp=Read-Host "voulez vous être en DHCP"

$apipa=$($($(Get-NetIPAddress -InterfaceAlias ethernet -AddressFamily IPv4`


).IPAddress).split("."))[0,1] -join "."
if ($apipa -eq "169.254" ) {
Remove-NetIPAddress -IPAddress $ancienneip -InterfaceAlias ethernet `
-PrefixLength $ancienmasque -AddressFamily IPv4 -Confirm:$false
}
else {
Remove-NetIPAddress -IPAddress $ancienneip -InterfaceAlias ethernet `
-DefaultGateway $anciennegateway -PrefixLength $ancienmasque -AddressFamily IPv4
-Confirm:$false
}
if ($dhcp -eq "oui"){
Set-NetIPInterface -InterfaceAlias ethernet -Dhcp Enabled
}
else {
Set-NetIPInterface -InterfaceAlias ethernet -Dhcp Disabled
$adresseip=read-host "veuillez entrer l'IP"
$masque=read-host "veuillez entrer le masque"
$passerelle=Read-Host "veuillez entrer la passerelle"

New-NetIPAddress -IPAddress $adresseip -InterfaceAlias ethernet `


-DefaultGateway $passerelle -PrefixLength $masque -AddressFamily IPv4
}

Script :Configuration DHCP


(vérifier que le service DHCP est installé sur le serveur AD sinon installer le service dhcp)
>get-windowsfeature *dhcp* afin de voir si le serveur DHCP est installé
>$(Get-WindowsFeature -name dhcp).installstate —-> installed donc dhcp est bien installé

Le script: on vérifie que le service est installé si oui on ajoute un range d’adresses et le mask
puis on modifie les options (set) routeur(ip), serveurdns(ip), dnsdomain(nom du domaine)

$isdhcpinstalled=$(Get-WindowsFeature -name dhcp).installed

if ($isdhcpinstalled -ne "true") {


Install-WindowsFeature dhcp
}
Add-DhcpServerv4Scope -Name "réseau local" -StartRange 192.168.0.1 `
-EndRange 192.168.0.100 -SubnetMask 255.255.255.0
Set-DhcpServerv4OptionValue -Router 192.168.0.254 -DnsServer 1.1.1.1 `
-ScopeId 192.168.0.0 -DnsDomain "ali.labo" -force

Pour vérifier, on fait la commande:


$isdhcpinstalled=$(Get-WindowsFeature -name dhcp).installed

if ($isdhcpinstalled -ne "true") {


Install-WindowsFeature dhcp
}
$nom=Read-Host "veuillez donner le nom de l'étendue dhcp à créer"
$réseau=Read-Host "veuillez donner l'identifiant réseau"
$first=Read-Host "veuillez donner la première adresse à distribuer"
$last=Read-Host "veuillez donner la dernière adresse à distribuer"
$gateway=Read-Host "veuillez donner l'adresse de passerelle à distribuer"
$dns=Read-Host "veuillez donner les adresses de serveur dns 'séparés par une virgule"
$domain=Read-Host "veuillez donner le nom de domaine dns"

Add-DhcpServerv4Scope -Name $nom -StartRange $first `


-EndRange $last -SubnetMask $mask
Set-DhcpServerv4OptionValue -Router $gateway -DnsServer $dns `
-ScopeId $réseau -DnsDomain $domain -force
Script : ajouts suppression OU

Ici dans le script nous avons créer les variables $domain et $addomain puis on a fait en
sorte que lorsqu’on le lance il nous demande de choisir entre le choix 1 et 2. Si on tape autre
chose on a un message nous disant de choisir uniquement 1 ou 2 avec une attente de 3
secondes avant de quitter.

$domain=$(Get-ADDomain).dnsroot
$addomain=(Get-ADDomain).distinguishedname #nom de domaine au format LDAP
Write-Host "souhaitez vous ajouter ou supprimer une OU dans le domaine $domain"
Write-Host "1) ajouter"
Write-Host "2) supprimer"
$choix=Read-Host "réponse"

Switch ($choix) {

1{
$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à créer dans le
domaine $domaine"
New-ADOrganizationalUnit -Name $unite -Path $addomain
}
2{
$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à supprimer
dans le domaine $domaine"
Set-ADOrganizationalUnit -Identity "OU=$unite,$addomain"
-ProtectedFromAccidentalDeletion $false
Remove-ADOrganizationalUnit -Identity "OU=$unite,$addomain" -Confirm:$false
}
default {
Write-Host "merci de taper 1 ou 2"
Write-Host "Bye"
sleep 3
}
}
On améliore le script en demandant à ce dernier de chercher lui-même le chemin pour
supprimer l’OU en ajoutant la variable pour filtrer le nom.

$domain=$(Get-ADDomain).dnsroot
$addomain=(Get-ADDomain).distinguishedname #nom de domaine au format LDAP
Write-Host "souhaitez vous ajouter ou supprimer une OU dans le domaine $domain"
Write-Host "1) ajouter"
Write-Host "2) supprimer"
$choix=Read-Host "réponse"

Switch ($choix) {

1{
$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à créer dans le
domaine $domaine"
New-ADOrganizationalUnit -Name $unite -Path $addomain
}
2{

$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à supprimer


dans le domaine $domaine"
$chemin=$(get-ADOrganizationalUnit -filter "name -eq '$unite'").distinguishedname
Set-ADOrganizationalUnit -Identity $chemin -ProtectedFromAccidentalDeletion
$false
Remove-ADOrganizationalUnit -Identity $chemin -recursive -Confirm:$false
}
default {
Write-Host "merci de taper 1 ou 2"
Write-Host "Bye"
sleep 3
}
}
Créer une Sous unité:
Ici on ajoute un switch dans un switch (on propose 2 choix), là où précédemment on avait
uniquement choix 1 et 2 à la première question, on a maintenant si on répond 1 un
deuxième
choix à faire si on fait une sous unité ou à la racine. Si on choisi 1 on indique le nom du
dossier parent puis le nom du dossier en variable puis on entre la commande pour créer
l’UO

$domain=$(Get-ADDomain).dnsroot
$addomain=(Get-ADDomain).distinguishedname #nom de domaine au format LDAP
Write-Host "souhaitez vous ajouter ou supprimer une OU dans le domaine $domain"
Write-Host "1) ajouter"
Write-Host "2) supprimer"
$choix=Read-Host "réponse"

Switch ($choix) {

1{
Write-Host "Souhaitez-vous créer une sous-unité, ou une unité à la racine du
domaine $domain"
Write-Host "1) sous-unité"
Write-Host "2) à la racine"
$choix=Read-Host "réponse"

switch ($choix) {
1 { $parent=Read-Host "veuillez donner le nom de l'OU parent "
$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à créer
dans l'OU parent $parent"
$chemin=$(get-ADOrganizationalUnit -filter "name -eq '$parent'").distinguishedname
New-ADOrganizationalUnit -Name $unite -Path "$chemin"
}

2{$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à créer dans


le domaine $domaine"
New-ADOrganizationalUnit -Name $unite -Path $addomain}
}
}

2{

$unite=Read-Host "veuillez donner le nom d'une unité d'organisation à supprimer


dans le domaine $domaine"
$chemin=$(get-ADOrganizationalUnit -filter "name -eq '$unite'").distinguishedname
Set-ADOrganizationalUnit -Identity $chemin -ProtectedFromAccidentalDeletion
$false
Remove-ADOrganizationalUnit -Identity $chemin -recursive -Confirm:$false
}
default {
Write-Host "merci de taper 1 ou 2"
Write-Host "Bye"
sleep 3
}
}

Script : création utilisateur

lien pour un tuto : Comment créer de nouveaux utilisateurs d'AD avec PowerShell

On créer un fichier sur un tableur dans lequel on indique : nom, prenom, pass, ou
Attention à mettre un mot de passe sécurisé
On enregistre le fichier au format csv (coma separation value) : utilisateurs.csv
on choisi le “;” plutôt que la “,”

On transfère le fichier utilisateurs.csv sur le serveur Windows puis on va sur Powershell ISE
afin de créer le script.

On créer d’abord la variable pour importer le fichier .csv avec le -delimiter qui indique qu’on
délimite avec des “;” et on indique le chemin (ici le bureau) :
Si on ajoute un Write-host $($fichier) ou echo (c’est un alias de write-host)$fichier ça
affiche le contenu du fichier bien séparé par des “;” :

ou echo (c’est un alias de write-host)$fichier :

Si on souhaite afficher uniquement les noms il suffit de rajouter $(variable).nom ou .ou


après la parenthèse :
C’est utile lorsque l’on souhaite uniquement choisir une colonne de notre tableau

.ou:

foreach va répéter une action(commande) pour chacune des lignes d’un élément/objet (la
plupart du temps un fichier texte)
Ensuite on enregistre le contenu de la ligne en ne prenant que le nom (le echo ne sert ici
qu'à montrer le fonctionnement en réalité on ne le mettra pas)

On fait la même chose pour chaque colonne (nom, prenom, pass, ou), Attention pour le mot
de pass il faudra ajouter ConvertTo-SecureString -AsPlainText $($user).pass -Force
Ça permet de convertir en chaîne de caractères pour que Windows puisse le stocker dans
sa mémoire sinon Windows n’acceptera pas de créer un utilisateur si le mot de passe est
visible. Pour $ou on utilise un filtre pour récupérer le chemin de l’ou.
Pour le login on demandera de taper la première lettre du prénom(0,1)+un point “.”+le nom.
On aura donc pour jimmy hendrix on aura j.hendrix. Il faut aussi rajouter le nom de domaine
ici $dnsdomain pour l’identifiant de connexion.
A la fin on ajoute la commande pour ajouter un utilisateur en utilisant les variables qu’on a
écrit avant. Ca créera les utilisateurs directement sur AD en remplissant les champs choisis:
$users=Import-Csv -Delimiter ";" -Path .\Desktop\utilisateurs.csv

ForEach ($user in $users){


$dnsdomain=$(Get-ADDomain).dnsroot
$nom=$($user).nom
$prenom=$($user).prenom
$pass=ConvertTo-SecureString -AsPlainText $($user).pass -force
$ou=$(Get-ADOrganizationalUnit -Filter "name -eq
'$($($user).ou)'").distinguishedname
$login=$prenom.Substring(0,1)+"."+$nom

New-ADUser -AccountPassword $pass -DisplayName $($prenom+" "+$nom) `


-Name $($prenom+" "+$nom) -GivenName $prenom -Surname $nom
-UserPrincipalName `
$($login+"@"+$dnsdomain) -SamAccountName $login -Enabled $true `
-Path "OU=utilisateurs,$ou"
}

Vous aimerez peut-être aussi