Vous êtes sur la page 1sur 47

Didacticiel

Windows Powershell
pour débutants
Table des matières
Introduction 4

1. Rédiger des scripts PowerShell : les bases 5

1.1 Lancer PowerShell 5

1.2 Préparer l’exécution de scripts PowerShell 6

1.3 Les cmdlets PowerShell 7

1.4 Commentaires 11

1.5 Canaux (Pipes) 11

2. Top 10 des tâches de gestion d’Active Directory avec PowerShell 12

2.1 Créer de nouveaux comptes d’utilisateur et d’ordinateur 12

2.2 Rattacher un ordinateur à un domaine et retirer un ordinateur d’un domaine 18

2.3 Renommer un ordinateur 19

2.4 Réinitialiser un compte d’ordinateur 20

2.5 Désactiver des comptes d’utilisateur et d’ordinateur 20

2.6 Supprimer un ordinateur d’Active Directory 21

2.7 Créer et supprimer un groupe d’Active Directory 22

2.8 Ajouter des utilisateurs et des ordinateurs à un groupe 24

2.9 Supprimer des utilisateurs et des ordinateurs d’un groupe 25

2.10 Déplacer des utilisateurs et des ordinateurs vers une nouvelle unité d’organisation 26

2
3. Top 10 des tâches de gestion du système de fichiers avec PowerShell 28

3.1 Consulter des objets dans un annuaire 28

3.2 Créer des fichiers et des dossiers 29

3.3 Supprimer des fichiers et des dossiers 30

3.4 Copier des fichiers et des dossiers 31

3.5 Déplacer des fichiers et des annuaires 32

3.6 Renommer des fichiers 33

3.7 Définir des autorisations pour les fichiers et dossiers 33

3.8 Supprimer des autorisations d’utilisateur 36

3.9 Activer et désactiver les héritages d’autorisations 37

3.10 Modifier la propriété des fichiers et des dossiers 38

4. Automatiser les scripts PowerShell 39

4.1 Créer des tâches planifiées avec des scripts PowerShell 39

4.2 Exécuter des scripts PowerShell avec le planificateur de tâches 40

Conclusion 45

À propos de Netwrix 47

3
Introduction
Automatisons, automatisons. Mais où est passé ce script?...
Attention : PowerShell crée une dépendance!

Windows PowerShell est un moteur d’automatisation orienté objet ainsi qu’un langage de script. Doté d’un
interpréteur de commandes interactif, il est conçu pour aider les professionnels de l’informatique à
configurer les systèmes et automatiser les tâches d’administration. Il est intégré à tous les systèmes
d’exploitation Windows modernes depuis Windows 2008 R2.

L’apprentissage de Windows PowerShell peut-être comparé à l’apprentissage d’un outil polyvalent. Dans cet
eBook, nous vous expliquerons les bases des scripts PowerShell, l’utilisation des commandes et scripts
PowerShell pour effectuer les tâches administratives les plus courantes et la manière de programmer dans
le temps vos scripts et commandes PowerShell.

Commençons à apprendre PowerShell.

4
1. Rédiger des scripts PowerShell : les bases
Dans cette section, nous allons aborder les bases des scripts PowerShell. Cela vous permettra d’effectuer
plus facilement la plupart des tâches d’administration dans votre environnement informatique Windows.

1.1 Lancer PowerShell

PowerShell comprend une option de ligne de commande et un environnement d’écriture de scripts intégré (ISE) :

Pour ouvrir la ligne de commande PowerShell, tapez powershell.exe dans le menu Démarrer de Windows.
Un écran comme celui-ci s’affiche :

Pour lancer l’ISE PowerShell, tapez powershell_ise.exe dans le menu Démarrer. L’utilisation de l’ISE Power-
Shell est la meilleure façon de travailler avec le langage de script, car cet environnement offre une
surbrillance syntaxique, un remplissage automatique des commandes et d’autres fonctions d’automatisa-
tion qui simplifient la rédaction et le test des scripts.

5
1.2 Préparation à l’exécution des scripts PowerShell

Les scripts PowerShell sont stockés dans des fichiers .ps1. Vous ne pouvez pas exécuter un script en
double-cliquant simplement sur son fichier, ceci évite d’endommager accidentellement vos systèmes. Au lieu
de cela, cliquez avec le bouton droit de la souris sur le fichier et sélectionnez Exécuter avec PowerShell :

De plus, une politique restreint l’exécution des scripts.


Vous pouvez consulter cette politique en exécutant la commande Get-ExecutionPolicy dans PowerShell :

Vous obtiendrez l’une des valeurs suivantes :

Restricted — Aucun script n’est autorisé. Il s’agit du paramètre par défaut, que vous verrez donc lors de
votre première exécution de la commande.

AllSigned — Vous pouvez exécuter les scripts signés par un développeur de confiance. Ce paramétrage
vous demandera, avant l’exécution d’un script, de confirmer que vous souhaitez bien l’exécuter.
RemoteSigned — Vous pouvez exécuter vos propres scripts ou les scripts signés par un développeur de
confiance.
Unrestricted — Vous pouvez exécuter tous les scripts que vous voulez.

Pour commencer à travailler avec PowerShell, changez le paramétrage de cette politique en la passant de
Restricted à RemoteSigned, à l’aide de la commande Set-ExecutionPolicy RemoteSigned :

6
1.3 Les cmdlets PowerShell

Un cmdlet est une commande PowerShell qui a une fonction prédéfinie, comme un opérateur dans un
langage de programmation. Voici quelques informations importantes concernant les cmdlets :

Il existe des cmdlets système, utilisateur et personnalisés.

Les cmdlets fournissent des résultats sous forme d’objet ou de tableau d’objets.

Les cmdlets peuvent obtenir des données à analyser ou transférer des données vers un autre cmdlet par
le biais de canaux (je reviendrai sur ces canaux – ou pipes – dans un instant).

Les cmdlets sont « insensibles à la casse ». C’est-à-dire que les majuscules et minuscules n’ont aucune
importance, vous pouvez tout aussi bien taper Get-ADUser, get-aduser ou gEt-AdUsEr.

Si vous voulez utiliser plusieurs cmdlets dans une même chaîne, vous devez les séparer par un
point-virgule (;).

Un cmdlet se compose toujours d’un verbe (ou d’un mot qui fait office de verbe) et d’un nom, séparés par un
trait d’union (c’est la règle « verbe-nom »). Voici quelques exemples de verbes :

Get — Obtenir

Set — Définir

Start — Commencer

Stop — Arrêter (quelque chose en cours d’exécution)

Out — Générer

New — Pour créer quelque chose (« new » n’est pas un verbe, mais fonctionne de la même manière)

Pour vous exercer, essayez d’exécuter les cmdlets suivants :

Get-Process — Affiche les processus en cours d’exécution sur votre ordinateur :

7
Get-Service — Affiche la liste des services et leur état

Get-Content — affiche le contenu du fichier spécifié (par exemple, Get-Content C:\Windows\System32\


drivers\etc\hosts)

Bonne nouvelle  : vous n’avez pas à mémoriser tous les cmdlets. Vous pouvez afficher la liste de tous les
cmdlets en exécutant le cmdlet Get-Help-Category, qui renvoie ce qui suit :

Vous pouvez également créer vos propres cmdlets personnalisés.

Chaque cmdlet est assorti de plusieurs paramètres qui permettent de personnaliser son action. Dès que
vous avez tapé un cmdlet et un trait d’union (-), l’ISE PowerShell propose automatiquement tous les
paramètres valides et leurs types.

8
Par exemple, le cmdlet suivant affiche tous les services dont le nom commence par « W » :
Get-Service -Name W*

Si vous oubliez les paramètres d’un cmdlet, utilisez un script comme ci-dessous, qui affiche les paramètres
du cmdlet Get-Process :

