У меня проблема с сохранением на нашем файловом сервере, где владелец 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.