我正在尝试使用以下 powershell 命令在外部硬盘驱动器上的根目录上进行递归来删除诸如 desk.ini、Thumbs.db 等文件:
Get-ChildItem -Path . -Include Thumbs.db, Picasa.ini, .picasa.ini, AlbumArt_*.jpg, AlbumArtSmall.jpg, desktop.ini, Folder.jpg -Recurse -Name -Force | Remove-Item -Force
但我一直收到以下错误:
Get-ChildItem : Access is denied
At line:1 char:1
+ Get-ChildItem -Path . -Include Thumbs.db, Picasa.ini, .picasa.ini, Al ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommand
我启动 powershell(运行上述命令)的命令提示符是以管理员身份运行的,所以我不知道为什么仍然出现“拒绝访问”提示。
即使我删除该Remove-Item
部分仅列出与这些文件名匹配的文件,仍然会出现上述错误。
我还尝试添加-Verbose
标签来查看抛出“拒绝访问”的文件夹是否被列出,但没有。
有什么想法可以让我使上述命令发挥作用吗?
答案1
最有可能的是,当递归尝试访问各种为了与旧程序向后兼容而存在的目录连接。它们的名称对应于旧版 Windows 中的系统插件,而它们的目标指向当前版本。有些是系统范围的:
小路 | 目标 |
---|---|
C:\Documents and Settings |
C:\Users |
C:\用户\Default User |
C:\用户\Default |
目录:\ProgramData\Application Data |
C:\ProgramData |
目录:\ProgramData\Desktop |
C:\用户\公共\Desktop |
目录:\ProgramData\Documents |
C:\用户\公共\Documents |
目录:\ProgramData\Start Menu |
C:\ProgramData\Microsoft\Windows\Start Menu |
目录:\ProgramData\Templates |
C:\ProgramData\Microsoft\Windows\Templates |
C:\用户\所有用户\Application Data |
C:\ProgramData |
C:\用户\所有用户\Desktop |
C:\用户\公共\Desktop |
C:\用户\所有用户\Documents |
C:\用户\公共\Documents |
C:\用户\所有用户\Start Menu |
C:\ProgramData\Microsoft\Windows\Start Menu |
C:\用户\所有用户\Templates |
C:\ProgramData\Microsoft\Windows\Templates |
有些是针对每个用户的:
小路 | 目标 |
---|---|
$env:用户配置文件\Application Data |
$env:用户配置文件\应用程序数据\Roaming |
$env:用户配置文件\Cookies |
$env:用户配置文件\应用程序数据\本地\微软\的Windows\INetCookies |
$env:用户配置文件\Local Settings |
$env:用户配置文件\应用程序数据\Local |
$env:用户配置文件\My Documents |
$env:用户配置文件\Documents |
$env:用户配置文件\NetHood |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \Network Shortcuts |
$env:用户配置文件\PrintHood |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \Printer Shortcuts |
$env:用户配置文件\Recent |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \Recent |
$env:用户配置文件\SendTo |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \SendTo |
$env:用户配置文件\Start Menu |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \Start Menu |
$env:用户配置文件\Templates |
$ env:用户配置文件\应用程序数据\漫游\微软\的Windows \Templates |
至于为什么Access Denied
在尝试查看内容时会抛出错误探索者或通过Get-ChildItem
,这是由于 ACL(访问控制列表)包括
- 拒绝所有人
List folder/read data
正如链接的参考资料所解释的那样:
这些连接点可以通过以下方式识别:
它们设置了 FILE_ATTRIBUTE_REPARSE_POINT、FILE_ATTRIBUTE_HIDDEN 和 FILE_ATTRIBUTE_SYSTEM 文件属性。
他们还设置了访问控制列表 (ACL),以拒绝所有人的读取权限。
如果具有所需的权限,调用特定路径的应用程序可以遍历这些连接点。但是,尝试枚举连接点的内容将导致失败。重要的是,备份应用程序不要遍历这些连接点,也不要尝试备份它们下的数据,原因有二:
这样做可能会导致备份应用程序多次备份相同的数据。
它还可能导致循环(循环引用)。
如上所述,只有读取 ( List folder/read data
) 权限被拒绝。因此,虽然尝试查看Documents and Settings
会引发错误,但您横穿通过在地址栏或Run
对话框中键入来指定这些连接点。例如(假设子文件夹名称有效):
C:\Documents and Settings\%UserName%
%UserProfile%\My Documents\Manuals
%UserProfile%\My Documents\My Music\Abba
都可以。您还可以访问目标文件夹中的文件:
%UserProfile%\My Documents\ToDo.txt
事实上,当你Effective Access
从高级安全对话框中检查时,你可以做任何事情但查看/列出内容:
答案2
我遇到过类似的情况。一个“损坏”的文件(拒绝允许我修改权限)导致整个递归失败,并出现“访问被拒绝”错误。我逐个文件夹检查 C 下的文件夹,直到出现错误,然后对每个额外的文件夹重复检查,直到我找到有问题的文件。原来是 Splunk Universal Forward 的日志文件,其权限已损坏(无法查看权限,或获取权限/所有权)。启动到安全模式并删除文件解决了该问题。