Установите работающего пользователя в качестве владельца файла и удалите его. NET Core - PullRequest
0 голосов
/ 17 апреля 2020

Я сделал File Cleaner Windows Service (используя . NET Core 3 Worker Service, размещенный в Windows Service ). Я настроил службу на запуск от имени администратора с полным доступом.

Теперь у меня есть два веб-сайта IIS, работающих под управлением IIS APP POOL\foo и IIS APP POOL\bar пользователей соответственно. Каждый сайт имеет свои собственные папки C:\web\foo\Uploads\ и C:\web\bar\Uploads\, которые я хочу, чтобы программа очистки файлов периодически их удаляла.

Даже если я установил разрешение «Полный доступ» для папок Uploads для Administrator, вновь создаваемых файлов foo и bar все еще не могут быть удалены Администратором. Я могу вручную изменить владельца файлов в этой папке, а затем удалить их (что интересно, в проводнике файлов я могу просто удалить их без проблем), но я не знаю, как это сделать программно.

Учитывая что я могу дать любое разрешение моему запущенному приложению, как я могу установить владельца папки / файла / полный контроль для учетной записи, которая его запускает, а затем удалить ее?

1 Ответ

0 голосов
/ 18 апреля 2020

Благодаря Hereti c Обезьяне комментарию и информации из различных постов StackOverflow, я скомпилировал решение как для установки владельца файла / папки, так и для сброса его атрибутов (т. Е. Только для чтения, система):

public static class CoreUtils
{

    public static string RunningUser { get; } = $"{Environment.UserDomainName}\\{Environment.UserName}";
    public static NTAccount RunningAccount { get; } = new NTAccount(Environment.UserDomainName, Environment.UserName);

}

void SetOwner(FileInfo file)
{
    var acl = file.GetAccessControl(System.Security.AccessControl.AccessControlSections.All);

    acl.SetOwner(CoreUtils.RunningAccount);
    acl.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(
        CoreUtils.RunningUser, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));

    file.SetAccessControl(acl);
}

Также следует отметить, что, как и в связанной статье, API не поддерживает длинное имя файла, поэтому вам требуется дополнительная обработка, если ваше приложение должно работать с этими файлами.

...