是否有可能列出我没有访问权限的所有权限

我正在寻找一种recursion方式来遍历我的整个文件共享(相当大的3TB的文件),并列出所有我没有访问的文件/文件夹。 由于迁移和一些大的path错误(超过255个字符),我们发现一些文件夹/文件已经失去了所有的权限,并需要一种方法来find他们。 目前作为域pipe理员用户,我无法列出权限或所有者。 我可以控制它,并重置权限,但我有这么多文件/文件夹我想输出到CSV文件或其他东西。

我已经尝试了以下内容:

get-childitem "\,\fileshare\f$\folder\etc" -recurse | get-acl 

这似乎工作得很好,它给了我存在的所有文件/文件夹的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 

这些是我想logging到CSV / TXT文件的错误,并且忽略所有剩余的权限,如果这可能以更多的错误输出到一行中,这将是理想的。

只是想知道如果有人有一个想法或暗示我应该如何进行?

(请注意上面的path中有逗号,目的是不解决真正的path

 \,\fileshare\f$\folder\etc) 

谢谢!

通过使用-Errorvariable参数,将特定于cmdlet的错误捕获到文件中的方法更容易,也更简单。 它被构build到大多数cmdlet中。 查看$ Errorvariables是不可靠的,因为它是一个全局variables,并且很有可能被PowerShell过程中的其他未解决的错误染色。

下面的代码将logging2个日志文件中的错误。

  1. gci_errors.csv – 包含列举文件夹的错误
  2. gacl_errors.csv – 包含在特定文件/文件夹中列举ACL的错误。

     Get-ChildItem C:\Temp -Recurse -ErrorAction SilentlyContinue -ErrorVariable gci_errors | ForEach-Object { $_ | Get-Acl -ErrorAction SilentlyContinue -ErrorVariable gacl_errors } $gci_errors | Select-Object -ExpandProperty CategoryInfo | Export-Csv -NoTypeInformation -Path C:\Temp\gci_errors.csv $gacl_errors | Select-Object -ExpandProperty CategoryInfo | Export-Csv -NoTypeInformation -Path C:\Temp\gacl_errors.csv 

我已根据您的要求将输出更改为CSV文件。 它更容易分析和导入,以便对数据运行命令。 CSV有一个名为Target的colum标题,它反映了导致您遇到问题的文件夹path。 您可以编写一个cmdlet,即Fix-DirPerms和pipe道。 就像是:

  Import-CSV -Path c:\Temp\gci_errors.csv | Fix-DirPerms 

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

 $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 

因此,现在您可以获得Get-ChildItem进程或Get-ACL进程中遇到的所有错误的清单,这是非常重要的,因为在每个操作过程中都会遇到不同的错误。 您可以将$ Errorsvariables输出到CSV或任何您想要的。 这可能需要很长时间才能在3TBnetworking共享上运行。 考虑添加一个进度表。