我有一个权限问题,在我们的文件服务器上,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
我在第 9 行设置了“-recurse”,但这当然不起作用,因为脚本会尝试将所有者设置为最深的文件夹,例如:\fs01\profiles$\username\citrix\folderxyz-> 脚本将尝试将所有者设置为“folderxyz”,但它应该将其设置为“username”。
它应该在第 12-14 行:
{ $User = Split-Path $Dir.Fullname -Leaf
Try
{ Add-Content -Value "$(Get-Date): Testing $($User): $($Dir.Fullname)" -Path $Log
我不知道如何才能实现我的目标,而且我没有找到任何有关此内容的信息...我希望有人可以提供帮助...谢谢!
答案1
我找到了解决我的问题的方法,虽然实际上没有任何自动化,但它确实有效......
我使用了软件集-ACL Studio,我可以单击一下查看文件夹的所有者并重置所有子项目的所有者,这个功能非常完美,当然需要多次点击,大约花了我 30 分钟,但问题现在已经解决了......
下载 Set-Acl Studio:https://helgeklein.com/download/
文档集-Acl Studio:https://helgeklein.com/setacl-studio/
谢谢你!
答案2
为什么要获得 ADUser 但不使用它呢?
您将需要一个封闭的 forEach 迭代配置文件文件夹。
未经测试:
$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
您可能需要添加另一个 try catch 来获取 ADUser。