首页 > 解决方案 > 获取 Windows 资源管理器中显示的文件/目录所有者

问题描述

当我在 Windows 资源管理器中查看文件或文件夹时,它通常将所有者显示为特定用户;在我的环境中,显示为<domain>\<username>. 当我将所有者列添加到文件夹视图时,以及通过右键单击文件并查看详细信息选项卡时,它都会显示此信息。我认为这是大多数人在考虑文件或目录的所有者时所期望看到的。

我想获取大量文件和文件夹的拥有用户信息。但是,当我按照每个教程、博客文章和论坛答案的建议以编程方式在中获取所有者时,它会将所有者显示为BUILTIN\Administrators

PS:>Get-Item '.\file.txt' | Get-Acl | Format-List

Path   : Microsoft.PowerShell.Core\FileSystem::Z:\path\to\file.txt
Owner  : BUILTIN\Administrators
Group  : <domain>\Domain Users
Access : NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
         <domain>\<myusername> Allow  FullControl
Audit  : 
Sddl   : <lots of fancy letters>

有各种帖子解释了为什么会发生 这种 情况(TL;DR:由管理员组成员的用户创建的项目),所以不需要在这里重读。而且我可以看到我真正要寻找的信息是该属性System.Security.AccessControl.FileSystemAccessRule下的对象之一。Access我正在考虑解决方法,包括从列表中过滤BUILTIN/NT AUTHORITY记录Access,或者在这个有用的问题中过滤一个类。

然而,这些解决方案似乎既低效又不优雅。在 UI 中,当我想查看项目的所有者时,Windows 似乎“知道我的意思”。因此,没有更直接的方法可以在代码中获取该信息,这似乎真的很奇怪。

Explorer 从哪里提取其所有者信息?它真的也在做某种低效的启发式列表过滤吗?

还是必须没有直接的方法来解决这个问题?

或任何语言的解决方案非常感谢!


尝试并失败:

先调用,然后再调用结果的这个问题的解决方案对我不起作用;仍然只输出。.GetAccessControl().GetOwner(typeof(System.Security.Principal.SecurityIdentifier)).Translate(typeof(System.Security.Principal.NTAccount))BUILTIN\Administrators

cmd.exe'sdir <file> /Q给出了相同的结果,正如包括这个答案在内的各个地方所建议的那样。

还发现它会$file.GetAccessControl()产生与命令行开关相同的无用信息Get-Acl

标签: c#windowspowershellsecurityfilesystems

解决方案


推荐阅读