Question [Résolu]Set-Acl et PropagationFlags

Plus d'informations
il y a 15 ans 2 semaines #9566 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

Francis

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 semaine #9576 par buissonneau
Réponse de buissonneau sur le sujet Re:Set-Acl et PropagationFlags
Hello,
J'ai vu que dans mon message précédent, les \&quot;\\&quot; 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 = \&quot;c:\temp\profils\\&quot;
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\\&quot;nom du N sous répertoire\&quot; + \&quot;\\&quot;
# liste les sous répertoires présent dans la concaténation ci-dessus, et envoi juste leur \&quot;nom\&quot; dans la variable $Child
foreach ($PathFinal in $Path)
{
$PathFinal = \&quot;$PathFinal\&quot; + \&quot;\\&quot;
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 = \&quot;$pathfinal\&quot; + \&quot;$folder\&quot;
$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 = \&quot;$location\&quot;+\&quot;$fullpath\&quot;
$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 \&quot;$user is in $ultimatepath !!\&quot;
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 \&quot;0\&quot;)
{
$rights = \&quot;Test\\$folder\&quot;
$inherit = [system.security.accesscontrol.InheritanceFlags]\&quot;ContainerInherit, ObjectInherit\&quot;
$propagation = [system.security.accesscontrol.PropagationFlags]\&quot;None\&quot;
$accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($Rights, \&quot;FullControl\&quot;, $inherit, $propagation, \&quot;Allow\&quot;)
$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 \&quot;/\&quot; du format jj/mm/aa par \&quot;_\&quot; ce qui donnera \&quot;jj_mm_aa\&quot;
Get-Date -UFormat %D -OutVariable date
$dates = $date -replace (\&quot;/\&quot;,\&quot;_\&quot;)
Write-Host \&quot;$rights was add to $ultimatepath at $date\&quot;
#crée le fichier de log afin de voir les utilisateurs ajoutés.
Write-Output \&quot;$rights was add to $ultimatepath at $date\&quot; &gt;&gt; c:\temp\Logdu\&quot;$dates\&quot;.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
Propulsé par Kunena