Get-Process | Get-Member

Si vous ne trouvez toujours pas le cmdlet dont vous avez besoin, vérifiez que votre aide est à jour et obtenez
des exemples relatifs au cmdlet qui vous intéresse (par exemple Get-Process) en utilisant un script comme
celui-ci :

Update-Help #pour mettre à jour les données


d’aide Get-Help Get-Process -Examples

9
Vous pouvez également utiliser des alias, qui sont des noms de cmdlet abrégés. Par exemple, au lieu de
saisir Get-Help, vous pouvez vous contenter de Help. Essayez d’exécuter les deux commandes suivantes et
voyez si vous obtenez le même résultat :

Start-Process notepad

start notepad

De même, pour arrêter le processus, vous pouvez utiliser l’une des commandes suivantes :

Stop-Process -Name notepad

spps -Name notepad

Pour afficher tous les alias, exécutez le cmdlet Get-Alias.

10
1.4 Commentaires

Le fait de laisser des commentaires dans un script vous aidera – ainsi que vos collègues – à mieux
comprendre ce que fait le script concerné. Un commentaire chaîne est une ligne unique qui commence par
un dièse (#) ; les commentaires blocs s’étendent sur plusieurs lignes, commençant et se terminant par des
dièses et des chevrons :

1.5 Canaux (pipes)

Un canal permet de transférer des données d’un cmdlet à un autre. Précédemment, j’ai utilisé un canal pour
obtenir toutes les propriétés d’un objet.

Si, par exemple, vous exécutez le script suivant, vous obtiendrez tous les services triés selon leur état :

Get-Service | Sort-Object -property Status

Vous pouvez également utiliser un canal pour envoyer du texte dans un fichier à l’aide d’un script comme le suivant :

"Hello, World!" | Out-File C:\ps\test.txt

Vous pouvez utiliser plusieurs canaux. Par exemple, le script suivant dresse la liste de tous les services, le
premier canal excluant les services arrêtés et le second limitant la liste aux noms d’affichage :

Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname


# “$_.” définit l’élément courant dans le canal.

11
2. Top 10 des tâches de gestion d’Active
Directory avec PowerShell
Le plus facile, pour gérer des objets dans un domaine Active Directory, est d’utiliser le composant logiciel
enfichable MMC Utilisateurs et ordinateurs Active Directory. Mais que faire si vous devez créer de nombreux
comptes d’utilisateur, ou si Utilisateurs et ordinateurs Active Directory n’est pas disponible pour une raison
ou pour une autre ? Dans cette section, nous allons voir comment effectuer les tâches de gestion d’AD les
plus courantes avec PowerShell.

Gardez à l’esprit que pour pouvoir travailler avec Active Directory et ses objets, vous devez importer le
module Active Directory pour Windows PowerShell. Dans Microsoft Windows Server 2008 R2, vous devez
activer ce module en exécutant la commande suivante :

Import-Module ActiveDirectory

Dans Microsoft Windows Server 2012 et les versions ultérieures, ce module est activé par défaut.

2.1 Créer de nouveaux comptes d’utilisateur et d’ordinateur

Vous pouvez créer de nouveaux comptes d’utilisateur dans Active Directory en utilisant le cmdlet
New-ADUser. Pour obtenir sa syntaxe complète, exécutez la commande suivante :

Get-Command New-ADUser –Syntax

Une fois que l’on connaît la syntaxe, il est facile d’ajouter des utilisateurs à Active Directory :

New-ADUser B.Johnson

12
Les comptes sont créés avec les propriétés par défaut suivantes :

Compte créé dans le conteneur « Utilisateurs ».

Compte désactivé.

Compte membre du groupe « Utilisateurs du domaine ».

Aucun mot de passe défini.

L’utilisateur doit réinitialiser le mot de passe à sa première connexion.

Donc, pour créer un nouveau compte réellement fonctionnel, nous devons l’activer avec le cmdlet
Enable-ADAccount et lui donner un mot de passe avec le cmdlet Set-ADAccountPassword.

Let’s create a new account with the following attributes:

Name — Jack Robinson

Given Name — Jack

Surname — Robinson

Account Name — J.Robinson

User Principal Name — J.Robinson@enterprise.com

Path — “OU=Managers,DC=enterprise,DC=com”

Password Input — Requis

Status — Activé

Voici le script à utiliser :

New-ADUser -Name "Jack Robinson" -GivenName "Jack" -Surname "Robinson" -SamAccountName


"J.Robinson" -UserPrincipalName "J.Robinson@enterprise.com" -Path
"OU=Managers,DC=enterprise,DC=com" -AccountPassword(Read-Host -AsSecureString "Input
Password") -Enabled $true

Le paramètre Read-Host vous demandera de saisir un nouveau mot de passe. Remarquez que le mot de
passe doit satisfaire les exigences de longueur, de complexité et d’historique de votre politique de sécurité
pour le domaine.

13
Créons à présent dix comptes Active Directory similaires d’un coup et définissons un mot de passe par
défaut (P@ssw0rd) pour chacun d’entre eux. Pour envoyer le mot de passe par défaut dans un état protégé,
nous devons nous servir du paramètre ConvertTo-SecureString.

Nous utiliserons le script suivant :


$path="OU=IT,DC=enterprise,DC=com"
$username="ITclassuser"
$count=1..10 foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $path -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -force) -passThru }

Pour donner au script plus de flexibilité, ajoutez le paramètre Read-Host, qui demandera le nombre
d’utilisateurs à ajouter :

$path="OU=IT,DC=enterprise,DC=com"
$username=Read-Host "Entrer le nom"
$n=Read-Host "Entrer le numéro"
$count=1..$n foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $path -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -force) -passThru }

14
Une autre option pour créer des utilisateurs dans AD consiste à les importer depuis un fichier CSV. Cette
option est idéale lorsque vous avez une liste d’utilisateurs avec des détails personnels prédéfinis tels que :

Prénom

Nom

Identifiant

Service

MotDePass

e OU

Le fichier CSV doit être encodé en UTF8 et contenir des données de contact qui ressemblent à ceci :

Le script suivant créera des objets utilisateurs activés pour tous les utilisateurs présents dans le fichier CSV
qui n’ont pas encore de comptes dans AD. L’option «  Réinitialiser le mot de passe lors de la prochaine
connexion  » sera activée pour les nouveaux comptes, vous pouvez donc utiliser votre mot de passe par
défaut :

15
Entrer un chemin d’accès vers votre fichier d’importation CSV
$ADUsers = Import-csv C:\scripts\newusers.csv

foreach ($User in $ADUsers)


{
$Username = $User.username
$Password = $User.password
$Firstname = $User.firstname
$Lastname = $User.lastname
$Department = $User.department
$OU = $User.ou

#Vérifier si le compte utilisateur existe déjà dans AD


if (Get-ADUser -F {SamAccountName -eq $Username})
{
#Si l’utilisateur existe, éditer un message d’avertissement
Write-Warning "Un compte d’utilisateur $Username existe déjà dans Active
Directory."
}
else
{
#Si un utilisateur n’existe pas, créer un nouveau compte d’utilisateur

#Le compte sera créé dans I’unité d’organisation indiquée dans la variable $OU du
fichier CSV ; n’oubliez pas
de changer le nom de domaine dans la variable « 
-UserPrincipalName ».
-SamAccountName $Username `
-UserPrincipalName "$Username@yourdomain.com" `
-Name "$Firstname $Lastname" `
-GivenName $Firstname `
-Surname $Lastname `
-Enabled $True `
-ChangePasswordAtLogon $True `
-DisplayName "$Lastname, $Firstname" `
-Department $Department `
-Path $OU `
-AccountPassword (convertto-securestring $Password -AsPlainText -Force)

}
}

