Question
[Résolu]Set-Acl et PropagationFlags
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 78
- Remerciements reçus 0
il y a 15 ans 2 semaines #9566
par buissonneau
Francis
[Résolu]Set-Acl et PropagationFlags a été créé par buissonneau
Bonjour à tous, voilà je débute dans le scripting et dans Powershell, et à cette occasion on m'a demandé de faire un script qui va vérifier si un utilisateur a bien les droits dans son répertoire de profil.
Pour information, dans ma structure, les répertoires de profils sont une concaténation des 4 première lettres du prénom + les 4 première lettres du Nom.
Ce qui correspond aussi au compte dans l'AD.
Ex: Bryan Richmond => bryarich
J'arrive bien à vérifier chaque répertoire et à contrôler les ACL, mais lorsque celui-ci n'y est pas et que je l'ajoute, je n'arrive pas à paramétrer la propagation des droits, ceux-ci restent sur \"Ce répertoire uniquement\".
Voici mon script :
cls
Set-Location c:\temp\profils\
Get-ChildItem c:\temp\profils\ -OutVariable Path
foreach ($PathFinal in $Path)
{
$PathFinal = \"$PathFinal\" + \"\\"
Get-ChildItem $pathfinal\ -name -OutVariable Child
foreach ($Folder in $child)
{
$fullpath = \"$pathfinal\" + \"$folder\"
$Acl = Get-Acl $fullpath
$AclAccess = $Acl.Access
$AclAccess
$res = 0
foreach ($AclAccessRule in $AclAccess )
{
$IdentityReference = $AclAccessRule.IdentityReference
$GroupName = $IdentityReference
$FileSystemRights = $AclAccessRule.FileSystemRights
$InheritanceFlags = $AclAccessRule.InheritanceFlags
foreach ($user in $GroupName)
{
$directory = $Folder
Write-Host $Folder
Write-Host $user
write-host
if ($user -match $directory)
{
Write-Host
write-host \"$user is in $fullpath !!\"
Write-Host
$res = 1
Write-Host $res
}
}
}
if ($res -eq \"0\")
{
$Right = \"Test\$folder\",\"FullControl\",\"Allow\"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Right
$Acl.SetAccessRule($AccessRule)
Set-Acl $fullpath $Acl
Write-Host \"$Right was add to $fullpath\"
}
}
}
J'ai essayé de rajouter $propagation = [System.Security.AccessControl.PropagationFlags]::None
et du coup de mettre $propagation après $Right sur la ligne $AccessRule, mais cela m'affiche des erreurs du coup.
Si quelqu'un a une idée ca m'intéresse, de plus si vous voyez des optimisations possible je suis preneur ^^
Merci d'avance.<br><br>Message édité par: xaviar, à: 6/05/11 12:05
Pour information, dans ma structure, les répertoires de profils sont une concaténation des 4 première lettres du prénom + les 4 première lettres du Nom.
Ce qui correspond aussi au compte dans l'AD.
Ex: Bryan Richmond => bryarich
J'arrive bien à vérifier chaque répertoire et à contrôler les ACL, mais lorsque celui-ci n'y est pas et que je l'ajoute, je n'arrive pas à paramétrer la propagation des droits, ceux-ci restent sur \"Ce répertoire uniquement\".
Voici mon script :
cls
Set-Location c:\temp\profils\
Get-ChildItem c:\temp\profils\ -OutVariable Path
foreach ($PathFinal in $Path)
{
$PathFinal = \"$PathFinal\" + \"\\"
Get-ChildItem $pathfinal\ -name -OutVariable Child
foreach ($Folder in $child)
{
$fullpath = \"$pathfinal\" + \"$folder\"
$Acl = Get-Acl $fullpath
$AclAccess = $Acl.Access
$AclAccess
$res = 0
foreach ($AclAccessRule in $AclAccess )
{
$IdentityReference = $AclAccessRule.IdentityReference
$GroupName = $IdentityReference
$FileSystemRights = $AclAccessRule.FileSystemRights
$InheritanceFlags = $AclAccessRule.InheritanceFlags
foreach ($user in $GroupName)
{
$directory = $Folder
Write-Host $Folder
Write-Host $user
write-host
if ($user -match $directory)
{
Write-Host
write-host \"$user is in $fullpath !!\"
Write-Host
$res = 1
Write-Host $res
}
}
}
if ($res -eq \"0\")
{
$Right = \"Test\$folder\",\"FullControl\",\"Allow\"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Right
$Acl.SetAccessRule($AccessRule)
Set-Acl $fullpath $Acl
Write-Host \"$Right was add to $fullpath\"
}
}
}
J'ai essayé de rajouter $propagation = [System.Security.AccessControl.PropagationFlags]::None
et du coup de mettre $propagation après $Right sur la ligne $AccessRule, mais cela m'affiche des erreurs du coup.
Si quelqu'un a une idée ca m'intéresse, de plus si vous voyez des optimisations possible je suis preneur ^^
Merci d'avance.<br><br>Message édité par: xaviar, à: 6/05/11 12:05
Francis
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 78
- Remerciements reçus 0
il y a 15 ans 1 semaine #9576
par buissonneau
Francis
Réponse de buissonneau sur le sujet Re:Set-Acl et PropagationFlags
Hello,
J'ai vu que dans mon message précédent, les \"\\" des path se sont fait la malle.
Sinon j'ai résolu mon pb, voici le script final.
cls
Set-Location c:\temp\profils\ # force l'environnement de travail dans c:\temp\profils\
$location = \"c:\temp\profils\\"
Get-ChildItem $location -OutVariable Path # liste les répertoires de c:\temp\profils\ et l'envoi dans la variable $Path
# Boucle qui pour chaque sous repertoires contenu dans la liste remontée dans la variable $Path je fais la condition ci-dessous
# concaténation du nom du chemin d'accès c:\temp\profils\\"nom du N sous répertoire\" + \"\\"
# liste les sous répertoires présent dans la concaténation ci-dessus, et envoi juste leur \"nom\" dans la variable $Child
foreach ($PathFinal in $Path)
{
$PathFinal = \"$PathFinal\" + \"\\"
Get-ChildItem $pathfinal\ -name -OutVariable Child
# Boucle qui va, pour chaque répertoire, récupérer les ACL.
# Concaténation des chemins;
# récupération des ACL.
# Affichage des ACL.
# Positionnement de la variable $Res à sa valeur par défaut = 0.
foreach ($Folder in $child)
{
$fullpath = \"$pathfinal\" + \"$folder\"
$Acl = Get-Acl $fullpath
$AclAccess = $Acl.Access
$AclAccess
$res = 0
# Boucle qui va récupérer pour chaque ACL les ACE correspondantes.
foreach ($AclAccessRule in $AclAccess )
{
$IdentityReference = $AclAccessRule.IdentityReference
$GroupName = $IdentityReference
$FileSystemRights = $AclAccessRule.FileSystemRights
# $InheritanceFlags = $AclAccessRule.InheritanceFlags
# Boucle qui va pour chaque ACE faire un test afin de déterminer si l'utilisateur du dossier à bien les droits dessus.
# Je positionne ma variable $directory=$folder car sinon le script sautait une étape
foreach ($user in $GroupName)
{
$ultimatepath = \"$location\"+\"$fullpath\"
$directory = $Folder
Write-Host $Folder
Write-Host $user
write-host
# Si une de mes ACE correspond au nom du répertoire, je positionne ma variable $res = 1.
if ($user -match $directory)
{
Write-Host
write-host \"$user is in $ultimatepath !!\"
Write-Host
$res = 1
Write-Host $res
}
}
}
# Si aucunes de mes ACE correspondent au nom du repertoire, je rajoute l'utilisateur correspondant au répertoire.
if ($res -eq \"0\")
{
$rights = \"Test\\$folder\"
$inherit = [system.security.accesscontrol.InheritanceFlags]\"ContainerInherit, ObjectInherit\"
$propagation = [system.security.accesscontrol.PropagationFlags]\"None\"
$accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($Rights, \"FullControl\", $inherit, $propagation, \"Allow\")
$Acl.SetAccessRule($AccessRule)
Set-Acl -AclObject $Acl $ultimatepath
#récupére la date du jour, la format en jj/mm/aa et la stock dans la variable $date
#remplace les \"/\" du format jj/mm/aa par \"_\" ce qui donnera \"jj_mm_aa\"
Get-Date -UFormat %D -OutVariable date
$dates = $date -replace (\"/\",\"_\")
Write-Host \"$rights was add to $ultimatepath at $date\"
#crée le fichier de log afin de voir les utilisateurs ajoutés.
Write-Output \"$rights was add to $ultimatepath at $date\" >> c:\temp\Logdu\"$dates\".txt
}
}
}
P.s : je sais pas pourquoi les anti-slash n'apparaissent pas.
Message édité par: xaviar, à: 6/05/11 12:03<br><br>Message édité par: xaviar, à: 6/05/11 12:04
J'ai vu que dans mon message précédent, les \"\\" des path se sont fait la malle.
Sinon j'ai résolu mon pb, voici le script final.
cls
Set-Location c:\temp\profils\ # force l'environnement de travail dans c:\temp\profils\
$location = \"c:\temp\profils\\"
Get-ChildItem $location -OutVariable Path # liste les répertoires de c:\temp\profils\ et l'envoi dans la variable $Path
# Boucle qui pour chaque sous repertoires contenu dans la liste remontée dans la variable $Path je fais la condition ci-dessous
# concaténation du nom du chemin d'accès c:\temp\profils\\"nom du N sous répertoire\" + \"\\"
# liste les sous répertoires présent dans la concaténation ci-dessus, et envoi juste leur \"nom\" dans la variable $Child
foreach ($PathFinal in $Path)
{
$PathFinal = \"$PathFinal\" + \"\\"
Get-ChildItem $pathfinal\ -name -OutVariable Child
# Boucle qui va, pour chaque répertoire, récupérer les ACL.
# Concaténation des chemins;
# récupération des ACL.
# Affichage des ACL.
# Positionnement de la variable $Res à sa valeur par défaut = 0.
foreach ($Folder in $child)
{
$fullpath = \"$pathfinal\" + \"$folder\"
$Acl = Get-Acl $fullpath
$AclAccess = $Acl.Access
$AclAccess
$res = 0
# Boucle qui va récupérer pour chaque ACL les ACE correspondantes.
foreach ($AclAccessRule in $AclAccess )
{
$IdentityReference = $AclAccessRule.IdentityReference
$GroupName = $IdentityReference
$FileSystemRights = $AclAccessRule.FileSystemRights
# $InheritanceFlags = $AclAccessRule.InheritanceFlags
# Boucle qui va pour chaque ACE faire un test afin de déterminer si l'utilisateur du dossier à bien les droits dessus.
# Je positionne ma variable $directory=$folder car sinon le script sautait une étape
foreach ($user in $GroupName)
{
$ultimatepath = \"$location\"+\"$fullpath\"
$directory = $Folder
Write-Host $Folder
Write-Host $user
write-host
# Si une de mes ACE correspond au nom du répertoire, je positionne ma variable $res = 1.
if ($user -match $directory)
{
Write-Host
write-host \"$user is in $ultimatepath !!\"
Write-Host
$res = 1
Write-Host $res
}
}
}
# Si aucunes de mes ACE correspondent au nom du repertoire, je rajoute l'utilisateur correspondant au répertoire.
if ($res -eq \"0\")
{
$rights = \"Test\\$folder\"
$inherit = [system.security.accesscontrol.InheritanceFlags]\"ContainerInherit, ObjectInherit\"
$propagation = [system.security.accesscontrol.PropagationFlags]\"None\"
$accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($Rights, \"FullControl\", $inherit, $propagation, \"Allow\")
$Acl.SetAccessRule($AccessRule)
Set-Acl -AclObject $Acl $ultimatepath
#récupére la date du jour, la format en jj/mm/aa et la stock dans la variable $date
#remplace les \"/\" du format jj/mm/aa par \"_\" ce qui donnera \"jj_mm_aa\"
Get-Date -UFormat %D -OutVariable date
$dates = $date -replace (\"/\",\"_\")
Write-Host \"$rights was add to $ultimatepath at $date\"
#crée le fichier de log afin de voir les utilisateurs ajoutés.
Write-Output \"$rights was add to $ultimatepath at $date\" >> c:\temp\Logdu\"$dates\".txt
}
}
}
P.s : je sais pas pourquoi les anti-slash n'apparaissent pas.
Message édité par: xaviar, à: 6/05/11 12:03<br><br>Message édité par: xaviar, à: 6/05/11 12:04
Francis
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.034 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]Set-Acl et PropagationFlags