我正在寻找一种方法来递归遍历我的整个文件共享(相当大的3TB文件)并列出我无法访问的所有文件/文件夹.由于迁移和大路径上的一些错误(超过255个字符),我们发现一些文件夹/文件已丢失所有权限,并且需要一种方法来查找所有权限.目前,作为域管理员用户,我无法列出权限或所有者.我可以控制它,并重置权限,但我有很多文件/文件夹我想将其输出到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
这些是我想要记录到CSV / TXT文件的错误,并忽略所有其他权限,如果每个错误方式也可以输出更多的一行,那将是理想的.
只是想知道是否有人有想法或暗示我应该如何进行?
(请注意上面的路径中有逗号用于不解析真实路径
\,\fileshare\f$\folder\etc)
谢谢!
将cmdlet特定错误捕获到文件的更简单且更少混淆的方法是使用-Errorvariable参数.它内置于大多数cmdlet中.查看$Error变量是不可靠的,因为它是一个全局变量,并且很有可能被powershell过程中的其他未减轻的错误所污染.
> gci_errors.csv – 包含枚举文件夹的错误
> 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标头,它反映了导致问题的文件夹路径.您可以编写一个cmdlet,即Fix-DirPerms和管道.就像是:
Import-CSV -Path c:\Temp\gci_errors.csv | Fix-DirPerms