Время доступа к файловой системе на веб-сервере .NET - PullRequest
0 голосов
/ 21 ноября 2011

Все, у меня есть директория ~ / temp в моем веб-корне на веб-сервере.Допустим, C: \ inetpub \ myapp \ temp

, и у меня есть метод в коде класса страницы, который удаляет все файлы там.Все работает хорошо.

protected CleanTemp() {
    // clean all the files in tmp dir
    Array.Foreach...
}

Проблема в том, что если я создаю таймер в моем Global.aspx, который пытается выполнить такую ​​очистку таким же образом, система перечисляет файлы в временном каталоге, но для каждогоиз них он возвращает исключение о том, что у пользователя нет необходимых прав доступа:

[Global.aspx]

void Application_Start(object sender, EventArgs e) {
    PhisicalTmpFolder = Server.MapPath(~/temp);

    // create new timer
    System.Timers.Timer timScheduledTask = new System.Timers.Timer();
    timScheduledTask.Interval = 20 * 60 * 1000.0;
    timScheduledTask.Enabled = true;
    timScheduledTask.Elapsed += new System.Timers.ElapsedEventHandler(timScheduledTask_Elapsed);
}


void timScheduledTask_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
    // clean all the files in tmp dir
    Array.ForEach(
            Directory.GetFiles(PhisicalTmpFolder),
            delegate(string path) {
                try {
                    File.Delete(path); i++;
                } catch (Exception ex) {
                    if (_logger != null) _logger.Error(ex.Message, ex);
                }
            }
        );
}

Как я могу сказать таймеру, что он должен работать стакое же право доступа к приложению?

Заранее спасибо, Джанпьеро

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Я думаю, что проблема, с которой вы здесь столкнулись, заключается в том, что учетная запись процесса ASP.NET не имеет соответствующих прав, и у вас включена олицетворение пользователя, поэтому, когда операция инициируется во время запроса страницы, она выполняется под учетной записью пользователя,имеет права.

Попробуйте предоставить права учетной записи процесса ASP.NET этому каталогу.

1 голос
/ 28 февраля 2012

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

Здесь есть отличная запись , в которой описывается, как можно легко создатьконтекст олицетворения в блоке try / finally.

0 голосов
/ 21 ноября 2011

Проверьте, имеет ли пользователь, настроенный в пуле приложений (обычно NETWORK SERVICE), разрешение на их удаление.

...