Я столкнулся с очень неприятной проблемой, и мне потребовалось некоторое время, чтобы решить ее. Поскольку 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);
Так что этот код работает, если я хочу предоставить право собственности себе, но не если я хочу предоставить право собственности кому-то другому. Что делать?
Так и есть, запускал от имени администратора
Без явного включения SeRestorePrivilege мы можем назначить право собственности только текущему пользователю или любой из групп пользователей, для которых пользователь является владельцем (т. е. помечен SE_GROUP_OWNER
). Недостаточно просто иметь SeRestorePrivilege в токене пользователя. Это не одна из привилегий, которые система предоставляет нам автоматически.
Это неправда, проверьте ответ и используйте uncpath
После дальнейшего поиска в Интернете я нашел решение в этом блоге: 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.
Просто используйте мой исходный код, и вы сможете сменить владельца. Дело не в списке контроля доступа. Кроме того, блоггер говорит о powershell, но то же самое и с С#.
Ваша программа должна работать под учетной записью с достаточными разрешениями для предоставления права собственности.