Gérer les autorisations NTFS en PowerShell avec NTFSSecurity
Sommaire
I. Présentation
A ce jour, la gestion des ACL sur un système de fichiers NTFS, en PowerShell, par l'intermédiaire des commandlets natives ce n'est clairement pas un cadeau ! C'est pourquoi aujourd'hui je me tourne vers l'excellent module "NTFSSecurity" qui offre une multitude de commandlets destinées à la gestion de la sécurité NTFS.
Pour ma part, j'utilise aussi depuis plusieurs années maintenant l'outil en ligne de commande "SetACL" dont l'auteur est Helge Klein, mais la syntaxe n'est pas toujours évidente... Disons qu'il faut avoir la doc sous le coude quand on se replonge dedans.
En utilisant ce module PowerShell, on bénéficie de l'auto-complétion et de la logique habituelle dans l'utilisation des commandlets.
II. Le module NTFSSecurity
Pour commencer ce tutoriel, on va installer le module. Pour réaliser cette opération, ouvrez une console PS et exécutez cette commande :
Install-Module NTFSSecurity
Comme ceci :
Dès lors que l'installation est finie, profitons-en pour lister les commandlets contenus dans ce module :
PS C:\Partage> Get-Command -Module NTFSSecurity CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Add-NTFSAccess 4.2.3 NTFSSecurity Cmdlet Add-NTFSAudit 4.2.3 NTFSSecurity Cmdlet Clear-NTFSAccess 4.2.3 NTFSSecurity Cmdlet Clear-NTFSAudit 4.2.3 NTFSSecurity Cmdlet Copy-Item2 4.2.3 NTFSSecurity Cmdlet Disable-NTFSAccessInheritance 4.2.3 NTFSSecurity Cmdlet Disable-NTFSAuditInheritance 4.2.3 NTFSSecurity Cmdlet Disable-Privileges 4.2.3 NTFSSecurity Cmdlet Enable-NTFSAccessInheritance 4.2.3 NTFSSecurity Cmdlet Enable-NTFSAuditInheritance 4.2.3 NTFSSecurity Cmdlet Enable-Privileges 4.2.3 NTFSSecurity Cmdlet Get-ChildItem2 4.2.3 NTFSSecurity Cmdlet Get-DiskSpace 4.2.3 NTFSSecurity Cmdlet Get-FileHash2 4.2.3 NTFSSecurity Cmdlet Get-Item2 4.2.3 NTFSSecurity Cmdlet Get-NTFSAccess 4.2.3 NTFSSecurity Cmdlet Get-NTFSAudit 4.2.3 NTFSSecurity Cmdlet Get-NTFSEffectiveAccess 4.2.3 NTFSSecurity Cmdlet Get-NTFSHardLink 4.2.3 NTFSSecurity Cmdlet Get-NTFSInheritance 4.2.3 NTFSSecurity Cmdlet Get-NTFSOrphanedAccess 4.2.3 NTFSSecurity Cmdlet Get-NTFSOrphanedAudit 4.2.3 NTFSSecurity Cmdlet Get-NTFSOwner 4.2.3 NTFSSecurity Cmdlet Get-NTFSSecurityDescriptor 4.2.3 NTFSSecurity Cmdlet Get-NTFSSimpleAccess 4.2.3 NTFSSecurity Cmdlet Get-Privileges 4.2.3 NTFSSecurity Cmdlet Move-Item2 4.2.3 NTFSSecurity Cmdlet New-NTFSHardLink 4.2.3 NTFSSecurity Cmdlet New-NTFSSymbolicLink 4.2.3 NTFSSecurity Cmdlet Remove-Item2 4.2.3 NTFSSecurity Cmdlet Remove-NTFSAccess 4.2.3 NTFSSecurity Cmdlet Remove-NTFSAudit 4.2.3 NTFSSecurity Cmdlet Set-NTFSInheritance 4.2.3 NTFSSecurity Cmdlet Set-NTFSOwner 4.2.3 NTFSSecurity Cmdlet Set-NTFSSecurityDescriptor 4.2.3 NTFSSecurity Cmdlet Test-Path2 4.2.3 NTFSSecurity
Maintenant, nous allons passer à l'utilisation du module NTFSSecurity au travers différents exemples.
Page du module : NTFSSecurity
III. Utilisation de NTFSSecurity
A. Lister les autorisations NTFS d'un répertoire
Tout simplement, nous allons utiliser le commandlet "Get-NTFSAccess" avec le paramètre "Path" qui aura pour valeur le chemin ciblé. Ainsi, nous allons afficher les autorisations NTFS de ce dossier.
Get-NTFSAccess –Path "C:\Partage\Ressources\"
Ce qui donnera
PS C:\Partage> Get-NTFSAccess –Path "C:\Partage\Ressources\" Path: C:\Partage\Ressources (Inheritance enabled) Account Access Rights Applies to Type IsInherited InheritedFrom ------- ------------- ---------- ---- ----------- ------------- AUTORITE NT\Système FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Administrateurs FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs ReadAndExec... ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs AppendData ThisFolderAndSubfolders Allow True C: BUILTIN\Utilisateurs CreateFiles ThisFolderAndSubfolders Allow True C: CREATEUR PROPRIETAIRE GenericAll SubfoldersAndFilesOnly Allow True C:
Si l'on veut une vue plus sympa, il suffit d'exporter dans un tableau, comme ceci :
Get-NTFSAccess –Path "C:\Partage\Ressources\" | Out-GridView
Voilà le travail (en haut le résultat classique, en bas le résultat avec Out-GridView) :
Bien que ce soit une vue classique telle que le propose l'explorateur Windows, il y a sur un même tableau les droits et les héritages, avec un script on pourrait même compléter avec des champs supplémentaires qui viendraient s'ajouter comme colonne de la vue en grille.
Note : On pourrait faire la même chose en ciblant un fichier plutôt qu'un dossier pour afficher ses autorisations NTFS. Le commandlet permet aussi d'afficher les autorisations d'un compte en particulier ou de masquer les autorisations héritées.
B. Lister les autorisations NTFS avec récursivité
On peut lister les autorisations NTFS d'un dossier et de ses sous-dossiers, on s'appuiera sur "Get-ChildItem" qui est natif à PowerShell, puis via le pipeline on va invoquer le Get-NTFSAccess que nous avons utilisés juste avant. Ce qui donnera :
PS C:\Partage> Get-ChildItem -Path "C:\Partage\" -Recurse | Get-NTFSAccess Path: C:\Partage\Public (Inheritance enabled) Account Access Rights Applies to Type IsInherited InheritedFrom ------- ------------- ---------- ---- ----------- ------------- AUTORITE NT\Système FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Administrateurs FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs ReadAndExec... ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs AppendData ThisFolderAndSubfolders Allow True C: BUILTIN\Utilisateurs CreateFiles ThisFolderAndSubfolders Allow True C: CREATEUR PROPRIETAIRE GenericAll SubfoldersAndFilesOnly Allow True C: Path: C:\Partage\Ressources (Inheritance enabled) Account Access Rights Applies to Type IsInherited InheritedFrom ------- ------------- ---------- ---- ----------- ------------- AUTORITE NT\Système FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Administrateurs FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs ReadAndExec... ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs AppendData ThisFolderAndSubfolders Allow True C: BUILTIN\Utilisateurs CreateFiles ThisFolderAndSubfolders Allow True C: CREATEUR PROPRIETAIRE GenericAll SubfoldersAndFilesOnly Allow True C:
Passons à la suite.
C. Ajouter des autorisations NTFS en PowerShell
L'ajout de permission s'effectue par le commandlet "Add-NTFSAccess", auquel viendront s'ajouter le paramètre "Path" pour indiquer le chemin ciblé, "Account" pour indiquer un ou plusieurs comptes ciblés et pour lesquels il faut ajouter les droits, puis le paramètre "AccessRights" qui indique le type de droit à ajouter (lecture, écriture, contrôle total, affichage du dossier, etc...).
Exemple : Ajouter des permissions sur le dossier "C:\Partage\Public\" pour l'utilisateur "utilisateur01" du domaine it-connect.local, afin qu'il puisse avoir les droits de modification :
Add-NTFSAccess –Path "C:\Partage\Public\" –Account "[email protected]" –AccessRights Modify
On peut ensuite vérifier dans les propriétés :
La même chose mais pour deux utilisateurs :
Add-NTFSAccess –Path "C:\Partage\Public\" –Account "[email protected]","[email protected]" –AccessRights Modify
On notera également la possibilité d'utiliser le paramètre "-AccessType" avec la valeur "Deny" pour ajouter des autorisations de refus. Par défaut, ce paramètre est sur "Allow" ce qui implique que même sans le spécifier les droits sont en autorisation.
D. Supprimer des permissions NTFS en PowerShell
Il est tout autant intéressant de pouvoir supprimer des permissions NTFS, notamment pour mettre en place des autorisations spécifiques sur un dossier ou un fichier. La syntaxe restera identique à l'ajout de permission, sauf qu'on utilisera le commandlet "Remove-NTFSAccess", voyez par vous-même :
Remove-NTFSAccess –Path "C:\Partage\Public\" –Account "[email protected]" –AccessRights Modify
En image, voici un exemple vous verrez que ça fonctionne parfaitement :
E. Lister les autorisations effectives
Pour finir sur les exemples, je vais vous montrer comment on peut lister les autorisations effectives sur un élément, de la même manière que l'on pourrait le faire via les propriétés d'un dossier, dans la sécurité avancée.
Ceci est possible avec le commandlet "Get-NTFSEffectiveAccess" qui doit être suivi du chemin ciblé. Si l'on ne précise pas de nom de compte ciblé avec le paramètre "Account", on obtient les permissions effectives pour l'utilisateur qui exécute la commande. Voici un exemple :
PS C:\Users\Administrateur\Desktop> Get-NTFSEffectiveAccess C:\Partage\Personnel\utilisateur01 Path: C:\Partage\Personnel\utilisateur01 (Inheritance disabled) Account Access Rights Applies to Type IsInherited InheritedFrom ------- ------------- ---------- ---- ----------- ------------- FILESERVER-01\Administrateur FullControl ThisFolderOnly Allow False PS C:\Users\Administrateur\Desktop> Get-NTFSEffectiveAccess C:\Partage\Personnel\utilisateur01 -Account "[email protected]" Path: C:\Partage\Personnel\utilisateur01 (Inheritance disabled) Account Access Rights Applies to Type IsInherited InheritedFrom ------- ------------- ---------- ---- ----------- ------------- ITC\utilisateur01 FullControl ThisFolderOnly Allow False
Passons à la dernière partie de ce tutoriel.
IV. Script de gestion des droits sur dossier personnel
Pour la dernière partie de ce tutoriel, je partage avec vous un petit script PowerShell que j'ai écris rapidement afin de pouvoir utiliser au sein d'un même script plusieurs commandlets du module NTFSSecurity.
Ce script génère, pour une liste d'utilisateurs, un répertoire personnel au nom de l'utilisateur sur lequel on positionne ensuite des autorisations NTFS : Suppression de l'héritage des permissions (avec conservation des droits hérités), ajout des autorisations contrôle total pour l'utilisateur concerné, définir comme propriétaire l'utilisateur concerné, et enfin retirer les droits du groupe local "Utilisateurs" sur le dossier personnel de l'utilisateur.
En pratique, voilà le script :
$PersonnelPathRoot = "C:\Partage\Personnel" $UsersList = ("utilisateur01","utilisateur02") foreach($User in $UsersList){ # Creation du dossier personnel New-Item -ItemType Directory -Path "$PersonnelPathRoot\$User" # Desactiver l'heritage tout en copiant les autorisations NTFS héritées Get-Item "$PersonnelPathRoot\$User" | Disable-NTFSAccessInheritance # Ajout des autorisations NTFS Add-NTFSAccess –Path "$PersonnelPathRoot\$User" –Account "[email protected]" –AccessRights FullControl # Modifier le proprietaire sur le dossier Set-NTFSOwner -Path "$PersonnelPathRoot\$User" -Account "[email protected]" # Supprimer des autorisations NTFS Remove-NTFSAccess –Path "$PersonnelPathRoot\$User" –Account "Utilisateurs" -AccessRights FullControl } # foreach($User in $UsersList)
Ce qui donnera le résultat suivant :
très belle article. Merci
ps: qui copie qui? http://www.techrevwz.com/manage-permissions-ntfs-in-powershell-with-ntfssecurity-quick-guide.html
Bonjour,
Merci pour la remontée du lien, c’est lui qui copie… D’ailleurs tu remarqueras très vite que son article est copier-coller et traduit à l’arrache (Google Traduction ?)…. Et je me rends compte qu’il y a d’autres articles copiés :@
Florian
En effet le mec vole ton article et même les captures d’écrans qui restent en français dans son article en anglais. Sans gênes…
erratum dans le commentaire du script non?
le 2e « Ajout des autorisations NTFS » ne serait pas plutôt « Retrait des permissions NTFS sur Utilisateurs » ?
Salut,
Oui effectivement, j’ai corrigé. Merci !
Bonne journée
Florian
Bonjour,
Super partage, excellent, merci pour ton effort Florian ^^.
Sur le site je suppose qu’il doit y avoir beaucoup de tuto en Powershell sur les modules (AD, DHCP, etc…).
Cordialement,
Houssam
Super article !
Juste une question, je souhaiterais retirer les droits de contrôle total à « TOUT LE MONDE » mais je n’arrive pas à sélectionner ce groupe, avez-vous une idée ?
J’ai essayé comme cela sans succès : (j’ai également essayé ‘Tout le monde’, etc.)
Remove-NTFSAccess -Path répertoire -Account « Everyone » -AccessRights None
Hello,
Si j’ai un PC HS (donc je ne connais pas le compte utilisateur). Je veux transformer le HDD interne du PC en HDD externe et pouvoir utiliser les données du dossier « User » sans la contrainte des autorisations NTFS. Et ce quel que soit le PC sur lequel est branché le HDD externe.
Donc, Je mets le HDD en externe, je supprime tous les dossiers sauf le dossier « User » via Linux, mais comment supprimer les autorisations NTFS et ce, pour tous les PC ?
Si je fais cette commande ça marche ?
Remove-NTFSAccess –Path « E:\Users » –Account « Utilisateurs » –AccessRights Modify
Comment faire ?
Edit: Comment faire sans perdre des heures à déplacer les données ?
bonjour
merci pour l article.
2 questions:
-peut-on lister le nom de fichier analyser dans le grid
-peut on exporter le grid car en csv c est moche.
merci
@Olivier
-peut on exporter le grid car en csv c est moche.
No way
peut-on lister le nom de fichier analyser dans le grid
voir exemple ci-dessous
# Variables à customiser
$RootPath = « PAth\vers\le\Reprtoire\AAnalyser »
$ExportPath = « Path\vers\le\repertoire\des\rapports »
$Date = Get-Date -Format « dd-MM-yyyy-hh-mm » # date au format jj-MM-aaaa-hh-mm pour les noms de fichier horodaté
$ExportFileName = « NTFSPerm-au-$Date »
# Permissions NTFS sur RootPath
$Result = Get-NTFSAccess -Path $RootPath | Select-Object -Property * | Format-Table
# Obtention des permissions NTFS sur les répertoires enfants
# Ici, on s’arrête au premier niveau
$Tree = Get-ChildItem -Path $RootPath -Directory | Select-Object -Property Name, FullName # vieille habitude, inutile de récupérer un objet avec plein de propriétés quand peu nous intéressent.
# otention des permissions NTFS des répertoires enfants
$Result += foreach ($Dir in $Tree)
{
Get-NTFSAccess -Path $Dir.FullName | Select-Object -Property * | Format-Table
}
# Export en Grid-view
$result | Out-GridView
# Export en .csv
$Result | Export-Csv -Path c.csv -Encoding UTF8 -Delimiter « ; » -NoTypeInformation
# Export en .txt
$result | Out-File -FilePath NTFSPerm-au-$Date.txt -Encoding utf8
COMMENT DESACTIVER HERITAGE AVEC POWERSHELL sur WINDOWS SERVER