Les listes d'accès (Acl) permettent de limiter l'accès à un dossier à une ou plusieurs personnes, et de définir pour chacun d'elles des droits spécifiques (lecture, écriture ...).
Dans cette première partie, Je vais vous monter différents exemples de scripts afin de réaliser les opérations suivantes sur un fichier ou un dossier :
- Lister les droits d'un fichier ou d'un dossier,- Ajouter ou supprimer des droits à une personne,
- Activer ou désactiver l'héritage sur un dossier,
- Modifier le propriétaire d'un fichier ou d'un dossier.
Commençons par lister les droits d'un fichier/dossier.
#Lister des droits d'un fichier ou dossier.
$dossier = "C:\dossier1"
#Je récupère la liste des droits sur le dossier.
$acl = get-acl -path $dossier
#Puis pour chaque utilisateurs présent dans la liste j'affiche ses droits d'accès.
ForEach ($ace in $acl.Access)
{
Write-Host $ace.IdentityReference "-" $ace.FileSystemRights "-" $ace.AccessControlType "-" $ace.IsInherited
}
#Fin
$dossier = "C:\dossier1"
#Je récupère la liste des droits sur le dossier.
$acl = get-acl -path $dossier
#Puis pour chaque utilisateurs présent dans la liste j'affiche ses droits d'accès.
ForEach ($ace in $acl.Access)
{
Write-Host $ace.IdentityReference "-" $ace.FileSystemRights "-" $ace.AccessControlType "-" $ace.IsInherited
}
#Fin
Voici quelques explications complémentaires :
$ace.IdentityReference = utilisateur ou groupe.
$ace.FileSystemRights = droits (lecture, modification ...).
$ace.AccessControlType = permission ou interdiction du droit (allow or deny).
$ace.IsInherited = droit hérité du dossier parent ou non (true or false).
Ajoutons l'utilisateur "Jumbor12" avec le droit de modifier sur notre "dossier1".
#Ajouter un utilisateur/groupe sur un fichier/dossier.
#Dossier ou fichier à modifier.
$dossier = "C:\dossier1"
#Groupe ou utilisateur. Exemple : $groupe = "DOMAIN\GROUPE".
$groupe = "Jumbor12"
#Droits à ajouter
#$droit = "FullControl" #Contrôle totale.
$droit = "Modify" #Modifier.
#$droit = "ReadAndExecute" #Lecture.
#Propagation (laissez les valeur par défaut).
#None, InheritOnly, NoPropagateInherit.
$PFlag = [System.Security.AccessControl.PropagationFlags]::None
#Héritage (laissez les valeur par défaut).
#None, ContainerInherit, ObjectInherit.
$IFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit) -bor ([System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
#Je construit un objet de contrôle d'accès (Aco).
$test = Get-Item $dossier
if ($test.gettype().Name -eq "FileInfo")
{
#Les fichiers ne supportent pas les options IFlag et PFlag.
#Il faut donc les retirer.
$aco = new-object Security.AccessControl.FileSystemAccessRule($groupe, $droit, , , "Allow")
}
else
{
#Les dossiers par contre utilisent les options IFlag et PFlag.
$aco = new-object Security.AccessControl.FileSystemAccessRule($groupe, $droit, $IFlag, $PFlag, "Allow")
}
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#J'ajoute mon Aco à ma liste d'accès.
$acl.AddAccessRule($aco) #Ajoute un utilisateur + droit.
#$acl.RemoveAccessRule($aco) #Supprime un droit uniquement.
#$acl.RemoveAccessRuleAll($aco) #Supprime un utilisateur et tout ses droits.
#J'applique ma liste d'accès modifié à mon fichier/dossier.
Set-Acl -Path $dossier -AclObject $acl
#Fin
#Dossier ou fichier à modifier.
$dossier = "C:\dossier1"
#Groupe ou utilisateur. Exemple : $groupe = "DOMAIN\GROUPE".
$groupe = "Jumbor12"
#Droits à ajouter
#$droit = "FullControl" #Contrôle totale.
$droit = "Modify" #Modifier.
#$droit = "ReadAndExecute" #Lecture.
#Propagation (laissez les valeur par défaut).
#None, InheritOnly, NoPropagateInherit.
$PFlag = [System.Security.AccessControl.PropagationFlags]::None
#Héritage (laissez les valeur par défaut).
#None, ContainerInherit, ObjectInherit.
$IFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit) -bor ([System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
#Je construit un objet de contrôle d'accès (Aco).
$test = Get-Item $dossier
if ($test.gettype().Name -eq "FileInfo")
{
#Les fichiers ne supportent pas les options IFlag et PFlag.
#Il faut donc les retirer.
$aco = new-object Security.AccessControl.FileSystemAccessRule($groupe, $droit, , , "Allow")
}
else
{
#Les dossiers par contre utilisent les options IFlag et PFlag.
$aco = new-object Security.AccessControl.FileSystemAccessRule($groupe, $droit, $IFlag, $PFlag, "Allow")
}
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#J'ajoute mon Aco à ma liste d'accès.
$acl.AddAccessRule($aco) #Ajoute un utilisateur + droit.
#$acl.RemoveAccessRule($aco) #Supprime un droit uniquement.
#$acl.RemoveAccessRuleAll($aco) #Supprime un utilisateur et tout ses droits.
#J'applique ma liste d'accès modifié à mon fichier/dossier.
Set-Acl -Path $dossier -AclObject $acl
#Fin
Pour supprimer un droit sur un fichier/dossier je remplace simplement dans mon script la ligne "$acl.AddAccessRule($aco)" par :
$acl.RemoveAccessRule($aco)
Mais si ceci supprime bien un droits, il ne supprime pas pour autant l'utilisateur/groupe lui même. Pour supprimer un utilisateur/groupe et tout ses droits il faut utiliser la ligne suivante :
$acl.RemoveAccessRuleAll($aco)
Maintenant que vous savez gérer les droits, il est temps de se pencher sur le problème de l'héritage. Par défaut, quand vous créez un nouveau dossier, il hérite automatiquement des droits de son parent. Dans certain cas ça nous arrange, et d'autres pas. Je vais donc vous montrer comment activer ou désactiver l'héritage d'un fichier/dossier.
#Réactiver l'héritage.
#Dossier ou fichier à modifier.
$dossier = "C:\dossier1"
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#Je active l'option héritage dans mon Acl.
#$acl.SetAccessRuleProtection($true,$true) #Désactive l'héritage.
$acl.SetAccessRuleProtection($false,$false) #Active l'héritage.
#J'applique mon Acl modifiée sur mon dossier.
Set-Acl -Path $dossier -AclObject $acl
#Puis je supprime les droits non-hérité.
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#Pour chaque accès,
ForEach ($ace in $acl.Access)
{
$groupe = [string] $ace.IdentityReference
$droit = [string] $ace.FileSystemRights
$Type = [string] $ace.AccessControlType
$Heritage = $ace.IsInherited
$IFlag = $ace.InheritanceFlags
$PFlag = $ace.PropagationFlags
#Je vérifie si c'est un droit non-hérité.
if (!$Heritage)
{
#Je vérifie si c'est un fichier ou un dossier.
$test = Get-Item $dossier
if ($test.gettype().Name -eq "FileInfo")
{
$aco = New-Object Security.AccessControl.FileSystemAccessRule($groupe, $droit, , , $Type)
}
else
{
$aco = New-Object Security.AccessControl.FileSystemAccessRule($groupe, $droit, $IFlag, $PFlag, $Type)
}
#Et je supprime l'utilisateur/groupe.
$acl.RemoveAccessRuleAll($aco)
}
}
#J'applique la liste d'accès modifié sur mon dossier.
Set-Acl -Path $dossier -AclObject $acl
#Fin
#Dossier ou fichier à modifier.
$dossier = "C:\dossier1"
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#Je active l'option héritage dans mon Acl.
#$acl.SetAccessRuleProtection($true,$true) #Désactive l'héritage.
$acl.SetAccessRuleProtection($false,$false) #Active l'héritage.
#J'applique mon Acl modifiée sur mon dossier.
Set-Acl -Path $dossier -AclObject $acl
#Puis je supprime les droits non-hérité.
#Je récupère la liste d'accès de mon dossier.
$acl = get-acl -path $dossier
#Pour chaque accès,
ForEach ($ace in $acl.Access)
{
$groupe = [string] $ace.IdentityReference
$droit = [string] $ace.FileSystemRights
$Type = [string] $ace.AccessControlType
$Heritage = $ace.IsInherited
$IFlag = $ace.InheritanceFlags
$PFlag = $ace.PropagationFlags
#Je vérifie si c'est un droit non-hérité.
if (!$Heritage)
{
#Je vérifie si c'est un fichier ou un dossier.
$test = Get-Item $dossier
if ($test.gettype().Name -eq "FileInfo")
{
$aco = New-Object Security.AccessControl.FileSystemAccessRule($groupe, $droit, , , $Type)
}
else
{
$aco = New-Object Security.AccessControl.FileSystemAccessRule($groupe, $droit, $IFlag, $PFlag, $Type)
}
#Et je supprime l'utilisateur/groupe.
$acl.RemoveAccessRuleAll($aco)
}
}
#J'applique la liste d'accès modifié sur mon dossier.
Set-Acl -Path $dossier -AclObject $acl
#Fin
Cette article touche presque à ca fin. Il nous reste plus qu'a voir la prise de possession d'un fichier/dossier (setowner).
#Prendre possession d'un fichier/dossier.#Dossier ou fichier à modifier.
$dossier = "C:\dossier1"
#Je récupère les informations de mon dossier.
$gdossier = Get-Item $dossier
#Je récupère la liste d'accès de mon dossier.
$acl = $gdossier.GetAccessControl()
#Je crée un objet $groupe
$groupe = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrateurs")
#Je modifie mon Acl.
$acl.SetOwner($groupe)
#Et j'applique l'Acl modifiée sur mon dossier.
$gdossier.SetAccessControl($acl)
#Enfin j'affiche le nom du nouveau propriétaire.
Write-Host "Propriétaire : " $acl.Owner
#Fin.
$dossier = "C:\dossier1"
#Je récupère les informations de mon dossier.
$gdossier = Get-Item $dossier
#Je récupère la liste d'accès de mon dossier.
$acl = $gdossier.GetAccessControl()
#Je crée un objet $groupe
$groupe = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrateurs")
#Je modifie mon Acl.
$acl.SetOwner($groupe)
#Et j'applique l'Acl modifiée sur mon dossier.
$gdossier.SetAccessControl($acl)
#Enfin j'affiche le nom du nouveau propriétaire.
Write-Host "Propriétaire : " $acl.Owner
#Fin.