Страницы

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

понедельник, 6 января 2020 г.

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

#c_sharp


Написал код, который чудесно узнает текущего владельца файла, но никак не хочет его
менять на какого-либо другого. 
Судя по 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.

В случае, когда текущий владелец файла Браток, программа справляется с задачей и
меняет владельца на любого другого в системе.
То есть сменить владельца с Браток на Пользователь - это не проблема.
Проблема в том, чтобы провести операцию по смене владельца с Пользователь на Браток.
    


Ответы

Ответ 1



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

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

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