Назад | Перейти на главную страницу

Рекурсивно установить владельца по имени папки Powershell

У меня проблема с сохранением на нашем файловом сервере, где владелец NTFS не был скопирован правильно, это профили Citrix UPM, я нашел сценарий для этого, но он не работает рекурсивно:

    $Path = "\\fs01\profiles$\"

 cls

 $Log = "C:\setowner.log"
 Add-Content -Value "$(Get-Date): Script begins" -Path $Log
 Add-Content -Value "$(Get-Date): Processing folder: $Path" -Path $Log

 $Dirs = Get-ChildItem -Path "$Path\*" -recurse | Where { $_.PSisContainer }
 $UserError = @()
 ForEach ($Dir in $Dirs) 
 { $User = Split-Path $Dir.Fullname -Leaf 
 Try 
 { Add-Content -Value "$(Get-Date): Testing $($User): $($Dir.Fullname)" -Path $Log 

 $Test = Get-ADUser $User -ErrorAction Stop 
 $ACL = Get-Acl $Dir -ErrorAction Stop 

 #Set owner to user 
 $ACL.SetOwner([System.Security.Principal.NTAccount]$User) 
 Set-Acl -path $Dir -AclObject $ACL -ErrorAction Stop 
 Add-Content -Value "$(Get-Date): Owner $User set successfully" -Path $Log 
 } 
 Catch 
 { Add-Content -Value "$(Get-Date): Unable to process $($Dir.Fullname) because $($Error[0])" -Path $Log 
 }
 } 
 Add-Content -Value "$(Get-Date): Script completed" -Path $Log

Я установил "-recurse" в строке 9, но, конечно, это не сработает, так как сценарий попытается установить владельцем самую глубокую папку, например: \ fs01 \ profiles $ \ username \ citrix \ folderxyz -> Скрипт попытается установить владельца на «folderxyz», но он должен установить его на «имя пользователя».

Он должен быть в строках 12-14:

{ $User = Split-Path $Dir.Fullname -Leaf 
 Try 
 { Add-Content -Value "$(Get-Date): Testing $($User): $($Dir.Fullname)" -Path $Log 

Я не знаю, как я смог достичь своей цели, и я ничего об этом не нашел ... Надеюсь, кто-то может помочь ... Спасибо!

Я нашел решение своей проблемы, не совсем автоматизацию, но это сработало ...

Я использовал Software Set-ACL Studio, я мог одним щелчком увидеть владельца папки и сбросить владельца для всех дочерних элементов, это сработало отлично, конечно, было много щелчков, и у меня ушло около 30 минут. , но теперь проблема решена ...

Скачать Set-Acl Studio: https://helgeklein.com/download/

Документация Set-Acl Studio: https://helgeklein.com/setacl-studio/

Спасибо!

Почему вы получаете ADUser и не используете его?

Вам понадобится вложение для каждой итерации папок профиля.

Не проверено:

$Path = "\\fs01\profiles$\"
$Log  = "C:\setowner.log"

Add-Content -Value "$(Get-Date): Script begins" -Path $Log
Add-Content -Value "$(Get-Date): Processing folder: $Path" -Path $Log


ForEach ($UserProfile in (Get-ChildItem -Path "$Path\*"|Where {$_.PSisContainer })){
    $ADUser = Get-ADUser $UserProfile.Name -ErrorAction Stop 

    ForEach ($Dir in (Get-ChildItem -Path $USerProfile.FullName -recurse|Where {$_.PSisContainer})) { 
        Try { 
            Add-Content -Value "$(Get-Date): Testing $($User): $($Dir.Fullname)" -Path $Log 

            $ACL = Get-Acl $Dir -ErrorAction Stop 

            #Set owner to user 
            $ACL.SetOwner([System.Security.Principal.NTAccount]$ADUser) 
            Set-Acl -path $Dir -AclObject $ACL -ErrorAction Stop 
            Add-Content -Value "$(Get-Date): Owner $User set successfully" -Path $Log 
        } catch { 
            Add-Content -Value "$(Get-Date): Unable to process $($Dir.Fullname) because $($Error[0])" -Path $Log 
        }
    }
}   
Add-Content -Value "$(Get-Date): Script completed" -Path $Log

Возможно, вам потребуется добавить еще одну попытку получить ADUser.