113805
Goto Top

PowerShell Script ACL entfernen und setzen

Hallo zusammen

Ich brauche eure Hilfe bei meinem PowerShell Scriptchen.

Ich möchte gerne einen Ordner (C:\Test) nach meinem Wunsch berechtigen.
Ich erstelle also einen Ordner unter C:\ mit dem Namen "Test" und der besitzt nun die Standardberechtigung (SYSTEM, Administratoren, Benutzer)
Die Gruppe "Benutzer" soll aber entfernt werden, dafür aber der Benutzer mit dem Benutzername "Test" soll die Berechtigung erhalten zu diesem Ordner.
Es sollte eigentlich ein persönlicher Ordner auf dem Laufwerk C:\ sein.

Da in dieser Umgebung kein Arbeitsnetzwerk vorhanden ist werden diese Ordner Lokal erstellt und nicht via Share.

Ich habe jetzt schon den Teil welche ich die Vererbung deaktiviere so könnte ich theoretisch die Gruppe "Benutzer" manuell entfernen, jedoch soll das automatiesiert werden.

$folder = "C:\Test"  
$acl = Get-ACL -Path $folder
$acl.SetAccessRuleProtection($True, $True)
Set-Acl -Path $folder -AclObject $acl

Jetzt sollte noch zwei Teile dazu kommen:
  • Entfernen der Gruppe Benutzer
  • Hinzufügen vom lokalen Benutzer "Test"

Liebe Grüsse

Content-Key: 304668

Url: https://administrator.de/contentid/304668

Printed on: April 18, 2024 at 11:04 o'clock

Member: colinardo
Solution colinardo May 16, 2016 updated at 14:13:18 (UTC)
Goto Top
Hallo smackee,
ich weiß zwar nicht wie oft ich das hier schon in Threads runter gebetet habe aber dann eben noch mal:
# Ordner
$folder = 'C:\test'  

# ACL des Ordners holen
$acl = Get-Acl $folder
# Vererbung deaktivieren und vorhandene Rules übernehmen
$acl.SetAccessRuleProtection($true,$true)
# ACLs im Ordnerobjekt speichern
Set-Acl $folder $acl

# Neue ACLs erneut einlesen
$acl = Get-Acl $folder
# ACEs aus der ACL entfernen die dem/der Benutzer/Gruppe '*\Users' entsprechen 
$acl.Access | ?{$_.IdentityReference -like '*\Users'} | %{$acl.RemoveAccessRule($_)}  

# Benutzer 'Test' mit Vollzugriff hinzufügen 
$ace = New-Object System.Security.AccessControl.FileSystemAccessRule ((New-Object System.Security.Principal.NTAccount('Test')),"FullControl","ContainerInherit,ObjectInherit","None","Allow")  
# ACE des Benutzers zu den ACLs hinzufügen
$acl.AddAccessRule($ace)

# Änderungen anden ACLs wieder in den Ordner zurückschreiben
Set-Acl $folder $acl
Steht übrigens auch schon hier:
http://www.vsysad.com/2015/04/powershell-script-to-remove-permissions-i ...

Grüße Uwe

-edit- Inheritance-Flags Zeile 17 korrigiert
Mitglied: 113805
113805 May 17, 2016 at 07:24:03 (UTC)
Goto Top
Hallo Uwe

Ich danke dir recht herzlich!

Liebe Grüsse
Mitglied: 113805
113805 May 20, 2016 at 15:51:58 (UTC)
Goto Top
Hallo Uwe

Noch zwei Fragen:

  • Wie kann ich die Gruppe "Authentifizierte Benutzer" entfernen
  • Wie kann ich einen weiteren Benutzer hinzufügen (statt die Zeile zu kopieren)

Liebe Grüsse
smackee
Member: colinardo
colinardo May 20, 2016 updated at 17:21:55 (UTC)
Goto Top
Zitat von @113805:
  • Wie kann ich die Gruppe "Authentifizierte Benutzer" entfernen
Dafür gibt es die WellKnown SIDs face-wink in Windows, für die Authentifizierten Benutzer ist das die S-1-5-11
$acl.Access | ?{$_.IdentityReference -eq (New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-11').Translate([System.Security.Principal.NTAccount])} | %{$acl.RemoveAccessRuleAll($_)}  
Die bekannten SIDs kannst du auf folgender Seite nachschlagen:
Bekannte Sicherheits-IDs in Windows-Betriebssystemen

* Wie kann ich einen weiteren Benutzer hinzufügen (statt die Zeile zu kopieren)
Z.B. mit einer Foreach-Schleife über ein Array deiner gewünschten Nutzernamen:
$users = @('maxmuster','fraukemusterfrau')  
$users | %{
    $acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule ($_,"FullControl","ContainerInherit,ObjectInherit","None","Allow")))  
}
Das könntest du natürlich nach belieben ausschmücken, z.B. anstatt einem Array eine Hashtable benutzen in der du zusätzlich zum Nutzernamen dessen Berechtigungen einträgst.
$users = @{
    'maxmuster' = 'FullControl'  
    'fraukemusterfrau' = 'ReadAndExecute'  
}
$users.GetEnumerator | %{
    $acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule ($_.Name,$_.Value,"ContainerInherit,ObjectInherit","None","Allow")))  
}
Oder auch die Berechtigungen aus einer CSV lesen.

Schau auch mal hier rein:
500 Ordner - NTFS Berechtigungen mit wenigen Klicks ändern