16
Une fois le script exécuté, deux nouveaux utilisateurs, Edward Franklin et Bill Jackson, ont été ajoutés à notre
domaine Active Directory :

Pour créer un objet ordinateur, utilisez le cmdlet New-ADComputer. Par exemple, exécutez le cmdlet suivant
pour créer un objet ordinateur ayant « WKS932 » comme nom et comme valeur de chemin LDAP par défaut :

New-ADComputer –Name “WKS932” –SamAccountName “WKS932”

Si vous disposez d’une liste d’ordinateurs qui doivent être importés dans Active Directory, enregistrez cette
liste dans un fichier CSV avec l’en-tête « computer » et la liste des noms d’ordinateurs dans la colonne située
en dessous. Exécutez le script PowerShell suivant sur votre contrôleur de domaine pour ajouter des
ordinateurs depuis le fichier CSV, en vous assurant que les variables Path (Chemin) et File (Fichier) sont
correctement définies :

$File="C:\scripts\Computers.csv" # Spécifier l’emplacement du fichier CSV.


$Path="OU=Devices,DC=enterprise,DC=com" # Spécifier le chemin de l’OU.
Import-Csv -Path $File | ForEach-Object { New-ADComputer -Name $_.Computer
-Path $Path -Enabled $True}

17
2.2 Rattacher un ordinateur à un domaine et retirer un ordinateur
d’un domaine

Une autre tâche courante consiste à rattacher un ordinateur à un contrôleur de domaine. Pour rattacher un
PC à un domaine Active Directory, exécutez localement le script PowerShell suivant :

$dc = "ENTERPRISE" # Spécifier le domaine de rattachement.


$pw = "Password123" | ConvertTo-SecureString -asPlainText –Force # Spécifier le mot de passe
pour l’administrateur de domaine.

$usr = "$dc\T.Simpson" # Spécifier le compte d’administration du domaine.


$creds = New-Object System.Management.Automation.PSCredential($usr,$pw)
Add-Computer -DomainName $dc -Credential $creds -restart -force -verbose # L’ordinateur sera

L’ordinateur redémarrera et sera ensuite rattaché au domaine ; il sera ajouté au conteneur par défaut. Pour
rattacher un ordinateur à un contrôleur de domaine à distance, affinez ce script de cette façon :

$dc = "ENTERPRISE"
$pw = "Password123" | ConvertTo-SecureString -asPlainText -Force
$usr = "$dc\T.Simpson"
$pc = "R07GF" # Spécifier l’ordinateur qui doit être rattaché au domaine.
$creds = New-Object System.Management.Automation.PSCredential($usr,$pw)
Add-Computer -ComputerName $pc -LocalCredential $pc\admin -DomainName $dc -Credential
$creds -Verbose -Restart -Force

La variable $pc et le paramètre –LocalCredential servent à authentifier l’ordinateur auprès du domaine.


Remarquez que pour pouvoir utiliser cette méthode, vous devez désactiver le pare-feu sur l’ordinateur local.

Vous pouvez ajouter plusieurs ordinateurs au domaine, soit en les spécifiant dans la ligne de commande
sous forme de liste délimitée par des virgules, soit en important leurs noms à partir d’un fichier texte. Voici
comment spécifier les ordinateurs dans une liste délimitée par des virgules :

$dc = "ENTERPRISE"
$pw = "Password123" | ConvertTo-SecureString -asPlainText -Force
$usr = "$dc\T.Simpson"
$pc = "WKS034, WKS052, WKS057" # Spécifier les ordinateurs à rattacher au domaine.
$creds = New-Object System.Management.Automation.PSCredential($usr,$pw)
Add-Computer -ComputerName $pc -LocalCredential $pc\admin -DomainName $dc -Credential
$creds -Restart -Force

18
Et voici comment utiliser un fichier texte avec la liste des ordinateurs qui doivent être rattachés :

$dc = "ENTERPRISE"
$pw = "Password123" | ConvertTo-SecureString -asPlainText -Force
$usr = "$dc\T.Simpson"
$pc = Get-Content -Path C:\Computers.txt # Spécifier le chemin d’accès à la liste d’ordinateurs.
$creds = New-Object System.Management.Automation.PSCredential($usr,$pw)
Add-Computer -ComputerName $pc -LocalCredential $pc\admin -DomainName $dc -Credential
$creds -Restart -Force

Pour retirer un ordinateur d’un domaine à distance, utilisez le cmdlet Remove-Computer. Ici, nous retirons un
ordinateur d’un domaine, aucune accréditation locale n’est donc nécessaire et nous pouvons ignorer le
paramètre –LocalCredential :

$dc = "ENTERPRISE"
$pw = "Password123" | ConvertTo-SecureString -asPlainText -Force
$usr = "$dc\T.Simpson"
$pc = "R07GF"
$creds = New-Object System.Management.Automation.PSCredential($usr,$pw)
Remove-Computer -ComputerName $pc -Credential $creds –Verbose –Restart –Force

Pour retirer plusieurs ordinateurs à l’aide d’une liste dans un fichier TXT, utilisez le script ci-dessus (qui
rattachait des ordinateurs à un contrôleur de domaine), en remplaçant le cmdlet Add-Computer par
Remove-Computer. Remarquez que vous aurez toujours besoin des identifiants d’administrateur de
domaine pour effectuer cette opération de séparation.

2.3 Renommer un ordinateur

Pour changer le nom d’un ordinateur, utilisez le cmdlet Rename-Computer. Remarquez que l’ordinateur
doit être en ligne et connecté à Active Directory.

Rename-Computer –ComputerName "FS1" -NewName "FS2"

Si vous souhaitez exécuter ce script localement, il se présentera ainsi :

Rename-Computer -NewName "newname" -DomainCredential "Domain\Administrator"

19
Vous pouvez améliorer le script de changement de nom en rattachant l’ordinateur au domaine et en le
mettant simultanément dans l’OU spécifiée.

Le script doit être exécuté sur la machine cible, et non sur le contrôleur de domaine.

$NewComputerName = "Server3" # Spécifier le nouveau nom de l’ordinateur.


$DC = "contoso.com" # Spécifier le domaine de rattachement.
$Path = "OU=TestOU,DC=contoso,DC=com" # Spécifier le chemin de l’OU dans laquelle placer le
compte d’ordinateur dans le domaine.

Add-Computer -DomainName $DC -OUPath $Path -NewName $NewComputerName –Restart

Le script demandera les identifiants d’un compte disposant des autorisations nécessaires pour rattacher des
ordinateurs au domaine, et ensuite l’ordinateur sera renommé, redémarré et rattaché au domaine.

2.4 Réinitialiser un compte d’ordinateur


Comme un compte d’utilisateur, un compte d’ordinateur interagit avec Active Directory à l’aide d’un mot de
passe. Mais pour les comptes d’ordinateur, un changement de mot de passe est effectué tous les 30 jours
par défaut, et le mot de passe est exempté de la stratégie de mot de passe du domaine. Les modifications
de mot de passe sont gérées par le client (ordinateur), et non par AD.

Les identifiants d’ordinateur sont généralement inconnus de l’utilisateur car ils sont définis de manière
aléatoire par l’ordinateur.

Mais vous pouvez définir votre propre mot de passe ; voici un script PowerShell qui le permet :

$pc = read-host –Prompt “Entrez le nom de l’ordinateur à réinitialiser“ # Spécifier le nom de


l’ordinateur.
$pw = read-host –Prompt “Entrez des caractères aléatoires pour le mot de passe provisoire“
–AsSecureString #

2.5 Désactiver des comptes d’utilisateur et d’ordinateur


Pour désactiver des comptes d’utilisateur, d’ordinateur ou de service, utilisez le cmdlet Disable-ADAccount.
Le paramètre –Identity spécifie le compte à désactiver. Vous pouvez spécifier un compte par son nom
distinctif, son identificateur de sécurité (SID), son identificateur global unique (GUID) ou le nom du compte
du gestionnaire de comptes de sécurité (SAM).

