我正在尝试使用 Powershell 以递归方式更改文件夹的所有者。
我基本上使用这个代码:
$acct1 = New-Object System.Security.Principal.NTAccount('DOMAIN\Enterprise Admins')
$profilefolder = Get-Item MyFolder
$acl1 = $profilefolder.GetAccessControl()
$acl1.SetOwner($acct1)
set-acl -aclobject $acl1 -path MyFolder
这将改变第一级的所有权,但不会改变任何子文件夹或文件的所有权。有没有办法将范围扩大到所有内容MyFolder
?
答案1
takeown 命令正是您要执行的操作。它是一个常规的 Windows 实用程序。
此代码片段将所有权应用于当前用户,但您可以将其设置为您想要的任何用户。
http://technet.microsoft.com/en-us/library/cc753024(v=ws.10).aspx
takeown /f "c:\folder\subfolder" /r
如果遇到问题,请确保您以管理员权限运行 cmd/powershell 窗口。这同样适用于其他特定于 powershell 的答案。
答案2
Set-ACL cmdlet 将从管道中获取路径参数,因此推荐的方式是通过管道传输目录的内容来设置每个项目的所有者:
dir -r c:\Users\goyuix\temp | set-acl -aclobject $acl1
这将以递归方式设置我的配置文件中临时目录中所有文件夹/文件的所有者。
答案3
用于Get-ChildItem
获取所有下属文件夹和文件,并更改每个文件夹和文件的所有者:
$identityReference = [System.Security.Principal.NTAccount]::new('<new-owner-username>')
Get-Item C:\Path\To\Folder |
ForEach-Object { $_ ; $_ | Get-ChildItem -Force -Recurse } |
ForEach-Object { $acl = $_ | Get-Acl; $acl.SetOwner($identityReference); $_ | Set-Acl -AclObject $acl }
我认为这也是takeown.exe
GUI 基本上要做的事情。
警告:为了实现此功能,您需要具有读取文件夹内容和 ACL 的权限。(我认为 takeown 和 GUI 在某些情况下可以解决某些(明确的)缺失权限问题。)
奖励:在 Windows 10/2016+ 上,你可以设置注册表项和可能不会遭受260 个字符的文件路径长度限制使用 PowerShell 时。