none
Berechtigungen werden nicht vererbt / Löschen nicht möglich RRS feed

  • 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
    Donnerstag, 27. September 2012 12:48

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
    Montag, 1. Oktober 2012 20:48
  • 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
    Dienstag, 2. Oktober 2012 06:43

Alle Antworten

  • Hi,


    schon mal [File System Security PowerShell Module 2.1 http://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85] angesehen?


    -Raimund

    Donnerstag, 27. September 2012 13:41
  • Noch nicht, mache mich aber gleich ran. Vielen Dank schon mal!
    Donnerstag, 27. September 2012 14:09
  • 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.

    Freitag, 28. September 2012 06:03
  • 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).


    Montag, 1. Oktober 2012 10:49
  • 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.

    Montag, 1. Oktober 2012 11:26
  • 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).



    Montag, 1. Oktober 2012 11:30
  • Das J ist kein Schalter, sondern dient als Bestätigung (j = ja) für den takeown-Befehl. Ohne J kommt immer die Abfrage, ob ich das auch wirklich machen möchte.
    Montag, 1. Oktober 2012 11:32
  • 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).




    Montag, 1. Oktober 2012 11:33
  • 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
    Montag, 1. Oktober 2012 11:53
  • 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).





    Montag, 1. Oktober 2012 12:27
  • Get-Child scheint gar nicht zu existieren.

    Die Benennung "Get-Child" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.

    Montag, 1. Oktober 2012 12:42
  • 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
    Montag, 1. Oktober 2012 20:48
  • @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).




    Dienstag, 2. Oktober 2012 06:19
  • 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
    Dienstag, 2. Oktober 2012 06: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).




    Dienstag, 2. Oktober 2012 06:51
  • Version 2.0

    Und sorry falls ich mich hier und da etwas dämlich angestellt habe, war mein erstes Mal dass ich mit der PowerShell gearbeitet habe. ;)

    Dienstag, 2. Oktober 2012 06:52
  • 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).




    Dienstag, 2. Oktober 2012 06:55
  • 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
    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).




    Dienstag, 2. Oktober 2012 10:58
  • Top, das war ein Wink mit dem richtigen Zaunpfahl. Musste allerdings noch etwas hinzufügen.

    If (test-path $homepath)
    {
    Remove-Item "$homepath" -Force -Recurse
    }

    Dienstag, 2. Oktober 2012 11:08
  • 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).




    Dienstag, 2. Oktober 2012 11:09