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