通过文件夹名称递归设置所有者 Powershell

通过文件夹名称递归设置所有者 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

我在第 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。

相关内容