взять на себя ответственность за файл c #

Я пытаюсь стать владельцем файла и удалить его через C #. Файл iexplorer.exe, текущий владелец по умолчанию - TrustedInstaller. Метод FileSecurity.SetOwner, кажется, устанавливает указанное владение, но на самом деле несменить первоначального владельца и не исключение. Очевидно, что следующая попытка удаления файла вызывает исключение. Что нужно изменить в коде, чтобы стать владельцем файла и удалить его?

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
fileS.SetOwner(new System.Security.Principal.NTAccount(Environment.UserDomainName, Environment.UserName));
File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
 Hans Passant21 окт. 2012 г., 18:00
Какие'что происходит с UAC здесь? Вы работаете на возвышении?
 alternative27 окт. 2012 г., 21:17
Да и незнаетТ помочь. Вам нужно установить права, а затем удалить данный файл. Решение здесь:msdn.microsoft.com/en-us/magazine/...

Ответы на вопрос(3)

Надежно, безопасно и эффективно управляйте привилегиями в управляемом коде

    private bool TryDeleteFile(string fileName)
    {
        string filePath = Path.GetFullPath(fileName);
        var fi = new FileInfo(filePath);

        bool ownerChanged = false;
        bool accessChanged = false;
        bool isDelete = false;

        FileSecurity fs = fi.GetAccessControl();
        Privilege p = new Privilege(Privilege.TakeOwnership);

        try
        {
            p.Enable();
            fs.SetOwner(WindowsIdentity.GetCurrent().User);
            File.SetAccessControl(filePath, fs); //Update the Access Control on the File
            ownerChanged = true;
        }
        catch (PrivilegeNotHeldException ex) { }
        finally { p.Revert(); }

        try
        {
            fs.SetAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, AccessControlType.Allow));
            File.SetAccessControl(filePath, fs);
            accessChanged = true;
        }
        catch (UnauthorizedAccessException  ex) { }

        if (ownerChanged && accessChanged)
        {
            try
            {
                fi.Delete();
                isDelete = true;
            }
            catch (Exception ex) {  }
        }

        return isDelete;
    }
        string filepath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe";

        //Get Currently Applied Access Control
        FileSecurity fileS = File.GetAccessControl(filepath);

        //Update it, Grant Current User Full Control
        SecurityIdentifier cu = WindowsIdentity.GetCurrent().User;
        fileS.SetOwner(cu);
        fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow));

        //Update the Access Control on the File
        File.SetAccessControl(filepath, fileS);

        //Delete the file
        File.Delete(filepath);

Добавьте следующий импорт

        using System.IO;
        using System.Security.AccessControl;
        using System.Security.Principal;

Запустите код в повышенном режиме.

 Joe Gayetty19 мар. 2019 г., 20:40
Я перепробовал все другие предложения по владению файлом - предложения на этой странице, которые предполагают, что я буду использовать сторонний класс, и с других веб-сайтов, но у меня работали только ваши! Спасибо! (Я пропустил часть file.delete, так как просто хотел стать владельцем по другим причинам.)

SeTakeOwnershipPrivilege

Требуется вступить во владение объектом без предоставления дискреционного доступа. Эта привилегия позволяет устанавливать значение владельца только для тех значений, которые держатель может на законных основаниях назначить владельцем объекта. Право пользователя: взять на себя ответственность за файлы или другие объекты.

Предлагаю вам прочитать отличную статью, написанную Марком Новаком:Надежно, безопасно и эффективно управляйте привилегиями в управляемом коде.

И / или взглянуть на егообразец.

Обновить

Пример использования:

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");

Privilege p;
bool ownerChanged = false;
try
{
    p = new Privilege(Privilege.TakeOwnership);
    p.Enable();

    fileS.SetOwner(new System.Security.Principal.NTAccount(
        Environment.UserDomainName, Environment.UserName));

    ownerChanged = true;
}
catch(PrivilegeNotHeldException e)
{
   // privilege not held
   // TODO: show an error message, write logs, etc.
}
finally
{
    p.Revert();
}

if (ownerChanged)
    File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
 TripleAntigen15 мая 2016 г., 05:17
Ссылка на статью не работает, но вы все равно можете получить ее в форме CHM, прокрутив вниз до этой страницы:msdn.microsoft.com/magazine/msdn-magazine-issues и нажмите на март 2005 года. После сохранения щелкните правой кнопкой мыши на нем, и в свойствах вам нужно разблокировать, в противном случае он будет пустым. Кроме того, исходный код связан изнутри CHM в файле .exe всех вещей, похоже, его необходимо установить по любой причине.
 alternative21 окт. 2012 г., 19:44
Спасибо, Николай. Кто то'Рабочий код по-прежнему приветствуется.
 Nikolay Khil21 окт. 2012 г., 20:11
@altravel Мой ответ содержит ссылку на Маркас реализациейPrivilege Класс среди примеров кода. Я неЯ думаю, что я должен скопировать и вставить около 1 тыс. строк кода здесь. Хотя я'Мы обновили мой ответ примером использования.

Ваш ответ на вопрос