Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

ICacls in Powershell

Frage Entwicklung Batch & Shell

Mitglied: DanielBodensee

DanielBodensee (Level 1) - Jetzt verbinden

09.03.2014, aktualisiert 21:08 Uhr, 6158 Aufrufe, 17 Kommentare

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
Mitglied: colinardo
09.03.2014, aktualisiert um 22:46 Uhr
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
Bitte warten ..
Mitglied: DanielBodensee
10.03.2014 um 00:50 Uhr
Hallo Uwe,

mehr als 260 Zeichen habe ich nicht, daher werde ich es dann mal per PS versuchen.

Ich denke das ich die Folder in ein CSV-File ablege um das dann einzulesen und abzuarbeiten. Was ich noch nicht erlesen konnte, werden die Dateien und Verzeichnisse rekursiv abgearbeitet?

Werde also erst mal mich an Set-ACL versuchen, möglichst alles in Powershell, macht langsam richtig Spass was man damit alles erledigen kann.

Viele Grüsse,
Daniel
Bitte warten ..
Mitglied: colinardo
10.03.2014, aktualisiert um 08:21 Uhr
Zitat von DanielBodensee:
werden die Dateien und Verzeichnisse rekursiv abgearbeitet?
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.

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:
http://www.administrator.de/forum/multi-page-tiff-mit-powershell-erstel ...

Also alles machbar, außer das es keinen Kaffee kochen kann

Grüße Uwe
Bitte warten ..
Mitglied: DanielBodensee
10.03.2014 um 09:54 Uhr
Hallo Uwe,

also da bin ich ja jetzt enttäuscht von der Aussage
"Also alles machbar, außer das es keinen Kaffee kochen kann"

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...

Gruss,
Daniel
Bitte warten ..
Mitglied: colinardo
10.03.2014, aktualisiert um 12:09 Uhr
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:
01.
$folder = "c:\temp\folder" 
02.
# hier verwenden wird die "Jeder" SID 
03.
$user = New-Object System.Security.Principal.SecurityIdentifier "S-1-1-0" 
04.
$objects = gci $folder -Recurse | ?{$_.PSIsContainer} 
05.
foreach($obj in $objects){ 
06.
    $acl = get-acl $obj.FullName 
07.
    $perm = $user,"FullControl","ContainerInherit,ObjectInherit","None","Allow" 
08.
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule $perm 
09.
    $acl.SetAccessRule($objACE) 
10.
    Set-ACL $obj.FullName -AclObject $acl 
11.
}
Das $user Objekt kann auch so aussehen wenn man anstatt einer SID einen Account-Namen verwenden will:
$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
Bitte warten ..
Mitglied: DanielBodensee
10.03.2014 um 12:07 Uhr
Hi Uwe,

so war das nicht gemeint

Bin gerade am kämpfen um die Parameter von Icacls nach PowerShell umzusetzen, da war noch mein Problem Natürlich auch um eine Schleife hinzubekommen


Viele Grüsse,
Daniel
Bitte warten ..
Mitglied: filippg
11.03.2014 um 23:38 Uhr
Hallo,

hilf mir doch bitte auf die Sprünge: Warum verwendest du nicht einfach weiterhin icacls (genau so wie aktuell)? PS sollte alle cmd.exe-Befehle vollständig integrieren.

Grüße

Filipp
Bitte warten ..
Mitglied: DanielBodensee
12.03.2014 um 06:32 Uhr
Hi Filipp,

es sind etwa 20-30 Verzeichnisse doe hintereinander bearbeitet werden. Dies erfolgt innerhalb einer längeren Installation auf jedem Gerät und nimmt dann dem User den Fokus weg von Word oder wo auch immer er gerade am schreiben/arbeiten ist.

Ist eben unschön, daher wollte ich die Anpassungen der Berechtigungen in PS erledigen.

Gruss,
Daniel
Bitte warten ..
Mitglied: DanielBodensee
12.03.2014 um 06:35 Uhr
Hallo Uwe,

