是否可以列出我无权访问的所有权限

Jas*_*ore 5 windows powershell permissions ntfs access-control-list

我正在寻找一种方法来递归遍历我的整个文件共享(相当大的 3TB 文件)并列出我无权访问的所有文件/文件夹。由于迁移和大路径(超过 255 个字符)上的一些错误,我们发现一些文件夹/文件丢失了所有权限,需要一种方法来找到它们。目前作为域管理员用户,我无法列出权限或所有者。我可以控制它并重置权限,但是我有太多的文件/文件夹,我想将其输出到 CSV 文件或其他内容。

我试过以下:

get-childitem "\,\fileshare\f$\folder\etc" -recurse | get-acl
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,它为我提供了所有存在并对其具有适当权限的文件/文件夹的 ACL。但是一旦它进入我无权访问的文件夹,我就会收到以下错误:

Get-Acl : Attempted to perform an unauthorized operation.
At line:1 char:133
+ get-childitem "\,\fileshare\f$\folder\etc" -re
curse | get-acl <<<<
    + CategoryInfo          : NotSpecified: (:) [Get-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetAclCommand
Run Code Online (Sandbox Code Playgroud)

这些是我想记录到 CSV/TXT 文件中的错误,并忽略所有其余的权限,如果每个错误方式也可以以更多行输出,那将是理想的。

只是想知道是否有人对我应该如何进行有想法或提示?

(请注意上面的路径中有逗号是故意不解析为真实路径

\,\fileshare\f$\folder\etc)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rya*_*ies 1

有很多不同的方法可以做到这一点。这是我刚煮的东西。

$Error.Clear()      # This is a global variable!
$Errors = @()
$Items = Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue
ForEach($Err In $Error)
{
    $Errors += $Err.Exception
}
ForEach($Item In $Items)
{
    Try
    {
        $Item | Get-ACL -ErrorAction SilentlyContinue | Out-Null
    }
    Catch
    {
        $Errors += "$($_.Exception.Message) $($Item.FullName)"
    }
}    
Write-Host $Errors.Count "errors encountered."
$Errors | Out-File errors.txt
Run Code Online (Sandbox Code Playgroud)

现在,您已经获得了在 Get-ChildItem 过程或 Get-ACL 过程中遇到的所有错误的清晰列表,这很重要,因为在每个操作期间都可能遇到不同的错误。您可以将 $Errors 变量通过管道输出到 CSV 或您想要的任何内容。在 3TB 网络共享上运行可能需要很长时间。考虑添加进度表。