Получить владельца файла / каталога, как показано в Windows Explorer - PullRequest
1 голос
/ 21 апреля 2020

Когда я смотрю на файл или папку в проводнике Windows, он обычно показывает владельца как определенного пользователя c; в моем окружении отображается как <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 или, возможно, фильтрацию по классу, как в этот полезный вопрос .

Однако эти решения кажутся как неэффективными, так и неэффективными. В пользовательском интерфейсе Windows, кажется, «знает, что я имею в виду», когда я хочу увидеть владельца элемента. Поэтому кажется странным, что нет более простого способа получить эту информацию в коде.

Откуда Explorer получает информацию о своем владельце? Действительно ли она выполняет неэффективную фильтрацию списков heuristi c под капотом?

Или не должно быть прямого подхода к этому?

Решения в , или любой язык с благодарностью принят!


Попытка и ошибка:

Решение в этом вопросе о вызове .GetAccessControl().GetOwner(typeof(System.Security.Principal.SecurityIdentifier)) сначала, а затем .Translate(typeof(System.Security.Principal.NTAccount)) о результате у меня не сработало; по-прежнему выводит только BUILTIN\Administrators.

cmd.exe * dir <file> /Q дает то же самое, что предлагается в различных местах, включая этот ответ .

Также обнаружили, что $file.GetAccessControl() выдает ту же бесполезную информацию, что и командлет Get-Acl.

...