Question
Insertion de groupe avec ACL
- Tépinier
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
Aujourd'hui je dois écrire un script qui ajoute 3 groupes (sécurité) d'utilisateurs (avec des droits NTFS différents, RW, RO, A) pour chaque dossier d'une arborescence que j'ai créée.
Les groupes sont dans mon AD (insérés via un script), et l'arborescence est en place, également ajouté par script, avec l'héritage supprimé et le groupe admin en contrôle total.
Le fait que je ne trouve pas comment faire vient du fait que chaque dossier de l'arborescence a un groupe bien spécifique, le tout étant dans des fichiers CSV. Mon arborescence dans un fichier csv (nom;chemin) et mes groupes dans un autre (groupe;chemin). J'explique :
Si on a le dossier Toto1 à la racine, alors j'ai trois groupes : Toto1_RW, Toto1_RO et Toto_A.
Ensuite, si j'ai un dossier EnfantToto1 dans le répertoire précédent Toto1, alors j'ai trois 3 groupes nommés Toto1_EnfantToto1_RW, Toto1_EnfantToto1_RO et Toto1_EnfantToto1_A.
Chaque répertoire de l'arborescence possède 3 groupes qui leur est propre, le tout dans des fichiers csv différents comme je vous l'ai dit.
Ma question : comment insérer tout ça ? Merci !
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Regarde du côté des commandes Get-ACL et Set-ACL. Tu trouveras dans l'aide tout ce qu'il te faudra pour débuter.
Sache que la manipulation des ACLs n'est pas forcément évident... Quelque chose que je fait parfois, c'est positionner des ACLs \"à la main\" via la console sur un répertoire. Ce répertoire me servant alors de modèle de permissions. Ensuite j'utilise la commande Get-Acl sur ce répertoire afin de récupérer ces dernières et je les stocke dans une variable.
Par exemple :
[code:1]
$ACL = Get-ACL -Path C:\temp\DossierModele [/code:1]
Puis j'applique ces ACL sur le dossier de destination.
Exemple:
[code:1]
Set-ACL -Path C:\temp\DossierDestination -AclObject $ACL
[/code:1]
C'est une façon de faire simple pour commencer. Après il existe d'autres techniques pour construire des objets ACL de toutes pièces mais ça on verra plus tard...
@+
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Tépinier
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
J'ai déjà lu pas mal de chose sur ces commandes, et c'est pas tellement ce côté qui me bloque. C'est surtout le fait d'appliquer différents groupes sur différents dossiers d'une arborescence. Si c'était les mêmes groupes à chaque fois, ça sera simple, un foreach et terminé .. Mais là non.
J'ai pondu cela :
[code:1] #Ajout des ACL aux groupes
foreach($group in $groups){
#############################
$GroupGL = $group.GroupGL
$path = ($dossiers.chemin)
$name = ($dossiers.nom)
$inherit = [system.security.accesscontrol.InheritanceFlags]\"ObjectInherit\",[system.security.accesscontrol.InheritanceFlags]\"ContainerInherit\"
#############################
if($GroupGL.EndsWith(\"_A\"«»))
{
$aclA = Get-Acl $path'\'$name
$ACL_Access = New-Object Security.AccessControl.FileSystemAccessRule(\"test.lan\$GroupGL\", \"Traverse\", $inherit, \"None\", \"Allow\"«»)
$aclA.AddAccessRule($ACL_Access)
Set-Acl -path $path'\'$name -AclObject $aclA
}elseif($GroupGL.EndsWith(\"_RW\"«»))
{
$aclRW = Get-Acl $path'\'$name
$ACL_RW = New-Object Security.AccessControl.FileSystemAccessRule(\"test.lan\$GroupGL\", \"Modify\", $inherit, \"None\", \"Allow\"«»)
$aclRW.AddAccessRule($ACL_RW)
Set-Acl -path $path'\'$name -AclObject $aclRW
}else
{
$aclRO = Get-Acl $path'\'$name
$ACL_RO = New-Object Security.AccessControl.FileSystemAccessRule(\"test.lan\$GroupGL\", \"Read\", $inherit, \"None\", \"Allow\"«»)
$aclRO.AddAccessRule($ACL_RO)
Set-Acl -path $path'\'$name -AclObject $aclRO
}
}[/code:1]
Le problème est que cette partie ajoute tous les groupes sur tous les répertoires, et c'est pas le but. J'arrive pas à voir comment ajouter des groupes spécifiques sur un répertoire spécifique, avec une boucle.
J'ai organisé mes fichiers CSV par ordre, sur le premier fichier, le nom du groupe étant en première ligne, a ces groupes en premiers sur le deuxième fichier. Le second groupe dans le premier fichier, a ces 3 groupes en 2ème position dans l'autre, etc. je sais pas si ça peut aider ?
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Je serais toi, j'écrirais une fonction qui positionne les ACLs de ces trois groupes sur un répertoire. Essaie de toujours raisonner de façon unitaire et de découper le plus possible ton code en petites fonctions simples.
De plus, je ne comprends pas bien à quoi te servent tes fichiers CSV dans la mesure où tu as normalisé le nom de tes groupes par rapport au nom de tes répertoires...
Du coup j'écrirais par exemple la fonction \"Set-<MonEntreprise>ACLToFolder\". Celle-ci prendrait en paramètre le chemin du dossier sur lequel appliquer les ACLs. Je récupérerais juste le nom du dossier final afin de déterminer le nom des groupes, puis j'appliquerais les ACLs correspondantes.
Désolé si ça ne répond pas exactement à ton besoin...
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Tépinier
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
J'ai tous mis dans des fichiers csv pour rentrer les groupes dans l'AD et créer l'arborescence.
J'applique les ACl des 3 groupes sur un répertoire :
[code:1]clear-host
$path = \"C:\Shares\"
######Nouveau répertoire######
New-Item -Name \"test\" -ItemType directory -Path C:\Shares -Force
Disable-NTFSAccessInheritance -Path C:\Shares\test
###### ACL ######
$inherit = [system.security.accesscontrol.InheritanceFlags]\"ObjectInherit\",[system.security.accesscontrol.InheritanceFlags]\"ContainerInherit\"
$ACL_Access = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_A\", \"Traverse\", $inherit, \"None\", \"Allow\"«»)
$aclA.AddAccessRule($ACL_Access)
Set-Acl -path C:\Shares\test -AclObject $aclA
$ACL_RW = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_RW\", \"Modify\", $inherit, \"None\", \"Allow\"«»)
$aclRW.AddAccessRule($ACL_RW)
Set-Acl -path C:\Shares\test -AclObject $aclRW
$ACL_RO = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_RO\", \"Read\", $inherit, \"None\", \"Allow\"«»)
$aclRO.AddAccessRule($ACL_RO)
Set-Acl -path C:\Shares\test -AclObject $aclRO[/code:1]
J'ai testé j'ai une erreur déjà :
Exception calling \"AddAccessRule\" with \"1\" argument(s): \"Some or all identity references could not be translated.\"
At line:13 char:2
+ $aclA.AddAccessRule($ACL_Access)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ([], MethodInvocationException
+ FullyQualifiedErrorId : IdentityNotMappedException
Je ne sais pas d'où ça vient. J'ai construit mon script à partir de présentation sur divers sites.
Par contre j'ai pas compris la fonction Set-<MonEntreprise>ACLToFolder
A quel moment je dois les \"Set\" ?
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Je pense que ton erreur est peut-être due au fait que ton groupe n'existe pas ou que le droit que tu cherches à appliquer n'est pas correct.
Dois-je comprendre que tu utilises le NTFSSecurity Module pour gérer les ACLs ?
Ce que je voulais dire, et peu importe le nom de la fonction, c'est que dans ton cas ce serait bien de créer une fonction que tu pourrais ensuite appliquer à n'importe quel dossier.
Par exemple, en supposant que ça marche :
[code:1]
Function Set-ACLToFolder
{
Param ([String] $Path)
$inherit = [system.security.accesscontrol.InheritanceFlags]\"ObjectInherit\",[system.security.accesscontrol.InheritanceFlags]\"ContainerInherit\"
$ACL_Access = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_A\", \"Traverse\", $inherit, \"None\", \"Allow\"«»)
$aclA.AddAccessRule($ACL_Access)
Set-Acl -path $Path -AclObject $aclA
$ACL_RW = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_RW\", \"Modify\", $inherit, \"None\", \"Allow\"«»)
$aclRW.AddAccessRule($ACL_RW)
Set-Acl -path $Path -AclObject $aclRW
$ACL_RO = New-Object Security.AccessControl.FileSystemAccessRule(\"Groupe_RO\", \"Read\", $inherit, \"None\", \"Allow\"«»)
$aclRO.AddAccessRule($ACL_RO)
Set-Acl -path $Path -AclObject $aclRO
}
Set-ACLToFolder -Path C:\Shares\test
[/code:1]
Pense réutilisation de ton code.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Insertion de groupe avec ACL