Schönes Wochenende
Grüße Uwe
Mitglied: 113805
113805 May 23, 2016 at 06:23:31 (UTC)
Goto Top
Hallo Uwe

Vielen Dank für deine Antwort.
Ich habe mir mal deine Links angeschaut, diese sind sehr hilfreich.
Jedoch funktioniert das irgendwie nicht so ganz.

# Ordner
$folder = 'C:\Test'  

# Access Control List (ACL) des Ordners holen
$acl = Get-Acl $folder
# Vererbung deaktivieren und vorhandene Rules übernehmen
$acl.SetAccessRuleProtection($true,$true)
# ACLs im Ordnerobjekt speichern
Set-Acl $folder $acl

# Neue ACLs erneut einlesen
$acl = Get-Acl $folder
# Access Control Entries (ACEs) aus der ACL entfernen die der Gruppe '*\Benutzer' 
$acl.Access | ?{$_.IdentityReference -like '*\Benutzer'} | %{$acl.RemoveAccessRule($_)}  
# Access Control Entries (ACEs) aus der ACL entfernen die der Gruppe 'Authentifizierten Benutzer' (mit WellKnown SIDs S-1-5-11) entspricht 
$acl.Access | ?{$_.IdentityReference -eq (New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-11').Translate([System.Security.Principal.NTAccount])} | %{$acl.RemoveAccessRuleAll($_)}  

$users = @('Test','Test2')  
$users | %{
    # 
    $acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule ($_,"FullControl","ContainerInherit,ObjectInherit","None","Allow")))  
}

Liebe Grüsse
Member: colinardo
colinardo May 23, 2016 updated at 06:54:57 (UTC)
Goto Top
Doch das funktioniert, du hast nur die letzte Zeile des ersten Skripts vergessen am Ende einzufügen, welche die geänderte ACL letztendlich in den Ordner zurückschreibt!
Set-ACL $folder $acl

Meine Codes waren nur die essentiellen Ausschnitte, dachte das wäre jetzt schon klar gewesen, wo ich sie doch oben extra kommentiert hatte.

Funktioniert hier alles einwandfrei.
Mitglied: 113805
113805 May 23, 2016 at 09:32:06 (UTC)
Goto Top
Hallo Uwe

Ou, klar, ich habe den Teil irgendwie mit überschrieben und gar nicht gemerkt das diese Zeile fehlt..
Alles funktioniert prima! Hast mir wieder mal den Tag gerettet face-smile

Liebe Grüsse
smackee
Member: HerrKules
HerrKules Apr 02, 2020 at 14:50:39 (UTC)
Goto Top
Hallo Zusammen,

Wie kann ich im Script auch eine liste von Computer hinzufugen ?

Ordner
$computer = c:\temp\list_of_computers.txt
$folder = '\\$computer\c$\test'

  1. ACL des Ordners holen
$acl = Get-Acl $folder
  1. Vererbung deaktivieren und vorhandene Rules übernehmen
$acl.SetAccessRuleProtection($true,$true)
  1. ACLs im Ordnerobjekt speichern
Set-Acl $folder $acl

  1. Neue ACLs erneut einlesen
$acl = Get-Acl $folder
  1. ACEs aus der ACL entfernen die dem/der Benutzer/Gruppe '*\Users' entsprechen
$acl.Access | ?{$_.IdentityReference -like 'Jeder'} | %{$acl.RemoveAccessRule($_)}

  1. Benutzer 'Test' mit Vollzugriff hinzufügen
$ace = New-Object System.Security.AccessControl.FileSystemAccessRule ((New-Object System.Security.Principal.NTAccount('microsoft\contoso')),"FullControl","ContainerInherit,ObjectInherit","None","Allow")
  1. ACE des Benutzers zu den ACLs hinzufügen
$acl.AddAccessRule($ace)

  1. Änderungen anden ACLs wieder in den Ordner zurückschreiben
Set-Acl $folder $acl
Member: HerrKules
HerrKules Apr 02, 2020 at 15:50:06 (UTC)
Goto Top
ich konnte mich selbst beantworten... :D, trotzdem vielen Dank zum den Tolle Script von Colinardo.

#Computers
$computers = Get-Content "c:\test1\computers.txt"
foreach ($computer in $Computers) {
  1. Ordner
$folder = "\\$computer\c$\test"

  1. ACL des Ordners holen
$acl = Get-Acl $folder
  1. Vererbung deaktivieren und vorhandene Rules übernehmen
$acl.SetAccessRuleProtection($true,$true)
  1. ACLs im Ordnerobjekt speichern
Set-Acl $folder $acl

  1. Neue ACLs erneut einlesen
$acl = Get-Acl $folder
  1. ACEs aus der ACL entfernen die dem/der Benutzer/Gruppe '*\Users' entsprechen
$acl.Access | ?{$_.IdentityReference -like '*\Users'} | %{$acl.RemoveAccessRule($_)}

  1. Benutzer 'Test' mit Vollzugriff hinzufügen
$ace = New-Object System.Security.AccessControl.FileSystemAccessRule ((New-Object System.Security.Principal.NTAccount('Test')),"FullControl","ContainerInherit,ObjectInherit","None","Allow")
  1. ACE des Benutzers zu den ACLs hinzufügen
$acl.AddAccessRule($ace)

  1. Änderungen anden ACLs wieder in den Ordner zurückschreiben
Set-Acl $folder $acl
}