Страницы

Поиск по вопросам

вторник, 12 февраля 2019 г.

Как узнать и поменять владельца файла?

Написал код, который чудесно узнает текущего владельца файла, но никак не хочет его менять на какого-либо другого. Судя по MSDN, все прописано так, как надо. Но не работает.
Вот код:
using System; using System.IO; using System.Security.Principal;
namespace GET_SET_OWNER { class Program { public static bool GetOwner(string File_UNC) { Console.WriteLine("Текущий владелец:"); var File_Security = File.GetAccessControl(File_UNC); var SID = File_Security.GetOwner(typeof(SecurityIdentifier)); Console.WriteLine(SID);
var Owner = SID.Translate(typeof(NTAccount)); Console.WriteLine(Owner); return true; }
public static bool SetOwner(string File_UNC) { Console.WriteLine(Environment.NewLine + "Задаем нового владельца..." + Environment.NewLine); var New_Owner = new NTAccount("Home", "Браток"); var File_Security = File.GetAccessControl(File_UNC); File_Security.SetOwner(New_Owner);
try { File.SetAccessControl(File_UNC, File_Security); } catch (InvalidOperationException) { return false; } return true; }
static void Main(string[] args) { const string File_UNC = @"D:\1.txt"; bool res_1 = false, res_2 = false, res_3 = false;
res_1 = GetOwner(File_UNC); res_2 = SetOwner(File_UNC); res_3 = GetOwner(File_UNC); Console.WriteLine("{0} {1} {2}", res_1, res_2, res_3); Console.ReadLine(); } } }
Есть у кого-нибудь идеи? Функция SetOwner при каждой попытке изменить текущего владельца выдает System.InvalidOperationException: Идентификатору безопасности запрещено быть владельцем данного объекта и возвращает false. При этом, если менять владельца файла на текущего, то есть, например,(Пользователь) - это текущий владелец, меняем на (Пользователь), то функция проделывает свою работу и возвращает true
В случае, когда текущий владелец файла Браток, программа справляется с задачей и меняет владельца на любого другого в системе. То есть сменить владельца с Браток на Пользователь - это не проблема. Проблема в том, чтобы провести операцию по смене владельца с Пользователь на Браток


Ответ

Хорошие вопросы редкость.
Проблема вот в чем. Для того чтобы стать владельцем объекта файловой системы, пользователь должен иметь право становиться владельцем либо быть администратором. Если условия выполнены - пользователь может назначать себя и только себя владельцем объекта ФС.
Для того чтобы назначить владельцем другого пользователя - нужны права на восстановление объектов ФС. По умолчанию эти права отключены даже для администратора. Собственно поэтому у вас и получается переназначить владельца на себя и не получается наоборот.
Собственно решение проблемы - назначить процессу или пользователю, от чьего имени запускается процесс, права на восстановление объектов ФС.
В сети на эту тему информация 5-7 летней давности, но похоже что до сих пор ни чего не поменялось и .NET не предоставляет средств для получения этих прав, но можно воспользоваться средствами WinAPI. Одно из таких решений на которое часто ссылаются можно посмотреть в блоге salamandersoft а также в ответе @VladD тут

Комментариев нет:

Отправить комментарий