递归更改所有者窗口7


91

不知何故,我不小心将子文件夹中的所有文件设置为“No Owner”,我似乎无法更改所有权限。我可以通过更改所有者然后设置权限手动更改一个但是如何更改所有文件的所有者在这个目录中?

Answers:


87

使用 takeown 从命令提示符获取所有权的文件夹,所有子文件夹和文件递归:

takeown /f "c:\folder\subfolder" /r

这很有效,但如果您不以管理员身份运行命令行控制台,则可能会因您不拥有的文件而失败。


99

要修复真正损坏的权限,最好是一个接一个地运行这两个命令:

takeown /f "C:\path\to\folder" /r
icacls "C:\path\to\folder" /reset /T

第一个将为您提供所有文件的所有权,但这可能是不够的,例如,如果所有文件的读/写/执行权限都设置为“拒绝”。您拥有这些文件,但仍然无法对它们执行任何操作。

在这种情况下,运行第二个命令,它将修复损坏的权限。


3
优秀的技术建议......您的解决方案是唯一有效的解决方案。再次感谢。
carrabino

4
最好的建议,需要同时使用takeown和icacls。
gnac

1
/如果您希望将“所有权授予管理员组而非当前所有者”,则选项很有用。您需要具有管理员权限才能执行此操作。可能需要使用ctrl-shift-enter打开cmd窗口。
PeterVermont

3
我添加了 /D Y 参数来 takeown 所以它会自动确认你没有'list directory'权限的递归目录。
Jeroen Wiert Pluimers

2
@JeroenWiertPluimers,虽然这是一个很好的建议我已经删除了编辑,因为它(愚蠢地)一个本地化的参数所以在英文Windows上它将是 /D Y,在法国人 /D O,也许是西班牙语 /D S
this.lau_

26

请注意,不推荐使用cacls(因为Windows Vista?),它建议您使用 icacls

此命令将递归重置文件夹的权限:

icacls "C:\path\to\folder" /reset /T

5

您可以使用 cacls 从命令提示符:

cacls "C:\path\to\folder" /E /T /C /G "Administrator":F

/T switch允许它以递归方式运行。更换 Administrator 与您希望授予权限的用户。


1

我遇到路径很长(大于256个字符)的文件有问题。这两个命令

takeown /f "C:\path\to\really_long_folder_name" /r
icacls "C:\path\to\really_long_folder_name" /reset /T

除了这些具有很长路径和名称的文件外,它们都工作。我最终重命名了

"C:\path\to\really_long_folder_name"

"C:\path\to\r"

然后跑

takeown /f "C:\path\to\r" /r /D Y
icacls "C:\path\to\r" /grant Everyone:(F) /t /c /q

之后我可以将文件夹重命名为更合理的东西。 takeown's / D Y对提示回答是。对于icacls,我使用/ grant来给所有人提供完全访问权限(因为我只是试图从死机上访问硬盘驱动器上的数据),使用/ t处理子文件夹和文件,/ q以安静模式运行(隐藏成功)和/ c显示错误。我重复了这个过程,重命名文件夹,直到所有文件权限都成功更新。

希望这有助于遇到类似于“未能枚举容器访问中的对象”的错误的人在尝试从旧硬盘访问数据时遇到的错误。


0

感谢@this.lau_为/ reset提示,这正是我需要完成我的脚本以获取CSC的所有权并对其进行备份。在获得C:\ Windows \ CSC的所有权之后,权限往往在继承方面变得非常不一致 - / reset开关直接为我修复了这个问题。

Function Copy-CSCData {
    $Datetime = Get-Date -Format yyyyMMdd.hhmmss
    $LogPath = 'PATH TO LOG'
    $CSCSource = 'C:\Windows\CSC\v2.0.6\namespace'
    $Dest = 'DESTINATION PATH'
    $icaclsource = "\\?\" + $CSCSource

    $CSCLogfile = "$LogPath\" + "$Datetime" + "_CSCRobocopy.log"

    icacls.exe $icaclsource /reset /T
    icacls.exe $icaclsource /grant :r "Everyone:(OI)(CI)F"

    Robocopy $CSCSource $Dest /Copy:DATSO /E /XO /Z /LOG+:$CSCLogfile /V /FP /NP /R:2 /W:2 /XF "~$*","*.tmp"
}

@Thesle Williams - 如果你从上面查看$ icaclsource变量,你会发现我在源路径前添加了“\?\”。通过在前面添加它,它将接受更长的文件名。这也是我遇到的一个问题,但是这个问题解决了!干杯。

玩笑


欢迎来到超级用户!只是让你知道“ping”用户只能在帖子的评论中使用,而不是 实际的帖子。很遗憾,除非您有自己的帖子或问题的答案,否则您无法发表评论 50+声誉 。看到 评论@replies如何运作? 。请注意,您不能只在评论中ping任何人。只有该帖子的作者和已经评论过的任何其他用户。
robinCTS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.