ICacls in Powershell
Hallo,
ich erarbeite mir gerade ein Powershell Script und lerne dabei gehörig dazu, auch wegen der tollen Antworten hier
Jetzt hätte ich eine Frage zum erteilen von Security-Einstellungen auf Datei- und Verzeichnis-Ebene die innerhalb einer Installation benötigt werden.
Im Script wird für jede Berechtigung ICacls benutzt für folgendes Beispiel verwendet:
ICacls "c:\temp\folder\" /t /grant EveryOne: (OI)(CI)F /setintegritylevel Level:M /C /Q
Wie muss ich ICacls ini Powershell einsetzen bzw gibt es was anderes, zum Beispiel Set-ACL? Was ist besser oder läst sich ICacls nicht ersetzen?
Viele Grüsse,
Daniel
ich erarbeite mir gerade ein Powershell Script und lerne dabei gehörig dazu, auch wegen der tollen Antworten hier
Jetzt hätte ich eine Frage zum erteilen von Security-Einstellungen auf Datei- und Verzeichnis-Ebene die innerhalb einer Installation benötigt werden.
Im Script wird für jede Berechtigung ICacls benutzt für folgendes Beispiel verwendet:
ICacls "c:\temp\folder\" /t /grant EveryOne: (OI)(CI)F /setintegritylevel Level:M /C /Q
Wie muss ich ICacls ini Powershell einsetzen bzw gibt es was anderes, zum Beispiel Set-ACL? Was ist besser oder läst sich ICacls nicht ersetzen?
Viele Grüsse,
Daniel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 232143
Url: https://administrator.de/contentid/232143
Ausgedruckt am: 17.11.2024 um 21:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo Daniel,
dazu habe ich hier schon des Öfteren Beiträge geschrieben, leider sind davon so manche durch User blöderweise gelöscht worden. Hier ist noch das was ich gerade noch gefunden habe:
Eine gute Einführung in die Materie findest du hier: http://www.powershellpraxis.de/index.php/berechtigungen
Wenn du noch mehr Infos dazu brauchst melde dich.
Alles was du mit icacls machst lässt sich problemlos auch mit Powershell realisieren (Set-acl / get-acl)
Wie du es im Anschluss realisierst ist Geschmacksfrage. Die Fehlerbehandlung ist mit den Powershellfunktionen natürlich einfacher, wenn du aber mit einer Verzeichnisstruktur arbeitest die rekursiv Pfade bearbeiten muss welche länger als 260 Zeichen sind bist du mit icacls besser bestellt, denn damit hat Powershell bzw. das NET-Framework massive Probleme, welche nicht so einfach zu umgehen sind.
Grüße Uwe
dazu habe ich hier schon des Öfteren Beiträge geschrieben, leider sind davon so manche durch User blöderweise gelöscht worden. Hier ist noch das was ich gerade noch gefunden habe:
- Hilfe bei PowerShel Skript
- Liste von Ordnern erstellen, bei denen AD-Berechtigungen nicht vererbt werden.
Eine gute Einführung in die Materie findest du hier: http://www.powershellpraxis.de/index.php/berechtigungen
Wenn du noch mehr Infos dazu brauchst melde dich.
Alles was du mit icacls machst lässt sich problemlos auch mit Powershell realisieren (Set-acl / get-acl)
Wie du es im Anschluss realisierst ist Geschmacksfrage. Die Fehlerbehandlung ist mit den Powershellfunktionen natürlich einfacher, wenn du aber mit einer Verzeichnisstruktur arbeitest die rekursiv Pfade bearbeiten muss welche länger als 260 Zeichen sind bist du mit icacls besser bestellt, denn damit hat Powershell bzw. das NET-Framework massive Probleme, welche nicht so einfach zu umgehen sind.
Grüße Uwe
Rekursivität kannst du erreichen indem du bei Get-ChildItem die Option -recurse setzt, aber normalerweise reicht es ja wenn du auf die Ordner das Recht setzt und es an die Objekte darin weitervererbst.
Auf was du also die Rechte setzt legst du immer erst mit Get-ChildItem fest und iterierst dann über diese Objekte, änderst in der Schleife deren ACL entsprechend und schreibst sie zurück.
Eine schöne Möglichkeit ist auch vorhandenen Code in VB.Net oder C# direkt im Powershell-Script zu kompilieren und als Funktion zu nutzen, wie ich das z.B. hier demonstriert habe:
Multi-Page Tiff mit Powershell erstellen
Also alles machbar, außer das es keinen Kaffee kochen kann
Grüße Uwe
Auf was du also die Rechte setzt legst du immer erst mit Get-ChildItem fest und iterierst dann über diese Objekte, änderst in der Schleife deren ACL entsprechend und schreibst sie zurück.
macht langsam richtig Spass was man damit alles erledigen kann.
Yip, Powerhell kann fast alles was du mit VB.Net und C# auch machen kannst, dir steht das ganze .NET Framework offen, du kannst z.B. ganze Programmoberflächen mit Windows.Forms zusammenbauen, Bilder konvertieren, Daten aus dem Web laden, mit allen möglichen Datenbanken kommunizieren, und und und.Eine schöne Möglichkeit ist auch vorhandenen Code in VB.Net oder C# direkt im Powershell-Script zu kompilieren und als Funktion zu nutzen, wie ich das z.B. hier demonstriert habe:
Multi-Page Tiff mit Powershell erstellen
Also alles machbar, außer das es keinen Kaffee kochen kann
Grüße Uwe
Zitat von @DanielBodensee:
Ich versuche mich gerade daran die Zeile "ICacls "c:\temp\folder\" /t /grant EveryOne: (OI)(CI)F /setintegritylevel Level:M /C /Q" in PowerShell nachzubilden, ist irgendwie nicht ganz so einfach...
OK dann muss ich mal wieder mundgerecht servieren . Also grob sieht das so aus:Ich versuche mich gerade daran die Zeile "ICacls "c:\temp\folder\" /t /grant EveryOne: (OI)(CI)F /setintegritylevel Level:M /C /Q" in PowerShell nachzubilden, ist irgendwie nicht ganz so einfach...
$folder = "c:\temp\folder"
# hier verwenden wird die "Jeder" SID
$user = New-Object System.Security.Principal.SecurityIdentifier "S-1-1-0"
$objects = gci $folder -Recurse | ?{$_.PSIsContainer}
foreach($obj in $objects){
$acl = get-acl $obj.FullName
$perm = $user,"FullControl","ContainerInherit,ObjectInherit","None","Allow"
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule $perm
$acl.SetAccessRule($objACE)
Set-ACL $obj.FullName -AclObject $acl
}
$user = New-Object System.Security.Principal.NTAccount "DOMAIN\User"
Wie das mit den Integrity-Levels aussieht weiß ich gerade nicht... muss ich mal schauen.
Aber verzweifele nicht wenn du hierbei noch über weitere Stolpersteine fällst ... z.B. wenn dein Account nicht das Recht hat in einem bestimmten Ordner Rechte zu ändern, weil z.B. der Besitzer jemand anderes ist. Dann muss man den Besitzer des Ordners noch ändern. Wenn du dich damit nicht abgeben willst solltest du weiterhin icacls und takeown benutzen.
Man baut mit Powershell damit quasi manuell das nach was icacls automatisch macht.
Grüße Uwe
Zitat von @DanielBodensee:
In Deinem Script, sollte die Zeile 09. nicht $acl.AddAccessRule(...) heissen?
SetAccessRule fügt ebenso wie AddAccessRule Regeln hinzu, wenn jedoch schon eine Regel für den jeweiligen Account vorhanden ist, wird diese entsprechend angepasst. Mit AddAccessRule stößt du sonst eventuell auf Probleme bzw. Fehlermeldungen in Powershell, wenn z.B. eine Deny-Regel mit deinen neuen Berechtigungen kolidiert. Hier ist die Verwendung von SetAccessRule zuverlässiger.In Deinem Script, sollte die Zeile 09. nicht $acl.AddAccessRule(...) heissen?
Grüße Uwe
das deutet auf einen inkorrekten Parameter im icacls Aufruf hin, prüfe also nochmal akribisch deine Parameter: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.8 ...
falls alle Stricke reißen, habe ich aber noch eine alternative Überprüfung auf Lager. Dazu musst du dem icacls Aufruf noch den Parameter /q mitgeben. Dieser Schnippsel wertet die finale Ausgabe von icacls aus, also die Anzahl der Fehler.
Grüße Uwe
falls alle Stricke reißen, habe ich aber noch eine alternative Überprüfung auf Lager. Dazu musst du dem icacls Aufruf noch den Parameter /q mitgeben. Dieser Schnippsel wertet die finale Ausgabe von icacls aus, also die Anzahl der Fehler.
$result = icacls ............ /q
if ([int]([regex]'\d+').matches($result)[1].Value -eq 0){
echo "OK"
}else{
echo "Fehler"
}
Also bei dir muss wirklich der Wurm drin sein, hier geht das alles so wie es auch soll. Der Regex-Teil wertet die Ausgabe von ICACLS aus:
hierbei wird die zweite Zahl ausgewertet, müsste in der englischen Variante auch die zweite Zahl sein wenn ich mich recht entsinne.
200 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.