63 0 3MB
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 PowerShell 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’automatisation 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 — [email protected] 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 "[email protected]" -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 "[email protected]" ` -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
Version gratuite de Netwrix Auditor for Active Directory Télécharger
Netwrix Account Lockout Examiner Télécharger
Version gratuite de Netwrix Auditor for Windows File Servers Télécharger
Netwrix Effective Permissions Reporting Tool Télécharger
Télécharger
Version gratuite de Netwrix Auditor for Windows Server Télécharger
Netwrix Inactive User Tracker 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