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-ID: 304668

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

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

colinardo
Lösung colinardo 16.05.2016 aktualisiert um 16:13:18 Uhr
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
113805
113805 17.05.2016 um 09:24:03 Uhr
Goto Top
Hallo Uwe

Ich danke dir recht herzlich!

Liebe Grüsse
113805
113805 20.05.2016 um 17:51:58 Uhr
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
colinardo
colinardo 20.05.2016 aktualisiert um 19:21:55 Uhr
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
113805
113805 23.05.2016 um 08:23:31 Uhr
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
colinardo
colinardo 23.05.2016 aktualisiert um 08:54:57 Uhr
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.
113805
113805 23.05.2016 um 11:32:06 Uhr
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
HerrKules
HerrKules 02.04.2020 um 16:50:39 Uhr
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
HerrKules
HerrKules 02.04.2020 um 17:50:06 Uhr
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
}