Disable-AdAccount -Identity RussellS

20
Si vous spécifiez un nom de compte d’ordinateur, n’oubliez pas d’ajouter un signe dollar ($) à la fin du nom ;
sinon, une erreur se produira à l’exécution du script.

Disable-ADAccount -Identity fs1$

Vous pouvez également désactiver des comptes en masse à l’aide d’une liste dans un fichier texte :

$Pclist = Get-Content C:\scripts\Computer.txt # Spécifier le chemin de la liste


d’ordinateurs. Foreach($pc in $Pclist)
{
Disable-ADAccount -Identity "$pc"
Get-ADComputer -Identity "$pc" | Move-ADObject -TargetPath “OU= Disabled
Computers,DC=enterprise,DC=com”
}

2.6 Supprimer un ordinateur d’Active Directory

Pour supprimer un compte d’ordinateur d’AD, utilisez le cmdlet Remove-ADObject :

Remove-ADObject -Identity "WKS932"

Vous serez invité à confirmer la suppression.

Si vous disposez d’un fichier texte contenant la liste des ordinateurs anciens, vous pouvez simplifier la tâche
de leur suppression à l’aide de PowerShell. Le script suivant lira les noms des ordinateurs à partir d’un fichier
TXT et supprimera les comptes correspondants via un pipeline :

Get-Content C:\scripts\computersfordeletion.txt | % { Get-ADComputer -Filter { Name


-eq $_ } } | Remove-ADObject -Recursive

21
Les comptes périmés d’Active Directory peuvent être compromis, ce qui entraîne des incidents de sécurité,
il est donc essentiel de les surveiller. Ce script PowerShell interroge Active Directory et retourne tous les
ordinateurs qui n’ont pas été connectés au cours des 30  derniers jours. Il supprimera également ces
comptes pour maintenir propre votre AD.

$stale = (Get-Date).AddDays(-30) # c’est-à-dire 30  jours depuis la dernière connexion  ; peut être
changé en n’importe quel nombre.
Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $stale} | FT
Name,lastLogonDate
Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $stale} |

Un ordinateur, FS1, ne s’est pas connecté depuis plus de 30 jours.


Le système demandera confirmation avant de le supprimer du domaine :

Si vous souhaitez désactiver, plutôt que supprimer, les comptes d’ordinateur inactifs, remplacez
le cmdlet Remove-ADComputer par le paramètre et la valeur Set-ADComputer et -Enabled $false.

Souvenez-vous qu’il est essentiel de suivre de près toutes les modifications apportées aux comptes
d’ordinateur, afin de pouvoir repérer rapidement toute modification indésirable et y répondre de
manière appropriée.

2.7 Créer et supprimer un groupe d’Active Directory


Dans Active Directory, l’accès aux ressources réseau est accordé aux « principaux de sécurité » (des entités
comme les comptes d’utilisateur et les comptes d’ordinateur). Ces autorisations peuvent être modifiées au
fil du temps. Pour simplifier la gestion des accès et améliorer la sécurité, les moyennes et grandes
entreprises utilisent souvent les groupes de sécurité Active Directory, qui peuvent contenir des comptes
d’utilisateur et d’ordinateur et d’autres groupes. Elles utilisent aussi fréquemment des groupes de
distribution pour gérer les listes de diffusion par e-mail. Les groupes de sécurité et de distribution sont tous
deux dotés d’identificateurs de sécurité uniques (SID) et d’identificateurs globaux uniques (GUID).

22
Si vous ne connaissez pas encore bien les groupes AD et la gestion de ces groupes, veuillez lire le
guide de bonnes pratiques de gestion des groupes Active Directory avant de poursuivre.

Pour créer un groupe AD, utilisez le cmdlet New-ADGroup. Sa syntaxe complète peut être obtenue en exécutant
la commande suivante :

Get-Command New-ADGroup –Syntax

Le moyen le plus simple de créer un groupe est d’exécuter ce court script :

New-ADGroup "Group Name"

Le système vous demandera de spécifier le paramètre GroupScope, puis créera un nouveau groupe.
Ce groupe sera assorti de valeurs par défaut, telles que :

Il sera créé dans le conteneur LDAP par défaut appelé « Utilisateurs ».

Ce groupe sera du type « Sécurité ».

Les champs Membres, Membre de, Description, E-mail et Notes seront tous vides.

Créons un groupe de sécurité appelé « Qualité » dans l’unité d’organisation « Production » (-Path), il devra
être un groupe de sécurité (-GroupCategory) et il devra être global (-GroupScope).

New-ADGroup "Quality" -Path "OU=Production,DC=enterprise,dc=com" -GroupCategory


Security -GroupScope Global -PassThru –Verbose

Si vous voulez créer un groupe de distribution universel, changez simplement le paramètre –GroupCategory en « 
Distribution » et le paramètre –GroupScope en « Universel ». Vous pouvez également modifier le chemin LDAP en
modifiant le paramètre –Path. Pour supprimer un groupe AD, utilisez le cmdlet Remove-ADGroup. Pour cela, le script
le plus simple ressemblera à ceci :

Remove-ADGroup -Identity Quality

Vous serez invité à confirmer la suppression du groupe.

23
2.8 Ajouter des utilisateurs et des ordinateurs à un groupe

Vous pouvez ajouter des utilisateurs à un groupe AD en utilisant le cmdlet Add-AdGroupMember.


Par exemple, si vous souhaitez ajouter deux utilisateurs, B.Jackson et E.Franklin, au groupe « Qualité », voici
à quoi ressemblera le script :

Add-AdGroupMember -Identity Quality -Members B.Jackson, E.Franklin

Après avoir ajouté des utilisateurs à un groupe de sécurité, vous pouvez exécuter ce script pour vérifier qu’ils
sont bien répertoriés comme membres :

Get-ADGroupMember -Identity Quality

Si vous devez ajouter des utilisateurs à un autre groupe de sécurité ou de distribution, tel que « Admins du
domaine », indiquez « Admins du domaine » comme valeur pour le paramètre –Identity. Si vous souhaitez
qu’un groupe soit membre d’un autre groupe, spécifiez un nom de groupe comme valeur pour le paramètre
–Members. Le même principe s’applique aux comptes d’ordinateur, mais vous devrez ajouter un signe dollar
($) à la fin du nom du compte d’ordinateur. Par exemple, pour ajouter l’ordinateur « WKS043 » à un groupe,
spécifiez « WKS043$ » comme valeur pour le paramètre –Member :

Add-AdGroupMember -Identity Quality -Members WKS043$

Pour ajouter un utilisateur à plusieurs groupes à la fois, exécutez le script suivant.

