Question probleme set-acl folder/subfolder & files

Plus d'informations
il y a 13 ans 10 mois #11747 par Thierry S.
bonsoir
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

| where-object { $_.PsIsContainer }

... mon script plante :(

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.

Plus d'informations
il y a 13 ans 10 mois #11755 par Laurent Dardenne
Thierry94 écrit:

mais sur un nombre de homedirectory dépassant les 2000 dossiers racines, ça va ramer :(

Essaie de le faire manuellement :P
Pour ceci
Thierry94 écrit:

| where-object { $_.PsIsContainer }|

Peux-tu préciser le message d'erreur ?

Sinon vous avez le droit d'ajouter des appels à Write-Debug dans vos scripts, je dis ça je dis rien :dry:

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 10 mois #11761 par Thierry S.
Laurent Dardenne écrit:

Thierry94 écrit:

mais sur un nombre de homedirectory dépassant les 2000 dossiers racines, ça va ramer :(

Essaie de le faire manuellement :P
Pour ceci
Thierry94 écrit:

| where-object { $_.PsIsContainer }|

Peux-tu préciser le message d'erreur ?

Sinon vous avez le droit d'ajouter des appels à Write-Debug dans vos scripts, je dis ça je dis rien :dry:



je débute...:P :silly: mais vraiment....

mon domaine c'est le \"hardware\", les postes de travail , la masterisation, le packaging.

et on me propulse sur l'AD.... :woohoo: :blink:
j'apprends ....:whistle: :whistle:







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...:whistle:




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.

Plus d'informations
il y a 13 ans 10 mois #11767 par Laurent Dardenne
Thierry94 écrit:

j'apprends ....

C'est l'activité que je préfére.
Thierry94 écrit:

sinon pour répondre a la question , le message d'erreur si je retire | where-object { $_.PsIsContainer } |
ça donne ça....

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).
Pb que ton infra met à jour.
Thierry94 écrit:

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...:whistle:

Si tu sais tester ce cas, le code manquant ne devrait pas poser de difficulté.
Il te faut \&quot;juste\&quot; le temps pour apprendre.
Mais si tu t'adresses à un forum...

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 10 mois #11816 par Thierry S.
 

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 \&quot;passif\&quot; (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 \&quot;Ok\&quot; a la demande de confirmation.

et apres la suppression se passe sans blocage.


je ne m'imagine pas me \&quot;farcir\&quot; 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....:unsure:<br><br>Message édité par: Thierry94, à: 15/05/12 18:28

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

Plus d'informations
il y a 13 ans 9 mois #11876 par Thierry S.
j'ai trouvé la soluce...
runas avec le cpte admin local sur le serveur des homedir et non pas avec le cpte du domaine ( en tse )...

takeown &amp; icacls (récursif) ont résolu le probleme.

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

Temps de génération de la page : 0.081 secondes
Propulsé par Kunena