baktosh
Goto Top

Owner von Unterordner + Dateien lässt sich nicht ändern

Hallo zusammen,

folgendes Szenario habe ich, für das ich eine Lösung bräuchte, da meine eigenen Ansätze in den letzten Tage nicht wirklich gefruchtet haben, weil ich hier noch Blutiger Anfänger bin und es aktuell das ist, was ich mir bis jetzt zusammenklauben konnte.

Ich möchte per Script den Users und Profiles Ordner von ausgeschiedenen Mitarbeitern löschen.

Das was ich bis jetzt selbst geschafft habe, ist das er diverse Prüfungen zum Bestand des AD-Users, dem noch vorhandensein der 2 relevanten Ordner auf unseren verschiedenen File-Servern macht und heraussucht untern welchen Pfaden er die beiden relevanten Ordner gefunden hat.

Ebenso habe ich es bis jetzt geschafft, dass mir mein Script den Owner der beiden "Top-Ordner" ändert und einem Administratorkonto Vollzugriff auf die Ordner, Unterordner & Dateien zuweist.

Mein Problem ist jetzt, dass ich es nicht schaffe den Owner der Unterordner und Dateien zu ändern.

Mein Scrip schaut wie folgt aus, ist an ein paar Stellen noch Baustelle da ich aktuell Schritt für Schritt vorgehe

### Deklaration der zu prüfenden Laufwerkspfade ###
$UserToDelete = Read-Host "Anmeldename des zu löschenden Users"  
$DeleteFolders = @("\\Pfad_zum\users$\$UserToDelete","\\Pfad_zum\usersextern$\$UserToDelete", "\\Pfad_zum\profiles$\$UserToDelete.V6", "\\Pfad_zum\wsprofiles$\$UserToDelete.V6", "\\Pfad_zum\shprofiles$\$UserToDelete.V6")  
$CheckFolders=@("\\Pfad_zum\users$","\\Pfad_zum\usersextern$","\\Pfad_zum\profiles$","\\Pfad_zum\shprofiles$","\\Pfad_zum\wsprofiles$")  

$username = Get-ADUser -Filter {SamAccountName -eq $UserToDelete} -ErrorAction SilentlyContinue

### Prüfen ob der zu löschende User in der AD vorhanden ist und löschen der entsprechenden Verzeichnisse###
### Wenn nicht in AD vorhanden Prüfung ob dennoch Users / Profiles Ordner noch vorhanden ist ###
if ($username) {
    $result = Get-ChildItem -directory –path $CheckFolders | where {($_ -like "*$UserToDelete*")}  
    if ([string]::IsNullOrEmpty($result)) {
        Write-Warning -Message "Für den Account - $UserToDelete - konnten keine Verzeichnisse gefunden werden.  
        Es existiert daher nur noch der AD-Account. Möchten Sie diesen nun ebenfalls löschen?"  
    } else {

    Write-Host ""  
    Write-Host "Es wurden folgende Verzeichnisse gefunden"  
    Write-Host ""  
    Get-ChildItem -directory –path $CheckFolders | where {($_ -like "*$UserToDelete*")} | Select-Object -ExpandProperty Fullname  
    Write-Host ""  
    }

foreach ($folder in $DeleteFolders) {
        if (Test-Path $folder) {
            Do {
            $delete = Read-Host "Soll der Ordner $Folder gelöscht werden (y/n)?"  
            Write-Host ""  
               }
            while (($delete -eq "") -or ($delete -eq $null))  
            if ($delete -eq "y") {  

                $acl = Get-Acl $folder 
                $ar = New-Object System.Security.Principal.NTAccount("Administrators")  
                $acl.SetOwner($ar)
                Set-Acl $folder $acl

                $acl = Get-Acl $folder
                $ar = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl","ContainerInherit, ObjectInherit","None","Allow")  
                $acl.SetAccessRule($ar)
                Set-Acl $folder $acl 
                
                Write-Host "Ordner $folder wurde gelöscht."  
                Write-Host ""  
            } Else {
                Write-Host "Ordner $folder nicht gelöscht."  
                Write-Host ""  
            }
          }
        }
} else {
    Write-Warning -Message "Der Account - $UserToDelete - ist NICHT in der AD vorhanden.  
            Im nächsten Schritt wird geprüft ob der User / Profile Ordner dennoch existieren"  
            Pause
            Write-Host ""  
            Write-Host "Es wurden folgende Verzeichnisse gefunden"  
            Write-Host ""  
            Get-ChildItem -directory –path $CheckFolders | where {($_ -like "*$UserToDelete*")} | Select-Object -ExpandProperty Fullname  
            Write-Host ""  
foreach ($folder in $DeleteFolders) {
        if (Test-Path $folder) {
            Do {
            $delete = Read-Host "Soll der Ordner $Folder gelöscht werden (y/n)?"  
            Write-Host ""  
               }
            while (($delete -eq "") -or ($delete -eq $null))  
            if ($delete -eq "y") {  
                Get-ChildItem $folder -Recurse | ForEach {
                $acl = Get-Acl $folder
                $ar = New-Object System.Security.Principal.NTAccount("Administrators")  
                $acl.SetOwner($ar)
                Set-Acl $folder $acl

                $acl = Get-Acl $folder
                $ar = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl","ContainerInherit, ObjectInherit","None","Allow")  
                $acl.SetAccessRule($ar)
                Set-Acl $folder $acl
                }
                                
                Write-Host "Ordner $folder wurde gelöscht."  
                Write-Host ""  
            } Else {
                Write-Host "Ordner $folder nicht gelöscht."  
                Write-Host ""  
            }
          }
        }
}