"Managers","Quality" | Add-ADGroupMember -Members `


(Read-Host -Prompt "Entrez le nom d’utilisateur")

Vous serez invité à saisir le nom d’utilisateur.

Si vous souhaitez ajouter un grand nombre d’utilisateurs à un groupe, vous pouvez les spécifier dans un
fichier CSV et ensuite importer ce fichier. Remarquez que la liste des noms d’utilisateur dans le fichier CSV doit
contenir les SamAccountNames dans la colonne « users » (utilisateurs), comme indiqué ci-dessous :

24
Pour ajouter des utilisateurs à un groupe à partir d’un fichier CSV, exécutez le script PowerShell suivant :

Import-CSV C:\scripts\users.csv -Header users | ForEach-Object {Add-AdGroupMember


-Identity "Quality" -members $_.users}

Pour copier tous les membres d’un groupe dans un autre groupe, exécutez le script suivant :

Get-ADGroupMember “Quality” | Get-ADUser | ForEach-Object {Add-ADGroupMember


-Identity “QualityControl” -Members $_}

2.9 Supprimer des utilisateurs et des ordinateurs d’un groupe

Pour supprimer un utilisateur d’un groupe, utilisez le cmdlet Remove-ADGroupMember.

Remove-ADGroupMember -Identity Quality -Members J.Robinson

Pour supprimer un compte d’ordinateur d’un groupe, spécifiez le nom de l’ordinateur terminé par le signe
dollar ($) pour la valeur du paramètre -Members.

Une méthode facile pour supprimer plusieurs utilisateurs d’un groupe AD est de créer un fichier CSV contenant
la liste des noms d’utilisateur, puis de supprimer ces utilisateurs de l’objet du groupe à l’aide de ce script :

Import-CSV C:\scripts\users.csv -Header users | ForEach-Object {Add-AdGroupMember


-Identity "Quality" -members $_.users}

Pour supprimer un utilisateur de tous les groupes, exécutez le script suivant :

Get-ADUser -Identity E.Franklin -Properties MemberOf | ForEach-Object {


$_.MemberOf | Remove-ADGroupMember -Members $_.DistinguishedName -Confirm:$false
}

25
Remarquez que l’utilisateur perdra toute appartenance à un groupe, à l’exception de «  Utilisateurs du
domaine », qui peut être supprimée manuellement si nécessaire.

N’oubliez pas d’activer la fonction Corbeille Active Directory (en anglais) pour pouvoir facilement annuler
vos modifications en cas de problème.

2.10 Déplacer des utilisateurs et des ordinateurs vers une nouvelle unité
d’organisation

Le cmdlet PowerShell Move-ADObject déplace un objet ou ensemble d’objets (par exemple un utilisateur,
un ordinateur, un groupe ou une OU) vers une OU spécifiée. Le paramètre -Identity spécifie l’objet ou le
conteneur Active Directory à déplacer. Remarque : vous devez saisir le chemin LDAP complet ou le SID de
l’objet ; vous ne pouvez pas utiliser son nom de compte SAM. Voici comment déplacer l’utilisateur « John
Brown » vers l’OU « Districts » :

Move-ADObject -Identity "CN=John Brown,CN=Users,DC=enterprise,DC=com" -TargetPath


"OU=Districts,OU=IT,DC=Enterprise,DC=Com"

Utilisez la même syntaxe pour déplacer des objets ordinateurs. La commande suivante déplace l’ordinateur
« R07GF » vers le conteneur « Computers » :

Move-ADObject -Identity "CN=R07GF,OU=CEO,DC=enterprise,DC=com" -TargetPath


"CN=Computers,DC=Enterprise,DC=Com"

Si vous avez une liste prédéfinie d’objets à déplacer, vous pouvez l’enregistrer dans un fichier CSV puis
importer ce fichier dans Active Directory. La liste CSV doit se présenter au format suivant :

26
Utilisez ce script PowerShell pour déplacer les comptes d’utilisateur AD répertoriés dans un fichier CSV :

# Spécifier l’OU cible. C’est là que les utilisateurs seront déplacés.


$TargetOU = "OU=Districts,OU=IT,DC=enterprise,DC=com"
# Spécifier le chemin du fichier CSV. Importez le fichier CSV et
attribuez-le à une variable.
$Imported_csv = Import-Csv -Path "C:\temp\MoveList.csv"

$Imported_csv | ForEach-Object {
# Récupérer le nom de domaine de l’utilisateur.
$UserDN = (Get-ADUser -Identity $_.Name).distinguishedName
# Déplacer l’utilisateur vers l’OU cible.
Move-ADObject -Identity $UserDN -TargetPath $TargetOU
}

Pour déplacer des comptes d’ordinateur AD répertoriés dans un fichier texte, utilisez le script PowerShell
suivant :

# Spécifier le chemin du fichier texte avec les noms des comptes


d’ordinateur.
$computers = Get-Content C:\Temp\Computers.txt

# Spécifier le chemin de l’OU où les ordinateurs seront déplacés.


$TargetOU = "OU=Districts,OU=IT,DC=enterprise,DC=com" ForEach(
$computer in $computers){
Get-ADComputer $computer |
Move-ADObject -TargetPath $TargetOU
}

27
3. Top 10 des tâches de gestion du système
de fichiers avec PowerShell
Chaque jour, les administrateurs système doivent effectuer une série d’opérations standard sur les
nombreux fichiers et dossiers de leurs serveurs Windows, depuis la gestion des données des utilisateurs
dans les ressources partagées jusqu’à la maintenance adéquate des sauvegardes. À l’aide des informations
suivantes, vous pouvez automatiser un grand nombre de ces tâches et gagner du temps pour des missions
plus importantes.

Dans cette partie, nous allons expliquer comment automatiser la gestion des fichiers et des tâches de
gestion des autorisations NTFS à l’aide de scripts PowerShell.

3.1 Consulter des objets dans un annuaire

Pour consulter le contenu d’un répertoire dans un serveur de fichiers Windows, utilisez le cmdlet
Get-ChildItem.

Pour afficher tous les fichiers cachés, ajoutez le paramètre -Force. La commande ci-dessous affiche tous les
objets racines du dossier « Shared » (Partagé).

Get-ChildItem -Force \\fs\Shared

Si vous souhaitez également consulter tous les sous-dossiers et leur contenu, ajoutez le paramètre -Recurse :

Get-ChildItem -Force \\fs\Shared -Recurse

Pour filtrer les résultats, ajoutez les paramètres Filter (Filtrer), Exclude (Exclure), Include (Inclure) et Path
(Chemin) au cmdlet Get-ChildItem. Pour un filtrage avancé des objets, utilisez le cmdlet Where-Object. Le
script ci-dessous recherche tous les fichiers exécutables dans le dossier IT, qui ont été modifiés après le 1er 
avril 2018.

Get-ChildItem -Path \\fs\Shared\IT -Recurse -Include *.exe | Where-Object -FilterScript


{($_.LastWriteTime -gt '2018-04-01')}

28
3.2 Créer des fichiers et des dossiers

Pour créer de nouveaux objets avec Windows PowerShell, vous pouvez utiliser le cmdlet New-Item et spécifier
le type d’élément que vous souhaitez créer, par exemple un répertoire, un fichier ou une clé de registre.

Cette commande, par exemple, crée un dossier :

New-Item -Path '\\fs\Shared\NewFolder' -ItemType Directory

Et celle-ci crée un fichier vide :

New-Item -Path '\\fs\Shared\NewFolder\newfile.txt' -ItemType File

Si vous devez créer un fichier et y écrire des données, deux méthodes intégrées au moins vous le
permettent.

La première consiste à utiliser le cmdlet Out-File :

$text = 'Hello World!' | Out-File $text -FilePath C:\data\text.txt

Pour écraser un fichier existant, utilisez le paramètre switch –Force.

Vous pouvez également créer des fichiers à l’aide du cmdlet Export-Csv, qui exporte le résultat dans un
fichier csv pouvant être ouvert dans Excel :

Get-ADuser -Filter * | Export-Csv -Path C:\data\ADusers.csv

29
3.3 Supprimer des fichiers et des dossiers

Pour supprimer des objets, utilisez le cmdlet Remove-Item. Si l’objet n’est pas vide, vous serez invité à
confirmer la suppression. Voici comment supprimer le dossier « IT », tous ses sous-dossiers et les fichiers
qu’il contient :

Remove-Item -Path '\\fs\shared\it\'


Confirm
The item at \\pdc\shared\it has children and the Recurse parameter was not specified. If you
continue, all children will be removed with the item. Are you sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):

Si vous avez déjà vérifié que tous les objets d’un dossier doivent être supprimés, vous pouvez utiliser le
switch -Recurse pour sauter l’étape de confirmation :

Remove-Item -Path '\\fs\shared\it\' -Recurse

Vous devez parfois nettoyer les vieux fichiers d’un répertoire particulier. Voici comment accomplir cette tâche :

$Folder = "C:\Backups"

#supprimer les fichiers plus anciens que 30 jours


Get-ChildItem $Folder -Recurse -Force -ea 0 |
? {!$_.PsIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
ForEach-Object {
$_ | del -Force
$_.FullName | Out-File C:\log\deletedbackups.txt -Append
}

#supprimer les dossiers et sous-dossiers vides s’il y en a Get-ChildItem


$Folder -Recurse -Force -ea 0 |
? {$_.PsIsContainer -eq $True} |
? {$_.getfiles().count -eq 0} |
ForEach-Object {
$_ | del -Force
$_.FullName | Out-File C:\log\deletedbackups.txt -Append
}

30
Voici comment vérifier qu’un fichier existe, et le supprimer si tel est le cas :

$FileName = ’C:\data\log.txt’
If (Test-Path $FileName){
Remove-Item $FileName
}

Pour supprimer des fichiers sur des ordinateurs distants, vous devez disposer des autorisations de
sécurité permettant d’y accéder. Veillez à utiliser les chemins d’accès UNC, pour que le script
détermine correctement l’emplacement des fichiers.

$filelist = @(" \c$\Temp", "\c$\Backups") #variable de suppression des fichiers et du dossier


$computerlist = Get-Content C:\data\pc.txt #obtenir la liste des ordinateurs distants foreach
($computer in $computerlist){
foreach ($file in $filelist){
$filepath= Join-Path "\\$computer\" "$filelist" #générer les chemins d’accès unc vers les fichiers
et dossiers If (Test-Path $filepath)
{
Remove-Item $filepath -force -recurse -ErrorAction Continue}}}

3.4 Copier des fichiers et des dossiers

Le cmdlet Copy-Item vous permet de copier des objets d’un chemin d’accès à un autre. La commande
suivante crée une sauvegarde en copiant le fichier users.xlsx depuis un ordinateur distant (fs) et en
l’enregistrant dans un autre (fs2) via le réseau :

Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx

Si le fichier cible existe déjà, la tentative de copie échouera.


Pour écraser le fichier existant, même s’il est en lecture seule, utilisez le paramètre -Force.

Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx -Force

Si vous copiez des fichiers vers ou depuis des ordinateurs distants, veillez à utiliser les chemins d’accès UNC.
Utilisez par exemple cette commande pour copier des fichiers d’un serveur de fichiers distant dans le
répertoire local C : 

Copy-Item \\fs\c$\temp -Recurse C:\data\

31
Pour copier des fichiers depuis votre répertoire local vers le dossier distant, il suffit d’inverser les
emplacements source et destination :

Copy-Item C:\data\ -Recurse \\fs\c$\temp

Vous pouvez également copier des fichiers d’un serveur distant vers un autre. Le script suivant copie de
manière récursive le dossier \\fs\Shared\temp vers \\fs\Shared\test:

Copy-Item \\fs\Shared\temp -Recurse \\fs\Shared\test

Pour ne copier que certains fichiers depuis la source vers la destination, utilisez le paramètre -Filter.
Par exemple, la commande suivante ne copie que les fichiers txt d’un dossier à l’autre :

Copy-Item -Filter *.txt -Path \\fs\Shared\it -Recurse -Destination \\fs2\Shared\text

Vous pouvez également exécuter les commandes XCOPY et ROBOCOPYpour copier des fichiers, ou utiliser
des objets COM, comme dans l’exemple ci-dessous :

(New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')

3.5 Déplacer des fichiers et des annuaires

Le cmdlet Move-Item déplace un élément avec ses propriétés, son contenu et ses éléments enfants, d’un
emplacement à un autre.

Il peut également déplacer un fichier ou un sous-répertoire depuis un répertoire vers un autre emplacement.
La commande suivante déplace un fichier de sauvegarde spécifique d’un emplacement à un autre :

Move-Item -Path \\fs\Shared\Backups\1.bak -Destination \\fs2\Backups\archive\1.bak

Ce script déplace tout le dossier Backups (Sauvegardes) et son contenu vers un autre emplacement :

Move-Item -Path \\fs\Shared\Backups -Destination \\fs2\Backups\archive

Le répertoire Backups et tous ses fichiers et sous-dossiers apparaîtront alors dans le répertoire archive.

32
3.6 Renommer des fichiers

Le cmdlet Rename-Item vous permet de modifier le nom d’un objet en ne touchant pas à son contenu. Il
n’est pas possible de déplacer des éléments avec la commande Rename-Item. Pour cela, vous devez utiliser
le cmdlet Move-Item, tel qu’expliqué précédemment.

La commande suivante renomme un fichier :

Rename-Item -Path "\\fs\Shared\temp.txt" -NewName "new_temp.txt"

Pour renommer plusieurs fichiers simultanément, utilisez un script comme celui-ci :

$files = Get-ChildItem -Path C:\Temp #créer une liste de fichiers


foreach ($file in $files)
{
$newFileName=$file.Name.Replace("A","B") #remplacer "A" par "B"
Rename-Item $file $newFileName
}

3.7 Définir des autorisations pour les fichiers et dossiers

Pour pouvoir mettre en œuvre un modèle de moindre privilège (une bonne pratique pour la sécurité
système), les spécialistes de la sécurité informatique et les administrateurs système configurent des listes de
contrôle d’accès (ACL) NTFS en ajoutant des entrées de contrôle d’accès (ACE) sur les serveurs de fichiers
NTFS. Il existe des autorisations NTFS élémentaires et avancées. Pour chaque autorisation, vous pouvez
choisir « Autoriser » ou « Refuser ». Vous pouvez trouver toutes ces autorisations d’utilisateur en exécutant
le script PowerShell suivant :

[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])

Si vous ne maîtrisez pas bien la gestion des autorisations NTFS, consultez ce guide des bonnes
pratiques de gestion des autorisations NTFS (en anglais).

Le cmdlet PowerShell set-acl sert à modifier le descripteur de sécurité d’un élément spécifié, par exemple un
fichier, un dossier ou une clé de registre ; en d’autres termes, il sert à modifier les autorisations des fichiers
ou dossiers. Le script suivant règle l’autorisation «  Contrôle total  » sur «  Autoriser  » pour l’utilisateur « 
ENTERPRISE\T.Simpson » sur le dossier « Sales » :

33
$acl = Get-Acl \\fs1\shared\sales
$AccessRule = New-Object
System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\T.Simpson","FullControl","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl \\fs1\shared\sales

Remarquez que le paramètre SetAccessRule écrase complètement les autorisations d’un utilisateur ou d’un
groupe, vous pouvez donc modifier les autorisations des dossiers à l’aide de ce paramètre. Si vous souhaitez
seulement ajouter des autorisations, utilisez plutôt le paramètre AddAccessRule. Par exemple, le script
suivant ajoute l’autorisation « FullControl » au compte d’utilisateur « ENTERPRISE\J.Carter » pour le dossier «
Accounting » (Comptabilité) :

$acl = Get-Acl \\fs1\shared\Accounting


$AccessRule = New-Object
System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\J.Carter","FullControl","Allow")
$acl.AddAccessRule($AccessRule)
$acl | Set-Acl \\fs1\shared\Accounting

Voici les autres autorisations que vous pouvez attribuer aux utilisateurs ou aux groupes de sécurité :

Droits d’accès Nom du droit d’accès dans PowerShell

Contrôle total FullControl

Parcours du dossier/Exécution du fichier ExecuteFile

Liste des dossiers/Lecture de données ReadData

Lire les attributs ReadAttributes

Lecture des attributs étendus ReadExtendedAttributes

Création de fichiers/Écriture de données CreateFiles

Création de dossiers/Ajout de données AppendData

Écrire les attributs WriteAttributes

Écriture des attributs étendus WriteExtendedAttributes

Supprimer les sous-dossiers et les fichiers DeleteSubdirectoriesAndFiles

Suppression Delete

Autorisations de lecture ReadPermissions

Modifier les autorisations ChangePermissions

Appropriation TakeOwnership

34
Des ensembles de droits d’accès élémentaires peuvent également être appliqués :

Ensemble de droits d’accès Droits inclus dans l’ensemble Nom de l’ensemble dans

Lecture Liste des dossiers/Lecture de données Read

Lecture des attributs

Lecture des attributs étendus

Autorisations de lecture

Écriture Création de fichiers/Écriture de données Write

Création de dossiers/Ajout d’attributs

Écriture de données

Écriture des attributs étendus

Lecture et exécution Parcours du dossier/Exécution du fichier ReadAndExecute

Liste des dossiers/Lecture de données

Lire les attributs

Lecture des attributs étendus

Autorisations de lecture

Modification Parcours du dossier/Exécution du fichier Modify

Liste des dossiers/Lecture de données

Lire les attributs

Lecture des attributs étendus

Création de fichiers/Écriture de données

Création de dossiers/Ajout de données

Écrire les attributs

Écriture des attributs étendus

Suppression

Autorisations de lecture

35
Pour pouvoir copier les autorisations, l’utilisateur doit être propriétaire des dossiers source et cible.
La commande suivante copie les autorisations du dossier « Accounting » (Comptabilité) dans le dossier
« Sales » (Ventes) :

get-acl \\fs1\shared\accounting | Set-Acl \\fs1\shared\sales

Si vous souhaitez obtenir une liste des autorisations NTFS en passant par PowerShell, vous pouvez
suivre ces instructions simples pour exporter les autorisations NTFS vers un fichier CSV (en anglais).

3.8 Supprimer des autorisations d’utilisateur

Pour supprimer une autorisation, utilisez le paramètre RemoveAccessRule. Supprimons l’autorisation


« Contrôle total » de T.Simpson pour le dossier « Sales » :

$acl = Get-Acl \\fs1\shared\sales


$AccessRule = New-Object
System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\T.Simpson","FullControl","Allow")
$acl.RemoveAccessRule($AccessRule)
$acl | Set-Acl \\fs1\shared\sales

Notez que RemoveAccessRule ne supprime que des autorisations spécifiques. Pour effacer complètement
les autorisations de T.Simpson dans le dossier « Sales », utilisez la commande PurgeAccessRules :

$acl = Get-Acl \\fs1\shared\sales


$usersid = New-Object System.Security.Principal.Ntaccount ("ENTERPRISE\T.Simpson")
$acl.PurgeAccessRules($usersid)
$acl | Set-Acl \\fs1\shared\sales

Remarquez que PurgeAccessRules ne fonctionne pas avec un nom d’utilisateur en chaîne, elle fonctionne
uniquement avec des SID. Pour cette raison, nous avons utilisé la classe « Ntaccount » pour convertir le nom
de compte d’utilisateur d’une chaîne en un SID. Remarquez également que PurgeAccessRules ne fonctionne
qu’avec des autorisations explicites ; elle ne purge pas les droits hérités.

36
3.9 Activer et désactiver les héritages d’autorisations

Les autorisations NTFS peuvent être explicites ou héritées. Les autorisations explicites sont configurées
individuellement, tandis que les autorisations héritées sont issues du dossier parent. La hiérarchie des
autorisations est la suivante :

Refus explicite

Autorisation explicite

Refus hérité

Autorisation héritée

Pour gérer l’héritage, nous utilisons la méthode SetAccessRuleProtection. Celle-ci a deux paramètres :

Le premier paramètre permet de bloquer l’héritage du dossier parent. Il possède deux états : « $true »
et « $false ».

Le deuxième paramètre détermine si les autorisations héritées courantes doivent être conservées ou
supprimées.
Il possède les deux mêmes états : « $true » et « $false ».

Désactivons l’héritage pour le dossier « Sales » (Ventes) et supprimons également toutes les autorisations
héritées :

$acl = Get-Acl \\fs1\shared\sales


$acl.SetAccessRuleProtection($true,$false)
$acl | Set-Acl \\fs1\shared\sales

Toutes les autorisations héritées ont été supprimées ; seules les autorisations d’accès explicitement ajoutées
sont conservées. Annulons cette modification et réactivons l’héritage pour le dossier « Sales » :

$acl = Get-Acl \\fs1\shared\sales


$acl.SetAccessRuleProtection($false,$true)
$acl | Set-Acl \\fs1\shared\sales

37
3.10 Modifier la propriété des fichiers et dossiers

Pour définir le propriétaire d’un dossier, vous devez exécuter la méthode SetOwner.

Faisons de « ENTERPRISE\J.Carter » le propriétaire du dossier « Sales » :

$acl = Get-Acl \\fs1\shared\sales


$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISE\J.Carter")
$acl.SetOwner($object)
$acl | Set-Acl \\fs1\shared\sales

Remarquez que nous avons à nouveau utilisé la classe Ntaccount pour convertir le nom de compte
d’utilisateur de chaîne en SID.

La méthode SetOwner ne permet pas de changer le propriétaire d’un compte ; le compte doit disposer des
droits « Appropriation », « Lecture » et « Modifier les autorisations ».

38
4. Automatiser les scripts PowerShell
Voyons maintenant comment créer des tâches planifiées à l’aide de scripts PowerShell et du planificateur de
tâches de Microsoft Windows.

4.1 Créer des tâches planifiées avec des scripts PowerShell

Supposons que chaque jour à 10 heures, nous souhaitons exécuter un script PowerShell qui surveille les
modifications d’appartenance aux groupes dans un site Active Directory.

Dans Windows Powershell 2.0 (Windows 7, Windows Server 2008 R2), pour créer une tâche planifiée, vous
devez utiliser le module TaskScheduler. Installez le module en exécutant la commande Import-Module
TaskScheduler et utilisez le script suivant pour créer une tâche qui exécutera quotidiennement à 10 heures
le script PowerShell GroupMembershipChanges.ps1 :

Import-Module TaskScheduler $task = New-Task


$task.Settings.Hidden = $true
Add-TaskAction -Task $task -Path C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
–Arguments “-File C:\Scripts\GroupMembershipChanges.ps1”
Add-TaskTrigger -Task $task -Daily -At “10:00”
Register-ScheduledJob –Name ”Monitor Group Management” -Task $task

Windows PowerShell 3.0 et 4.0 (Windows Server 2012 R2 et versions ultérieures) n’incluent pas le module
TaskScheduler, ce script ne fonctionnera donc pas. À la place, PowerShell 3.0 et 4.0 incluent de nouveaux
cmdlets pour créer des tâches planifiées, New-ScheduledTaskTrigger et Register-ScheduledTask, qui
rendent la création d’une tâche planifiée beaucoup plus facile et pratique. Nous allons donc créer une tâche
qui exécutera notre script quotidiennement à 10 heures avec le compte système (SYSTEM), qui dispose de
privilèges élevés.

$Trigger= New-ScheduledTaskTrigger -At 10:00am –Daily # Spécifier les paramètres du déclencheur


$User= "NT AUTHORITY\SYSTEM" # Spécifier le compte qui exécute le script
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript.ps1"
# Spécifier le programme à exécuter et ses paramètres
Register-ScheduledTask -TaskName "MonitorGroupMembership" -Trigger $Trigger -User $User
-Action $Action -RunLevel Highest –Force # Spécifier le nom de la tâche

39
Voici d’autres options de déclenchement qui peuvent être utiles pour créer de nouvelles tâches :

-AtStartup — Déclenche votre tâche au démarrage de Windows.

-AtLogon — Déclenche votre tâche lorsque l’utilisateur ouvre une session.

-Once — Déclenche votre tâche une fois. Vous pouvez définir un intervalle de répétition à l’aide du
paramètre -RepetitionInterval.
-Weekly — Déclenche votre tâche une fois par semaine.

Notez qu’il n’est pas possible de déclencher l’exécution « sur un événement » en utilisant ces cmdlets ; les
scripts PowerShell avec des déclencheurs «  sur un événement  » sont beaucoup plus compliqués. Il est
cependant possible de le faire avec le planificateur de tâches, ce qui constitue un réel inconvénient de
PowerShell par rapport au planificateur de tâches.

4.2 Exécuter des scripts PowerShell avec le planificateur de tâches

Le planificateur de tâches vous permet de lancer automatiquement un programme ou un script PowerShell


à un moment précis ou lorsque certaines conditions sont satisfaites. Il permet également de programmer
l’envoi d’e-mails et même l’affichage de certains messages.

Pour créer une tâche, ouvrez le planificateur de tâches en appuyant sur les touches Windows+R puis en
tapant taskschd.msc dans la fenêtre qui s’ouvre. Ensuite, procédez comme suit :

1. Cliquez sur Créer une tâche et entrez un nom et une description pour la nouvelle tâche. Pour exécuter le
programme avec des privilèges d’administrateur, cochez la case Exécuter avec les privilèges les plus
élevés. Dans notre exemple, nous allons affecter un compte de service à l’exécution de la tâche, et exécuter
celle-ci que l’utilisateur soit connecté ou non.

40
2. Sélectionnez l’onglet Déclencheurs et cliquez sur le bouton Nouveau.... Vous pouvez ici spécifier les
conditions qui déclenchent l’exécution de la tâche. Vous pouvez par exemple choisir une exécution à une
date/heure donnée, à l’ouverture de session, en veille, au démarrage ou lorsqu’un événement particulier se
produit. Nous souhaitons que notre tâche soit déclenchée par toute nouvelle installation de logiciel, nous
choisissons donc Sur un événement dans le menu déroulant et sélectionnons Application dans le menu
déroulant du journal. Laissez le paramètre Source vide et entrez «  11707  » comme ID d’événement.
Cliquez sur OK pour enregistrer les modifications.

41
3. Ouvrez l’onglet Actions et cliquez sur Nouveau.... Ici, vous pouvez spécifier les actions à exécuter lorsque
les conditions de déclenchement sont remplies. Par exemple, vous pouvez envoyer un e-mail ou afficher un
message. Dans notre cas, nous voulons lancer un programme. Vous pouvez trouver le script ici ; il enverra
une alerte avec les détails de l’événement à propos du logiciel installé.

Pour planifier le script PowerShell, spécifiez les paramètres suivants :

Action — Lancer un programme

Program\script — powershell

Add arguments (optional) — -Fichier [Spécifiez ici le chemin d’accès au script]

Cliquez sur OK pour enregistrer les modifications.

42
4. L’onglet Conditions vous permet de spécifier les conditions qui, avec le déclencheur, détermineront si la
tâche doit être exécutée. Dans notre cas, nous laissons les paramètres par défaut dans cet onglet.

5. Vous pouvez définir des paramètres supplémentaires pour votre tâche planifiée dans l’onglet Paramètres.
Dans notre exemple, nous les laissons inchangés.

43
6. Une fois la tâche programmée, le système va vous demander le mot de passe du compte de service.
Remarquez que ce compte doit disposer du droit « Se connecter en tant que traitement par lot ». Entrez le
mot de passe et cliquez sur OK pour enregistrer la tâche.

7. Pour que le planificateur de tâches fonctionne correctement, le service planificateur de travaux doit être
configuré pour démarrer automatiquement. Exécutez Services.msc. Dans la liste des services, trouvez le
planificateur de tâches et double-cliquez dessus. Dans l’onglet Général, choisissez le type de démarrage « 
Automatique » et cliquez sur OK pour enregistrer votre modification.

Désormais, chaque fois qu’un nouveau logiciel sera installé sur votre Microsoft Windows Server, vous serez
averti par e-mail de l’heure de l’installation, du nom du logiciel et de l’ID utilisateur (SID) de la personne qui
l’a installé.

Pour modifier une tâche existante, cliquez avec le bouton droit de la souris dans la liste, sélectionnez
Propriétés, modifiez les paramètres requis et cliquez sur OK. Pour supprimer une tâche planifiée, cliquez
avec le bouton droit de la souris, sélectionnez Supprimer et confirmez l’action.

44
Final Word
Résumons rapidement les points clés de ce didacticiel Windows PowerShell. Vous connaissez à présent les
bases de la rédaction de scripts PowerShell, comment exécuter les tâches les plus courantes de gestion d’Active
Directory et des systèmes de fichiers à l’aide de PowerShell, et comment planifier les scripts PowerShell. Vous
pouvez également consulter les scripts PowerShell suivants, qui permettent aux professionnels de
l’informatique d’effectuer des tâches spécifiques :

Comment détecter qui a supprimé un fichier de votre Serveur de Fichiers Windows

Comment trouver les utilisateurs et les ordinateurs désactivés ou inactifs dans AD

Comment surveiller les connexions utilisateur à votre domaine

Comment trouver la source de verrouillage des comptes

Comment localiser les fichiers contenant des données sensibles

Comment rappeler aux utilisateurs de modifier leurs mots de passe avant qu'ils n'expirent

Comment obtenir l’historique des connexions des utilisateurs

Vous pouvez aussi approfondir vos connaissances sur PowerShell en consultant les ressources suivantes :

Blog Netwrix : PowerShell

Guides pratiques Netwrix

45
Simplifiez-vous la vie avec
les 7 meilleurs outils gratuits pour
les professionnels de l’informatique
Sélectionnés et recommandés en toute indépendance par des experts du secteur, ces
outils s’avèrent indispensables pour les professionnels de l’informatique. Auditez Active
Directory et vos serveurs de fichiers, remédiez aux verrouillages de comptes, trouvez les
comptes périmés et plus encore, tout cela gratuitement.

Netwrix Auditor Free Community Edition Télécharger

Version gratuite Version gratuite Version gratuite


de Netwrix Auditor de Netwrix Auditor de Netwrix Auditor
for Active Directory for Windows File Servers for Windows Server

Télécharger Télécharger Télécharger

Netwrix Account Netwrix Effective Netwrix Inactive


Lockout Examiner Permissions Reporting Tool User Tracker

Télécharger Télécharger Télécharger


À propos de Netwrix
Netwrix Corporation est un éditeur de logiciels qui se consacre exclusivement à fournir aux équipes de
sécurité et d’exploitation informatique une visibilité totale sur le comportement des utilisateurs, les
configurations des systèmes et la sensibilité des données dans les infrastructures informatiques hybrides,
afin de protéger les données quel que soit leur emplacement. Plus de 9 000 organisations du monde entier
font confiance à Netwrix pour détecter et atténuer de manière proactive les menaces envers la sécurité des
données, réussir plus facilement les audits de conformité et à moindre coût, et augmenter la productivité de
leurs équipes informatiques.

Fondée en 2006, Netwrix a obtenu plus de 140 distinctions sectorielles et a été sélectionnée dans les listes
Inc. 5000 et Deloitte Technology Fast 500, qui recensent les entreprises à la croissance la plus rapide aux
États-Unis.

Pour plus d’information sur Netwrix, visitez www.netwrix.fr.

Siège social :
300 Spectrum Center Drive, Suite 200, Irvine, CA 92618, États-Unis
Tél : +33 9 75 18 11 19 N° gratuit : 1-888-638-9749 EMEA : +44 (0) 203-588-3023 netwrix.com/social

Vous aimerez peut-être aussi