Как предоставить право собственности на файлы и папки в Windows

Я столкнулся с очень неприятной проблемой, и мне потребовалось некоторое время, чтобы решить ее. Поскольку 99% интернета говорили мне, что это невозможно, и я не смог найти ответ на stackoverflow, я решил опубликовать его здесь.

Я пытался изменить владельца папки/файла на моем компьютере с Windows. Это не большая проблема, так как у DirectorySecurtiy есть хорошая функция для этого: "SetOwner()". Я заставил это работать для моей текущей учетной записи, но я не мог заставить его работать для кого-то другого. Каждый раз, когда я пытался предоставить кому-то право собственности, я получал эту ошибку: «Идентификатор безопасности не может быть владельцем этого объекта».

// Get folder or creates if not exists
DirectoryInfo dInfo = Directory.CreateDirectory(folderPath);

// Get user
IdentityReference user = new NTAccount(username);

// Set owner
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.SetOwner(user);
dInfo.SetAccessControl(dSecurity);

Так что этот код работает, если я хочу предоставить право собственности себе, но не если я хочу предоставить право собственности кому-то другому. Что делать?

Ваша программа должна работать под учетной записью с достаточными разрешениями для предоставления права собственности.

Markus Deibel 09.04.2019 14:19

Так и есть, запускал от имени администратора

Pieter 09.04.2019 14:25

Без явного включения SeRestorePrivilege мы можем назначить право собственности только текущему пользователю или любой из групп пользователей, для которых пользователь является владельцем (т. е. помечен SE_GROUP_OWNER). Недостаточно просто иметь SeRestorePrivilege в токене пользователя. Это не одна из привилегий, которые система предоставляет нам автоматически.

Eryk Sun 10.04.2019 01:35

Это неправда, проверьте ответ и используйте uncpath

Pieter 16.04.2019 10:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После дальнейшего поиска в Интернете я нашел решение в этом блоге: https://fixingitpro.com/2011/07/08/set-owner-with-powershell-%E2%80%9Cthe-security-identifier-is-not-allowed-to-the-owner-of-this -объект%E2%80%9D/

Это очень странно, и я не знаю почему, но если вы используете путь unc, это сработает.

UNC names identify network resources using a specific notation. These names consist of three parts: a host device name, a share name, and an optional file path. These three elements are combined using backslashes: \host-name\share-name\file_path

Итак, что раньше работало только для меня: D:\{имя_папки} должно было быть: \\{IP-адрес или имя сервера}\d$\{имя_папки}. Если вы протестируете точно такой же код снова, только с другим путем, он будет работать. Было бы неплохо, если бы кто-нибудь мог объяснить мне, почему маршрутизация обратно на ваш компьютер работает по обычному пути, а не по нему.

Не забудьте запустить приложение от имени администратора

Я не могу воспроизвести то, что показал пост этого блоггера, поскольку использовал эти командлеты для большого количества изменений ACL.

Maximilian Burszley 09.04.2019 14:30

Просто используйте мой исходный код, и вы сможете сменить владельца. Дело не в списке контроля доступа. Кроме того, блоггер говорит о powershell, но то же самое и с С#.

Pieter 09.04.2019 14:36

Другие вопросы по теме