nur eine kurze Frage...

In Deinem Script, sollte die Zeile 09. nicht $acl.AddAccessRule(...) heissen?


Viele Grüsse,
Daniel
Bitte warten ..
Mitglied: colinardo
12.03.2014, aktualisiert um 08:09 Uhr
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.

Grüße Uwe
Bitte warten ..
Mitglied: DanielBodensee
12.03.2014 um 08:13 Uhr
Hi Uwe,

danke für die Info, hatte mich etwas verleiten lassen

Gruss,
Daniel
Bitte warten ..
Mitglied: DanielBodensee
14.03.2014 um 13:34 Uhr
Nur kurze Frage weil ich kein nicht fündig werde...

Ich habe es jetzt beim Aufruf von Icacls belassen und in mein Script eingebaut. Die Pfade, User und Parameter lese ich von einem CSV-File ein und kann so den Aufwand für mich bei Änderungen minimieren.

Damit ich das Ergebnis pro Icacls loggen kann, verwende ich den Aufruf
$result = icacls "...."

Jetzt habe ich angeschaut wie man die Fehlerbehandlung machen kann, dafür wollte ich feststellen ob Icacls evtl ein ErrorLevel setzt, bin da aber nicht weit gekommen.

Gibt Icacls kein ErrorCode zurück bzw kann ich den ErrorLevel irgendwie abfragen?

Mir geht es darum wenn eine Berechtigung nicht gesetzt werden kann, das ich darauf im Script reagieren kann.

Viele Grüsse,
Daniel
Bitte warten ..
Mitglied: colinardo
14.03.2014, aktualisiert um 14:17 Uhr
Hallo Daniel,
das kannst du mit der Variable $LASTEXITCODE direkt nach dem Befehl machen. Wenn diese 0 ist ist kein Fehler aufgetreten
01.
$result = icacls.exe ............. 
02.
if ($LASTEXITCODE -ne 0){ echo "Fehler: $result" }
Grüße Uwe
Bitte warten ..
Mitglied: DanielBodensee
14.03.2014 um 19:36 Uhr
Hi Uwe,

lustigerweise bekomme ich bei erfolgreichem Ausführen den Wert 87 und wenn ich ein Fehler einbaue (falscher Pfad bzw mit abschliessendem \) wird der Wert 123 ausgegeben.

Ich muss mal schauen ob es für Icacls ErrorCodes gibt, aber das 87 = kein Fehler sein soll, hm...

Gruss,
Daniel
Bitte warten ..
Mitglied: colinardo
14.03.2014 um 23:04 Uhr
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.
01.
$result = icacls ............ /q 
02.
if ([int]([regex]'\d+').matches($result)[1].Value -eq 0){ 
03.
   echo "OK" 
04.
}else{ 
05.
   echo "Fehler" 
06.
}
Grüße Uwe
Bitte warten ..
Mitglied: DanielBodensee
15.03.2014 um 07:19 Uhr
Hi Uwe,

ich muss mal den Icacls-Aufruf in einem eigenen Script testen, denn auf trotz Fehler 87 führt Icacls das aus was es soll und es erscheint auch keine Fehlermeldung bzw failed ist 0.

Regex hatte ich kurz geprüft, muss mir das morgen genauer anschauen denn wenn ich $result direkt auswerte, bekomme ich ein Fehler. Evtl muss ich den Typ umwandeln oder gleich als [string] #result = ... anweisen, muss es erst testen da es heute zeitlich nicht mehr klappt.

Mal schauen

Gruss,
Daniel
Bitte warten ..
Mitglied: colinardo
15.03.2014 um 07:43 Uhr
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:
200 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.
hierbei wird die zweite Zahl ausgewertet, müsste in der englischen Variante auch die zweite Zahl sein wenn ich mich recht entsinne.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
Powershell 5 BSOD (2)

Tipp von agowa338 zum Thema Windows 10 ...

Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...