Gérer les autorisations NTFS en PowerShell avec NTFSSecurity

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 :

powershell-ntfssecurity-1

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) :

get-ntfsaccess

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 :

ntfssecurity-add-ntfs-permissions

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 :

remove-ntfs-permission

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 :

ntfs-security-manage-acl

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5470.Voir tous les posts

12 thoughts on “Gérer les autorisations NTFS en PowerShell avec NTFSSecurity

    • 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

      Répondre
      • 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…

        Répondre
  • erratum dans le commentaire du script non?
    le 2e « Ajout des autorisations NTFS » ne serait pas plutôt « Retrait des permissions NTFS sur Utilisateurs » ?

    Répondre
  • 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

    Répondre
  • 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

    Répondre
  • 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 ?

    Répondre
    • Edit: Comment faire sans perdre des heures à déplacer les données ?

      Répondre
  • 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

    Répondre
  • @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

    Répondre
  • COMMENT DESACTIVER HERITAGE AVEC POWERSHELL sur WINDOWS SERVER

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.