Когда я смотрю на файл или папку в проводнике Windows, он обычно показывает владельца как определенного пользователя c; в моем окружении отображается как <domain>\<username>
. Эта информация отображается как при добавлении столбца «Владелец» в представление папки, так и при щелчке правой кнопкой мыши по файлу и просмотре вкладки «Сведения». Я думаю, это то, что большинство людей ожидают увидеть, когда думают о владельце файла или каталога.
Я хочу получить эту информацию о владельце для большого количества файлов и папок. Однако, когда я делаю то, что каждый учебник, сообщение в блоге и ответ на форуме предлагает программно получить Владельца в powershell , он показывает Владельца как 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 под капотом?
Или не должно быть прямого подхода к этому?
Решения в powershell , c# или любой . net язык с благодарностью принят!
Попытка и ошибка:
Решение в этом вопросе о вызове .GetAccessControl().GetOwner(typeof(System.Security.Principal.SecurityIdentifier))
сначала, а затем .Translate(typeof(System.Security.Principal.NTAccount))
о результате у меня не сработало; по-прежнему выводит только BUILTIN\Administrators
.
cmd.exe
* dir <file> /Q
дает то же самое, что предлагается в различных местах, включая этот ответ .
Также обнаружили, что $file.GetAccessControl()
выдает ту же бесполезную информацию, что и командлет Get-Acl
.