即使以管理员身份运行 Get-ChildItem 时也会收到“访问被拒绝”

即使以管理员身份运行 Get-ChildItem 时也会收到“访问被拒绝”

我正在尝试使用以下 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 的日志文件,其权限已损坏(无法查看权限,或获取权限/所有权)。启动到安全模式并删除文件解决了该问题。

相关内容