Получение права собственности на файлы с "сломанными" разрешениями
Я пытаюсь преодолеть следующую ситуацию.
Задается каталог, хранящийся на томе NTFS, где:
- владельцем каталога является кто-то другой (например, непривилегированный пользователь)
- каталог DACL настроен для разрешения доступа к определенной группе людей, которая не включает систему или администраторов
- DACL в каталоге фактически не предоставляет никому доступа, чтобы либо стать владельцем, либо изменить DACL
(или короче, все администраторы были заблокированы из папки)
Но!
-
Учетная запись, под которой я работаю, имеет административные права (SeBackupPrivilege, SeSecurityPrivilege)
- существующий DACL можно игнорировать, так как я все равно пишу новый
- использование других инструментов (вынос.exe), я могу получить доступ к каталогу, о котором идет речь.
(или, короче говоря, у меня есть доступ к исправлению DACL / владельца)
У меня не должно быть проблем со следующим код:
WindowsIdentity privilegedUser = System.Security.Principal.WindowsIdentity.GetCurrent();
// I cannot use File.GetAccessControl() as I get access denied
// (working as intended! I have no access to read the ACL!)
// so I have to write a new ACL:
FileSecurity acl = new FileSecurity();
acl.SetOwner(admin.User);
acl.AddAccessRule(new FileSystemAccessRule(privilegedUser.User, FileSystemRights.FullControl, AccessControlType.Allow));
File.SetAccessControl("c:\path\to\broken", acl);
Но, вызовSetAccessControl вызываетUnauthorizedAccessException . Когда я изменяю его, чтобы только настроить владельца, происходит то же самое. Когда я только пытаюсь настроить DACL, то же самое.
Я проверил, что проблема не является UAC, проверив результирующий процесс в Обозревателе процессов, и проверил, что группа администраторов имеет значение "владелец" вместо "отключено"."Я должен иметь все необходимые права для этого (резервного копирования Операторы должны быть посторонними в лице администраторов, но я добавил его для тестирования) - но он просто продолжает бросать отказ в доступе.
Соответствующая документация technet: http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx
- " Если вы являетесь владельцем объекта,вы можете предоставить любому пользователю или группе безопасности любое разрешение на этот объект, включая разрешение на владение." Собственность может быть передана следующими способами::
- в текущий владелец может предоставить разрешение на владение другому пользователю, позволяя ему в любое время стать владельцем. Пользователь должен фактически стать владельцем для завершения передачи. (к сожалению, владелец не может переназначить право собственности в этой ситуации.)
- администратор может стать владельцем. Пользователь, обладающий правом восстановления файлов и каталогов, может назначить права собственности любому пользователю или группе.
- возможность стать владельцем файлов и другие объекты-это еще один случай, когда потребность администратора в обслуживании системы имеет приоритет над правом владельца контролировать доступ. Обычно вы можете стать владельцем объекта только в том случае, если его текущий владелец дает вам на это разрешение. Владельцы объектов NTFS может разрешить другому пользователю, чтобы взять на себя ответственность путем предоставления другого пользователя взять разрешение собственности; собственники объектов Active Directory, может предоставить другому пользователю изменять разрешения владельца. Пользователь, обладающий этой привилегией, может стать владельцем объект без разрешения текущего владельца. По умолчанию привилегия назначается только встроенной группе администраторов. Он обычно используется администраторами для принятия и перераспределения прав собственности на ресурсы, когда их текущий владелец больше не доступен.
Чего мне здесь не хватает?
2 ответа:
У меня была та же проблема, и я просто отправил сюда сообщение для всех, кто может прийти сюда в поисках, как я:
Необходимо явно включить SeTakeOwnershipPrivilege в коде. Я обнаружил, что привилегии процесса действительно полезны при работе с такого рода вещами.
Вот как он исправил мой код (похоже, по какой-то причине, хотя у меня есть привилегия, процесс не делает этого, если я явно не разрешаю его):
using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) { directoryInfo = new DirectoryInfo(path); directorySecurity = directoryInfo.GetAccessControl(); directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User); Directory.SetAccessControl(path, directorySecurity); }
PS: спасибо Саймон.. твой ответ дал мне место, чтобы ... начнем с этого.
Вы должны принять на себя ответственность, прежде чем добавить доступ.
using (var user = WindowsIdentity.GetCurrent()) { var ownerSecurity = new FileSecurity(); ownerSecurity.SetOwner(user.User); File.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); var accessSecurity = new FileSecurity(); accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); File.SetAccessControl("c:\\path\\to\\broken", accessSecurity); }
Кроме того, если вы устанавливаете DirectorySecurity, вам понадобится это
using (var user = WindowsIdentity.GetCurrent()) { var ownerSecurity = new DirectorySecurity(); ownerSecurity.SetOwner(user.User); Directory.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); var accessSecurity = new DirectorySecurity(); accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); Directory.SetAccessControl("c:\\path\\to\\broken", accessSecurity); }
Если это не сработает, попробуйте это
Http://blog.mikeobrien.net/2009/11/taking-ownership-and-setting-admin.html