Windows NTFS - Ajoute l'autorisation à chaque liste de contrôle d'accès explicite dans tous les sous-dossiers

0

Nous avons une structure de dossiers avec de nombreux droits explicites comme

root Folder
- subfolder 1 (explicit acl, no inherit acl)
- subfolder 2 (explicit acl, no inherit acl)
--subsubfolder 1 (no explicit rights, inherit acl)
--subsubfolder 2 (explicit acl, no inherit acl)

etc

Je souhaite ajouter une autorisation (compte système) à toutes les listes de contrôle d'accès explicites, mais pas à celles qui ne le sont pas. Et bien sûr, il y a des dossiers qui ne sont pas accessibles même par un compte d'administrateur, je dois donc ignorer les erreurs.

Toute personne au courant d'un script qui peut atteindre cet objectif?

Edit1
Grâce à Hardoman, voici une solution de travail pour le dossier, le sous-dossier et les fichiers actuels, sans que l'erreur ne soit détectée ...

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
            icacls.exe $item /grant 'System:(OI)(CI)(RX)'
    }
}

N'a pas trouvé de solution avec set-acl, peut-être que quelqu'un a une idée, il s'agit de l'état actuel de set-acl, mais le sous-dossier ne reçoit pas les permissions même lorsqu'il est hérité.

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
    try {
        $acl = Get-Acl $item
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl, Synchronize", "ContainerInherit,ObjectInherit", "None", "Allow")
        $acl.SetAccessRule($AccessRule)
        Set-Acl $item $acl
    }
    catch {
        "Failed to access folder $item"
        "Exception type is $($_.Exception.GetType().Name)"
        }
    }
}
Blafasel
la source
Utilisation icacls outil et ajoutez vos autorisations préférées. Plus de détails ici: ss64.com/nt/icacls.html
Biswapriyo

Réponses:

0

Vous devez écrire un script Powershell pour cela. Vous devez obtenir récursivement tous les dossiers et sous-dossiers, vérifier l’héritage pour chacun et utiliser Get-ACL et Set-ACL les commadlets ajoutent des autorisations pour le système Compte. Try / catch gérera les erreurs si le script ne peut pas accéder au dossier.

Voici l'exemple que j'ai écrit pour vous, en supposant que vous récupériez dans le dossier C: \ temp à titre d'exemple.

$folders = (Get-ChildItem c:\temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
    try {
        $acl = Get-Acl $item
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ("System","FullControl","Allow")
        $acl.SetAccessRule($AccessRule)
        $acl | Set-Acl $item
    }
    catch {
        "Failed to access folder $item"
        "Exception type is $($_.Exception.GetType().Name)"
        }
    }
}

P.S. Pour que Get-ChildItem avec -Directory fonctionne, vous devez avoir Powershell 4+. Ce commutateur manque dans PS 2.0

Hardoman
la source
Merci jusqu'ici pour celui-ci, avez le problème que maintenant le système est défini sur le (s) dossier (s) correct (s) et lorsque j'ajoute "ContainerInherit, ObjectInherit" à la règle d'accès, l'autorisation se trouve directement sur le dossier qui a défini l'autorisation ... mais tous les sous-dossiers / fichiers ne reçoivent pas l'autorisation, même lorsqu'ils sont hérités. Des idées à ce sujet? Nous avons trouvé de nombreux sujets à ce sujet avec set-acl mais pas de solution réelle, à l'exception de l'utilisation d'icacls.exe au lieu de set-acl
Blafasel