Zum Inhalt springen
IT Explorations

Gruppenbezeichnung herausfiltern und Berechtigungen ändern

· 2 min Lesezeit · von

Inhalt

Kurz & knapp: Das PowerShell-Skript durchsucht die Unterordner eines Pfades nach ACL-Einträgen einer bestimmten Berechtigungsgruppe und hebt deren NTFS-Recht von Lesen/Ausführen auf Ändern an — inklusive Entfernen der alten Lese-ACE, damit keine doppelten Einträge entstehen.

Erläuterung#

Wenn Sie gewisse Berechtigungsgruppen suchen, die in Ordnern berechtigt wurden, können Sie mit diesem Skript die Gruppe aufsuchen und die Berechtigung von 'Lesen' auf 'Ändern' setzen.

Problembeschreibung#

Manchmal sucht man als Admin ganz bestimmte Gruppen in einer unendlichen Anzahl von Unterordnern und möchte genau für diese dann die Berechtigungen ändern.

Persönliche Anpassungen#

$strPfad = 'LW:\ORDNER'
$strGruppenbezeichnung = 'MB-DL'
$strDomäne = 'DOMÄNE' # Domäne ohne Endung wie z.B. '.local' -> NETBIOS-NAME

Skript#

#
#  Author: Jan Weis
#  www.it-explorations.de
#

# --- BENUTZER VARIABLEN --- #

$strPfad = 'LW:\ORDNER'
$strGruppenbezeichnung = 'MB-DL'
$strDomäne = 'DOMÄNE' # Domäne ohne Endung wie z.B. '.local' -> NETBIOS-NAME

# --- SYSTEM VARIABLEN --- #

# FileSystemRights Flags
$objFileSystemRightModify = [System.Security.AccessControl.FileSystemRights]'Modify'
$objFileSystemRightReadExecute = [System.Security.AccessControl.FileSystemRights]'ReadAndExecute'
      
# InheritanceFlags Flags
$objInheritanceFlagDirectory = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit 
$objInheritanceFlagFile = [System.Security.AccessControl.InheritanceFlags]::None

# Common Flags
$objAccessControlTypeAllow = [System.Security.AccessControl.AccessControlType]::Allow 
$objPropagationFlagsNone = [System.Security.AccessControl.PropagationFlags]::None 

# --- SKRIPT --- #

Foreach ($objOrdnerItem in (Get-ChildItem -Path $strPfad))
{
  
  # Berechtigungen abrufen
  $objOrdnerItemACL = Get-Acl -Path $objOrdnerItem.FullName

  # Prüfe jedes Berechtigungsobjekt ob es den gewünschten Namen beinhaltet UND die Berechtigung 'ReadAndExecute' beinhaltet
  [String[]]$strACLGruppenListe = ($objOrdnerItemACL.Access | Where-Object {$_.IdentityReference -match $strGruppenbezeichnung -and $_.FileSystemRights -like 'ReadAndExecute*'}).IdentityReference.Value

  # Passen die Berechtigung für jede gefundene Gruppe an 
  foreach ($strACLGruppenItem in $strACLGruppenListe)
  {
  
    # Für jede gefundene Gruppe wird die Berechtigung auf 'Modify' angepasst
    
    # Domäne entfernen
    $strACLGruppenItem = $strACLGruppenItem.replace("$strDomäne\",'')

    # NTAccount-Object anlegen
    $objADSecGruppe = New-Object  -TypeName System.Security.Principal.NTAccount -ArgumentList ($strACLGruppenItem) 
      
    # FILESYSTEMACCESSRULE-OBJECT ANLEGEN
    $objDirectoryAceRule = New-Object  -TypeName System.Security.AccessControl.FileSystemAccessRule  -ArgumentList ($objADSecGruppe, $objFileSystemRightModify, $objInheritanceFlagDirectory, $objPropagationFlagsNone, $objAccessControlTypeAllow) 

    # ALTE 'ReadAndExecute'-REGEL ENTFERNEN (sonst bleibt sie zusaetzlich bestehen -> doppelte ACE)
    $objReadAceRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($objADSecGruppe, $objFileSystemRightReadExecute, $objInheritanceFlagDirectory, $objPropagationFlagsNone, $objAccessControlTypeAllow)
    $null = $objOrdnerItemACL.RemoveAccessRule($objReadAceRule)

    # NEUE ACL HINZUFÜGEN
    $objOrdnerItemACL.AddAccessRule($objDirectoryAceRule)
      
    # NEUE ACL AUF DAS OBJEKT SCHREIBEN
    $objOrdnerItemACL | Set-Acl -Path $objOrdnerItem.FullName
  }
}

Kategorien: Skripte

Verwandte Beiträge