HALP! J'ai hérité d'un cauchemar d'autorisations pour les dossiers / répertoires redirigés

22

Mon nouvel employeur a configuré la redirection de dossiers pour ses centaines d'utilisateurs, et la personne qui l'a configuré ne savait pas vraiment ce qu'il faisait. Par conséquent, les meilleures pratiques pour les autorisations sur les dossiers / répertoires d'accueil redirigés n'ont pas été suivies.

La solution pour permettre aux utilisateurs d'accéder à leurs emplacements de dossiers redirigés était plutôt d'appliquer des Full Controlautorisations (autorisations NTFS, pas des autorisations de «partage», bien sûr) Everyoneau répertoire racine («Accueil») et de les propager à tous les sous-dossiers et fichiers sous la racine .

Qu'est-ce qui pourrait mal tourner, non? Ce n'est pas comme si le PDG avait des informations confidentielles dans son My Documentsdossier, ou si quelqu'un allait être infecté par CryptoWall et crypter les fichiers de tout le monde. Droite?

Donc, de toute façon, maintenant que l'infection CryptoWall a été supprimée et que les sauvegardes ont été restaurées, un certain nombre de personnes aimeraient que nous remplacions les autorisations actuelles par quelque chose de moins horrible, et je ne voudrais pas avoir à cliquer dans les boîtes de dialogue des autorisations dans plusieurs cent dossiers.

Comment PowerShell peut-il résoudre ce problème pour moi et redonner vie à la vie?

HopelessN00b
la source

Réponses:

18

Merci à JScott de m'avoir référé à la System.Security.Principalclasse ou à la méthode ... ou à quoi que ce soit d'autre, certains PowerShell pour remplacer les ACL sur un tas de sous-dossiers par ceux qui sont appropriés pour les répertoires personnels des utilisateurs:

$Root = "Path to the root folder that holds all the user home directories"

$Paths = Get-ChildItem $Root | Select-Object -Property Name,FullName

$DAAR = New-Object system.security.accesscontrol.filesystemaccessrule("MyDomain\Domain Admins","FullControl","ContainerInherit, ObjectInherit","None","Allow")
#Domain Admin Access Rule.

$SysAR = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","ContainerInherit, ObjectInherit","None","Allow")
#SYSTEM Access Rule.

foreach ($Folder in $Paths)
{

    Write-Host "Generating ACL for $($folder.FullName) ... "
    #For error handling purposes - not all folders will map to a user of the exact same name, this makes them easier to handle when viewing the output.

    $ACL = New-Object System.Security.AccessControl.DirectorySecurity
    #Creates a blank ACL object to add access rules into, also blanks out the ACL for each iteration of the loop.

    $objUser = New-Object System.Security.Principal.NTAccount("MyDomain\​"+$folder.name)
    #Creating the right type of User Object to feed into our ACL, and populating it with the user whose folder we're currently on.

    $UserAR = New-Object system.security.accesscontrol.filesystemaccessrule( $objuser ,"FullControl","ContainerInherit, ObjectInherit","None","Allow")
    #Access Rule for the user whose folder we're dealing with during this iteration.

    $acl.SetOwner($objUser)
    $acl.SetAccessRuleProtection($true, $false)
    #Change the inheritance/propagation settings of the folder we're dealing with

    $acl.SetAccessRule($UserAR)
    $acl.SetAccessRule($DAAR)
    $acl.SetAccessRule($SysAR)

    Write-Host "Changing ACL on $($folder.FullName) to:"
    $acl | fl
    #For error handling purposes - not all folders will map to a user of the exact same name, this makes them easier to handle when viewing the output.

    Set-Acl -Path $Folder.Fullname -ACLObject $acl

}
HopelessN00b
la source
1
Cool, c'est en supposant que le \"s'échappe le guillemet, et le CSS est foiré!
Canadian Luke REINSTATE MONICA
3
@CanadianLuke Merci! Je me demandais WTH. J'ai jeté un espace de largeur nulle pour corriger le CSS ... donc, si quelqu'un a envie de copier des pâtes, il y a un caractère non imprimable entre la barre oblique et la citation dans la ligne qui déclare $ objuser.
HopelessN00b
2

La réponse précédente ne fonctionnera pas SI les dossiers de départ / dossiers redirigés ont été configurés avec "Accorder des droits exclusifs à l'utilisateur". En effet, lorsque cette option est déconseillée , seuls SYSTEM et THE USER ont des droits sur le dossier. Vous ne pouvez alors pas modifier les perms (même en tant qu'administrateur) sans vous approprier le dossier.

C'est une méthode pour contourner cela SANS prendre possession. Il s'agit d'un processus en deux étapes.

Créez un script PowerShell qui exécute ICACLS pour modifier les perms sur les dossiers et sous-dossiers.

exécutez PSexec pour lancer le script Powershell.

extrait et modifié de: https://mypkb.wordpress.com/2008/12/29/how-to-restore-administrators-access-to-redirected-my-documents-folder/

1 Créer / copier / voler le script PowerShell (nécessite PS 3.0 ou supérieur)

#ChangePermissions.ps1
# CACLS rights are usually
# F = FullControl
# C = Change
# R = Readonly
# W = Write

$StartingDir= "c:\shares\users"   ##Path to root of users home dirs
$Principal="domain\username"    #or "administrators"
$Permission="F"

$Verify=Read-Host `n "You are about to change permissions on all" `
"files starting at"$StartingDir.ToUpper() `n "for security"`
"principal"$Principal.ToUpper() `
"with new right of"$Permission.ToUpper()"."`n `
"Do you want to continue? [Y,N]"

if ($Verify -eq "Y") {

foreach ($FOLDER in $(Get-ChildItem -path $StartingDir -directory -recurse)) {

$temp = $Folder.fullname
CACLS `"$temp`" /E /P `"${Principal}`":${Permission} >$NULL
#write-host $Folder.FullName 
}
}
  1. exécutez PSEXEC, il fonctionne comme le compte SYSTEM et peut donc modifier les perms sur le dossier auquel seuls SYSTEM et l'utilisateur ont accès. Installez et exécutez PSexec. https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Depuis la ligne de commande:

psexec -s -i powershell -noexit "& 'C:\Path\To\ChangePermissions.ps1'"
Forchette mat
la source