Benutzer mit den meisten Antworten
Berechtigungen werden nicht vererbt / Löschen nicht möglich

Frage
-
Hallo,
ich schreibe gerade an einem kleinen Powershell-Script, welches mehrere Ordner, verteilt auf unterschiedliche Server, löschen soll. Auf den Win2k3 Servern funktioniert alles, auf dem einen Win2k8R2 Server jedoch nicht.
# Besitz übernehmen takeown -S file.domaene.local /F "freigabe\ordner" /R /D /J # Berechtigungen anpassen $homepath = "\\file.domaene.local\freigabe\ordner" $acl = Get-Acl $homepath $permission = "domaene\admin","FullControl","ContainerInherit,ObjectInherit","None","Allow" $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission $acl.SetAccessRule ($accessRule) $acl | Set-Acl "$homepath" # Besitz für Unterordner übernehmen takeown -S file.domaene.local /F "freigabe\ordner\*" /R /D J # Löschen des Ordners Remove-Item "$homepath" -Force -Recurse
Der Profilordner wird automatisch bei der ersten Anmeldung durch das System angelegt und befüllt. Die Berechtigungen sehen wie folgt aus:
Besitzer: domaene\benutzer
Berechtigungen: domaene\benutzer: Vollzugriff; SYSTEM: Vollzugriff
Weitere Berechtigungen existieren nicht. Vererbung ist nicht aktiviert. Führe ich den oben aufgeführten Code aus, passiert folgendes:
Zuerst wird der Besitzer des Ordners "freigabe\ordner" auf 'domaene\admin' geändert. Danach wird der Benutzer 'domaene\admin' mit Vollzugriff hinzugefügt. Unterordner wurden da noch nicht bearbeitet. Durch das zweite takeown wird der Besitzer 'domaene\admin' auf der ersten Unterordnerebene geändert (Anwendungsdaten, Cookies, Desktop, ...). Ein Löschen ist jetzt natürlich noch nicht möglich, da die Berechtigungen fehlen. Nur warum werden die Berechtigungen nicht vererbt? Warum wird der Besitzer bei einem takeown trotz der Option /R nicht komplett ersetzt, sondern nur auf dem Hauptordner und der ersten Ebene der Unterordner?
Ich bin wirklich ratlos.
- Bearbeitet notadmin Donnerstag, 27. September 2012 12:51 typo
Antworten
-
Get-Item \\file.domaene.local\freigabe\ordner | Set-Owner -Account domaene\admin -Recurse Get-ChildItem \\file.domaene.local\freigabe\ordner -Recurse | Enable-Inheritance
Set-Owner hat einen Recurse Switch, um auch den Besitz von Elementen übernehmen zu können, die man nicht lesen kann. Alle anderen cmdlets bekommen die Elemente über Get-ChildItem und haben keine Rekursion implementiert.
Somit müßten diese beiden Zeilen funktionieren.
-Raimund
- Als Antwort vorgeschlagen Peter Kriegel Dienstag, 2. Oktober 2012 11:41
- Als Antwort markiert notadmin Dienstag, 2. Oktober 2012 11:43
-
Guten Morgen,
es hat endlich funktioniert!
@Raimund
Der erste Befehl 'Get-Item' hat funktioniert, der zweite 'Get-ChildItem' hat mir eine Fehlermeldung ausgespuckt.
Get-ChildItem : Falscher Parameter. Bei Zeile:1 Zeichen:14 + Get-ChildItem <<<< "\\file.domaene.local\Freigabe\Ordner" -Recurse | Enable-Inheritance + CategoryInfo : ReadError: (\\file.domaene.local\Freigabe\Ordner:String) [Get-ChildItem], IOException + FullyQualifiedErrorId: DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
Nachdem ich allerdings den Get-Item Befehl eingegeben habe, konnte ich mit folgendem Code endlich die Berechtigungen setzen und den Ordner löschen.
$homepath = "\\file.domaene.local\Freigabe\Ordner" $inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit" $propagation = [system.security.accesscontrol.PropagationFlags]"None" $acl = Get-Acl $homepath $accesrule = New-Object system.security.AccessControl.FileSystemAccessRule("domaene\admin","FullControl", $inherit, $propagation, "Allow") $acl.AddAccessRule($accessrule) set-acl -aclobject $acl $homepath Remove-Item "$homepath" -Force -Recurse
@Livio
Das war wohl ein kleiner Typo von mir. Hatte es mit Get-ChildItem probiert, hier aber nur Get-Child geschrieben. Durch deine Nachfrage bin ich dann komplett durcheinander geraten und habe es nochmal mit Get-Child probiert. ;) Sorry.
- Bearbeitet notadmin Dienstag, 2. Oktober 2012 06:44
- Als Antwort vorgeschlagen Peter Kriegel Dienstag, 2. Oktober 2012 11:42
- Als Antwort markiert notadmin Dienstag, 2. Oktober 2012 11:43
Alle Antworten
-
Guten Morgen,
mir ist gestern leider noch was dazwischen gekommen. Also:
Get-Item \\file.domaene.local\freigabe\ordner | set-owner -account domaene\admin -- funktioniert, keine Fehlermeldung
Get-Item \\file.domaene.local\freigabe\ordner -Recurse | Enable-Inheritance -- Fehlermeldung
Get-Item : Es wurde kein Parameter gefunden, der dem Parameternamen "Recurse" entspricht. Bei Zeile:1 Zeichen:57 + Get-Item \\file.domaene.local\freigabe\ordner -Recurse <<<< | Enable-Inheritance + CategoryInfo : InvalidArgument: (:) [Get-Item], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetItemCommand
Ohne -Recurse funktioniert der Befehl, dann wird aber nur der oberste Ordner angefasst. Auf die Unterordner des Profils habe ich dann wieder keinen Zugriff.
-
Probiers mal mit Get-Childitem für den -Recurse Parameter. Für Get-Item gibt's den Parameter -Recurse nicht.
Dann solltest du auch rausfinden, ob du da überhaupt etwas löschen kannst.
Lua Programmer & Powershell Newcomer | Location: Switzerland - Beside that, whenever you see a reply, you think it's helpful, mark it as helpful! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as answer (if you opened the thread).
- Bearbeitet Livio von Büren Montag, 1. Oktober 2012 10:51
-
Werde mich gleich mit dem Get-Childitem Befehl auseinandersetzen. Danke für den Tipp.
Und löschen kann ich leider gar nichts, weil mir die Berechtigungen fehlen. Es werden immer nur die obersten zwei Ordnerebenen angefasst was Besitzer und Berechtigungen betrifft. Erst wenn ich via Ordneroptionen/Sicherheit den Besitz übernommen und den Admin mit Vollzugriff hinzugefügt habe, kann ich löschen.
-
So nebenbei: (zweite Zeile)
takeown -S file.domaene.local /F "freigabe\ordner" /R /D /J
Sry, verwechselt. Der Slash muss da weg.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think it's helpful, mark it as helpful! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as answer (if you opened the thread).
- Bearbeitet Livio von Büren Montag, 1. Oktober 2012 11:36
-
Habs gemerkt, siehe oben, habe editiert.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think it's helpful, mark it as helpful! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as answer (if you opened the thread).
-
Also mit dem Get-Child -recurse Befehl hat es auch nicht funktioniert. Egal was ich versuche, ich kriege einfach nicht hin, dass
- der Besitzer ab der dritten Ordnerebene (Profil\Anwendungsdaten\Microsoft; ab da) vom Nutzer auf den Admin geändert wird
- die Berechtigungen für den Admin ab der zweiten Ordnerebene (Profil\Anwendungsdaten; ab da) auf Vollzugriff gesetzt werden
Wie gesagt, über die Ordneroption/Sicherheit schaffe ich beides. Nur in der Powershell klappt es einfach nicht.
/edit
Unter Win2k3 funktioniert übrigens alles. Nur Win2k8R2 weigert sich. Kann das was mit der UAC und/oder dieser Warnmeldung "Dieser Ordner wird mit anderen Personen gemeinsam verwendet" zu tun haben?
- Bearbeitet notadmin Montag, 1. Oktober 2012 11:55 Edit hinzugefügt
-
Hast du wirklich Get-Child geschrieben und nicht Get-Childitem?
Ausserdem, wenn du Powershell "Als Administrator ausführen" wählst. Sollte es sowieso klappen, das empfehle ich dir auch.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).
- Bearbeitet Livio von Büren Montag, 1. Oktober 2012 12:28
-
Get-Item \\file.domaene.local\freigabe\ordner | Set-Owner -Account domaene\admin -Recurse Get-ChildItem \\file.domaene.local\freigabe\ordner -Recurse | Enable-Inheritance
Set-Owner hat einen Recurse Switch, um auch den Besitz von Elementen übernehmen zu können, die man nicht lesen kann. Alle anderen cmdlets bekommen die Elemente über Get-ChildItem und haben keine Rekursion implementiert.
Somit müßten diese beiden Zeilen funktionieren.
-Raimund
- Als Antwort vorgeschlagen Peter Kriegel Dienstag, 2. Oktober 2012 11:41
- Als Antwort markiert notadmin Dienstag, 2. Oktober 2012 11:43
-
@notadmin
Darum habe ich ja gefragt, schau mal weiter oben was ich da erwähnt habe, Get-Childitem. Von Get-Child war nie die Rede, ich weiss nicht wie du auf das überhaupt gekommen bist. So wie Raimund Andrée es geschrieben hat, hatte ich es mir auch gedacht.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).
-
Guten Morgen,
es hat endlich funktioniert!
@Raimund
Der erste Befehl 'Get-Item' hat funktioniert, der zweite 'Get-ChildItem' hat mir eine Fehlermeldung ausgespuckt.
Get-ChildItem : Falscher Parameter. Bei Zeile:1 Zeichen:14 + Get-ChildItem <<<< "\\file.domaene.local\Freigabe\Ordner" -Recurse | Enable-Inheritance + CategoryInfo : ReadError: (\\file.domaene.local\Freigabe\Ordner:String) [Get-ChildItem], IOException + FullyQualifiedErrorId: DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
Nachdem ich allerdings den Get-Item Befehl eingegeben habe, konnte ich mit folgendem Code endlich die Berechtigungen setzen und den Ordner löschen.
$homepath = "\\file.domaene.local\Freigabe\Ordner" $inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit" $propagation = [system.security.accesscontrol.PropagationFlags]"None" $acl = Get-Acl $homepath $accesrule = New-Object system.security.AccessControl.FileSystemAccessRule("domaene\admin","FullControl", $inherit, $propagation, "Allow") $acl.AddAccessRule($accessrule) set-acl -aclobject $acl $homepath Remove-Item "$homepath" -Force -Recurse
@Livio
Das war wohl ein kleiner Typo von mir. Hatte es mit Get-ChildItem probiert, hier aber nur Get-Child geschrieben. Durch deine Nachfrage bin ich dann komplett durcheinander geraten und habe es nochmal mit Get-Child probiert. ;) Sorry.
- Bearbeitet notadmin Dienstag, 2. Oktober 2012 06:44
- Als Antwort vorgeschlagen Peter Kriegel Dienstag, 2. Oktober 2012 11:42
- Als Antwort markiert notadmin Dienstag, 2. Oktober 2012 11:43
-
Na immerhin hat jetzt was geklappt, dann ist das nun auch egal.
So nebenbei, welche Version von PowerShell hast du? Bei der PowerShell 3.0 Version sollte das funktionieren mit Get-Childitem.
Zur Abfrage der Version, Get-Host eingeben.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).
-
Macht nichts, bin auch nicht der beste im PowerShell. Habe auch erst vor kurzem angefangen.
Wenn du möchtest, kannst du dir die PowerShell 3.0 runterladen, damit noch weitere Funktionen wie Get-Childitem funktionieren. Allerdings hat die PowerShell 3.0 einen antscheidenden Nachteil. Man kann die Deutsche Hilfe nur noch Online abfragen, und nicht mehr im PowerShell selber.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).
-
Werde nachher mal die PS 3.0 laden und testen. Vielleicht kann ich mein Script damit verschlanken.
Eine Sache noch: Wenn ich mittels Script Ordner löschen möchte die nicht existieren, wird mir eine Fehlermeldung um die Ohren gehauen
Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen. Bei C:\Users\admin\Desktop\powershell.ps1:47 Zeichen:21 + $acl.AddAccessRule <<<< ($accessrule) + CategoryInfo : InvalidOperation: (AddAccessRule:String) [], RunetimeException + FullyQualifiedErrorId : InvokeMethodOnNull
bzw.
Set-Acl : Das Argument kann nicht an den Parameter "AclObject" gebunden werden, da es NULL ist. Bei C:\Users\admin\Desktop\powershell.ps1:48 Zeichen:21 + Set-Acl -aclobject <<<< $acl $homepath + CategoryInfo : InvalidData: (:) [Set-Acl], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SetAclCommand
Andere Fehlermeldung (z.B. bei $acl = Get-Acl $homepath) unterdrücke ich mittels '-ErrorAction "SilentlyContinue"'. Egal an welcher Stelle ich das -ErrorAction in der entsprechenden Zeile setze, der Fehler wird einfach nicht unterdrückt.
- Bearbeitet notadmin Dienstag, 2. Oktober 2012 10:43
-
Mir kommte gerade nur diese Option in den Sinn:
If ($homepath) #Schaut ob der Pfad überhaupt existiert. { Remove-Item "$homepath" -Force -Recurse }
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).
-
Stimmt, vergesse ich immer.
The following is my signature:
Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, mark it as "Helpful"! And whenever you see a reply being an answer to the mainquestion of the thread, mark it as "Answer" (if you opened the thread).