Wie gesagt der Code ist an einigen Stellen noch nicht fertig.

Primär arbeite ich aktuell am Teilkonstrukt ab dem Else bzw. dem unteren Bereich wenn der User nicht mehr in der AD vorhanden ist. Auch fehlt natürlich noch der Remove-String.

Wenn mir also hier einer mit ein bisserl Code aushelfen könnte der es mir ermöglicht auch für die Unterordner und Dateien den Owner auf den von mir gewünschten Administratoraccount zu setzen, wäre das super klasse.


Vielen Dank schon einmal im Voraus

Content-ID: 5946715688

Url: https://administrator.de/forum/owner-von-unterordner-dateien-laesst-sich-nicht-aendern-5946715688.html

Ausgedruckt am: 20.04.2025 um 18:04 Uhr

Dirmhirn
Lösung Dirmhirn 12.02.2023 um 06:46:46 Uhr
Goto Top
Hi,

hast du takeown schon eingebaut? Damit konnte ich noch jeden Ordner löschen. Manchmal brauchts 2 Durchläufe.

Sg Dirm
colinardo
colinardo 13.02.2023 aktualisiert um 15:48:13 Uhr
Goto Top
Servus,
die Besitzübernahme des Ordners als Besitzer ist gar nicht nötig und überflüssiger Balast im Skript, man muss das Skript nur mit einem Account ausführen der lokale Admin-Rechte auf dem Server des Shares hat und dann das Backup-Privilege-Token im aktuellen Kontext aktivieren, dann lassen sich Ordner egal mit welchen Berechtigungen oder Besitzern sie dort versehen sind löschen, auch wenn die Vererbung unterbrochen ist. So macht das übrigens auch Robocopy wenn man dort den Schalter /B verwendet.
# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# add privilege tokens to current session (SeTakeOwnershipPrivilege / SeBackupPrivilege / SeRestorePrivilege)
Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

# recursively remove folder
remove-item \\server\testshare\ordner -Recurse -Force -verbose

Grüße Uwe
Baktosh
Baktosh 15.02.2023 um 13:06:15 Uhr
Goto Top
Hallo Dirm,

vielen Dank für den Input.

Damit hat es nun mit ein bisschen finetuning vom Code funktioniert.