Question
probleme set-acl folder/subfolder & files
- Thierry S.
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
voilà mon code
partiellement récupéré sur le net mais inadapté pour les \"fichiers\"
Ce script permet d'ajouter les droits sur un dossier (exemple : C:\Intel\") tout en propageant les acl aux enfants (sous dossier & fichiers)
[code:1] # This script takes an optional parameter of a path. If excluded, the path will
# be taken from the location where the PowerShell script is called.
#param([String[]] $path=(get-location).Path)
$path=\"C:\Intel\"
# The following information determines the user/group that will be used and the
# permissions that will be set accordingly at every location that matches the
# criteria of having inheritance blocked.
# $Identity – Identity of the user or group being granted permissions
# $Rights – The rights to be assigned
# $Inheritance – Defines if subsequent objects and containers will receive the
# the new permissions.
# $Propagation – Defines how permissions are propagated to all child objects
# $Type – Defines whether access is Allowed or Denied
$Identity = “Domain\User”
$Rights = “FullControl”
$Inheritance = @(“ObjectInherit”, “ContainerInherit”)
$Propagation = “None”
$Type = “Allow”
$Rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
$Identity, $Rights, $Inheritance, $Propagation, $Type)
# Get the security descriptor for the $path or location where the script was
# run from and add the previous rule to the location.
$TopACL = Get-ACL $path
$TopACL.AddAccessRule($Rule)
Set-ACL $path -AclObject $TopACL
# Recurse all folders and sub-folders contained in the original path or location
# where the script was called
################################ Debut AJOUT PERSO ###########################################
$fichiers = get-childitem $path -recurse -force | where-object { $_.PsIsContainer -eq 0 }
################################ FIN AJOUT PERSO #############################################
get-childitem $path -recurse -force | where-object { $_.PsIsContainer } |
foreach-object {
# Get the security descriptor for the child object
$ACL = Get-ACL $_.FullName
# Get the access rules for the child object
$access = (get-acl $_.FullName).Access
# Select the IsInherited field and set $inherit to the number of times it
# occurs, should be 1 or 0, or TRUE/FALSE respectively.
$inherit = $access.Count -eq ($access | where-object { $_.IsInherited }).Count
# If inheritance is blocked, $inherit is NOT true, add the accessrule to the
# child object and apply it.
if( !$inherit )
{
$ACL.AddAccessRule($Rule)
Set-ACL $_.FullName -AclObject $ACL
}
}
################################ Debut AJOUT PERSO #############################################
foreach ($fichier in $fichiers)
{
Set-ACL $fichier.fullname -AclObject $ACL
}################################ FIN AJOUT PERSO #############################################[/code:1]
Mes ajouts perso sont spécifiés entre les \"#\"
en fait je n'arrive pas a récupérer tous les objets du GCI , il me manque les \"fichiers\"...
Du coup les acl sont bien propagés aux \"Subfolders\" ,mais les fichiers ne subissent aucune modif :
je sais que le soucis vient de là :
get-childitem $path -recurse -force | where-object { $_.PsIsContainer } |
foreach-object {
mais si je ne mets pas le pipe
... mon script plante| where-object { $_.PsIsContainer }
Du coup j'ajoute une 2e boucle :
[code:1]$fichiers = get-childitem $path -recurse -force | where-object { $_.PsIsContainer -eq 0 }
foreach ($fichier in $fichiers)
{
Set-ACL $fichier.fullname -AclObject $ACL
}[/code:1]
mais sur un nombre de homedirectory dépassant les 2000 dossiers racines, ça va ramer
Quelqu'un pour m'éviter de faire deux boucles?
C'est a dire récuperer les fullnames dans leur totalité en une seule passe ?? et traiter les ACL d'un coup ???
MERCI par avance de l'interet que vous porterez
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Essaie de le faire manuellementmais sur un nombre de homedirectory dépassant les 2000 dossiers racines, ça va ramer
Pour ceci
Thierry94 écrit:
Peux-tu préciser le message d'erreur ?| where-object { $_.PsIsContainer }|
Sinon vous avez le droit d'ajouter des appels à Write-Debug dans vos scripts, je dis ça je dis rien
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry S.
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
Thierry94 écrit:
Essaie de le faire manuellementmais sur un nombre de homedirectory dépassant les 2000 dossiers racines, ça va ramer
Pour ceci
Thierry94 écrit:Peux-tu préciser le message d'erreur ?| where-object { $_.PsIsContainer }|
Sinon vous avez le droit d'ajouter des appels à Write-Debug dans vos scripts, je dis ça je dis rien
je débute...
mon domaine c'est le \"hardware\", les postes de travail , la masterisation, le packaging.
et on me propulse sur l'AD....
j'apprends ....
j'ai trouvé le moyen de l'améliorer... en fait, je ne fais plus qu'une boucle.... j'ai résolu mon probleme .... enfin presque... -->
ça marche quasiment tout l'temps...
[code:1]CLS
$path = 'c:\intel'
$Identity = “LianLi\robert”
$Rights = “FullControl”
$Inheritance = @(“ObjectInherit”, “ContainerInherit”)
$Propagation = “None”
$Type = “Allow”
$Rule = New-Object System.Security.AccessControl.FileSystemAccessRule( `
$Identity, $Rights, $Inheritance, $Propagation, $Type)
# Get the security descriptor for the $path or location where the script was
# run from and add the previous rule to the location.
$TopACL = Get-ACL $path
$TopACL.AddAccessRule($Rule)
Set-ACL $path -AclObject $TopACL
$items = Get-ChildItem -Path $path -Recurse
foreach ($item in $items) {
$acl = Get-ACL $item.FullName
write-host $item.FullName
# Get the access rules for the child object
$access = (get-acl $item.FullName).Access
# Select the IsInherited field and set $inherit to the number of times it
# occurs, should be 1 or 0, or TRUE/FALSE respectively.
$inherit = $access.Count -eq ($access | where-object { $_.IsInherited }).Count
# If inheritance is blocked, $inherit is NOT true, add the accessrule to the
# child object and apply it.
if( !$inherit )
{
$acl.AddAccessRule($Rule)
Set-ACL $item.FullName -AclObject $acl
}
}[/code:1]
pourquoi quasiment?
si le owner a sauté, ou si aucune ACE n'existe sur le HomeDirectory à purger (et ça arrive souvent sur notre AD tout cracra)
alors ça ne fonctionne pas !
il me faudrai une commande de type Set-Owner... mais dans le sens Add / Change Owner...
sinon pour répondre a la question , le message d'erreur si je retire | where-object { $_.PsIsContainer } |
ça donne ça....
Set-Acl : Impossible de lier l'argument au paramètre « AclObject », car il a la valeur Null.
Au niveau de C:\Intel\set-acl.ps1 : 57 Caractère : 48
+ Set-ACL $fichier.fullname -AclObject <<<< $ACL
+ CategoryInfo : InvalidData: ([Set-Acl], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SetAclComma
nd
Nota:
Apres un check approfondi,
j'ai viré 1400 objet computer via powershell:woohoo:
il me reste
- 2400 comptes user a supprimer, et autant de profilAD et autant de Homedir.
ça n'a jamais été fait.
on a migré en 2008 R2 avec toute les poubelles lol<br><br>Message édité par: Thierry94, à: 10/05/12 23:35
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
C'est l'activité que je préfére.j'apprends ....
Thierry94 écrit:
A priori, je ne prendrai pas le temps de creuser ton pb, i.e. de tester, ceci est dû à un manque de contrôle dans le script d'origine ou des régles implicites (défaut de documentation).sinon pour répondre a la question , le message d'erreur si je retire | where-object { $_.PsIsContainer } |
ça donne ça....
Pb que ton infra met à jour.
Thierry94 écrit:
Si tu sais tester ce cas, le code manquant ne devrait pas poser de difficulté.si le owner a sauté, ou si aucune ACE n'existe sur le HomeDirectory à purger (et ça arrive souvent sur notre AD tout cracra)
alors ça ne fonctionne pas !
il me faudrai une commande de type Set-Owner... mais dans le sens Add / Change Owner...
Il te faut \"juste\" le temps pour apprendre.
Mais si tu t'adresses à un forum...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry S.
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
en fait j'ai tout essayé...
Sur mon poste de travail, et a la maison ça fonctionne...(enfin sauf omission,)
Takeown
Icacls
toutes sortes de scripts PS...
rien n'y fait
par contre je viens de me rendre compte qu'avec 1 clic de souris : it worked.
en fait , il me faut un scripts qui rende \"passif\" (au sens non interactif) ma manip sous Windows GUI.
Mon action est la suivante :
1 Selection du répertoire (je sais récuperer, en PS, tous les répertoires racine des homedir users et m' en attribuer la propriété)
2 Aller jusqu'a l'onglet Propriétaire
3 Cocher la case : Remplacer des sous-containers et des objets
4 dire \"Ok\" a la demande de confirmation.
et apres la suppression se passe sans blocage.
je ne m'imagine pas me \"farcir\" 700 comptes a la mimine de cette manière.
D'autant que 1400 autres sont également potentiellement visés (lastlogon supérieur a 120jours)
Voilà, je continue a chercher....
Connexion ou Créer un compte pour participer à la conversation.
- Thierry S.
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 19
- Remerciements reçus 0
runas avec le cpte admin local sur le serveur des homedir et non pas avec le cpte du domaine ( en tse )...
takeown & icacls (récursif) ont résolu le probleme.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- probleme set-acl folder/subfolder & files