Назад | Перейти на главную страницу

Доступ к диску в Планировщике заданий

Я запускаю несколько консольных приложений с помощью планировщика задач. Это приложения, которые выполняют небольшие служебные задачи и работают как консольные приложения C #.

Сами приложения работают отлично (т.е. одно из них выводит электронные письма в конце своего запуска, и я получаю эти электронные письма), но у меня возникают проблемы с их правильным логированием. Они используют Log4Net, и конфигурация выглядит нормально, потому что, если я запускаю их вручную, они создают журналы правильно.

Однако, когда я запускаю их под той же учетной записью (подтвержденной проверкой диспетчера процессов) в планировщике задач, они не создают никаких журналов. Это как если бы им не хватало правильных привилегий (но не выкидывали исключения, потому что они выполняются нормально) или планировщик задач каким-то образом изолировал записи на диск и никогда не позволял им касаться фактического диска.

Первоначально я пытался записать в% AppData%, но я прочитал, что у планировщика задач есть проблемы с пользовательскими переменными. Итак, я жестко запрограммировал пути к c: \ BackOffice \ Logs, однако это нисколько не изменило неудачное поведение. D:

Любые идеи? Это Microsoft Server 2008 R2 Datacenter, работающий на AWS EC2.

Вот конфигурация log4net, если это поможет:

<?xml version="1.0" encoding="utf-8"?>

<log4net>
  <appender name="ConsoleAppender"
              type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
    </layout>
  </appender>
  <appender name="FileAppender"
              type="log4net.Appender.FileAppender">
    <file value="c:\BackOffice\Logs\LogName_log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="FileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>

</log4net>

Наконец я нашел свою проблему. Текущий рабочий каталог не был каталогом приложения, поэтому log4net никогда не мог найти файл конфигурации. К счастью, в планировщике задач есть необязательное поле, которое позволяет вам установить начальный каталог для вашей задачи.

Похоже на проблему UAC, с которой я только что имел дело - я нашел ваш вопрос, пока искал ответ!

В моем случае мне пришлось запустить запланированный запрос с установленным флажком «Запускать с наивысшими привилегиями». Это работало с учетной записью администратора, потому что с UAC токен администратора с более высокими привилегиями может читать / записывать файлы других пользователей (в данном случае - файлы другого администратора). Я протестировал и обнаружил, что если задача была запланирована для запуска под тем же пользователем, что и пользователь, владеющий файлом / каталогом, это работало даже без токена «наивысших привилегий».

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

Дополнительные исследования, и похоже, что каталог% alluserprofile% - это то место, куда вы должны поместить данные «этого компьютера», а не данные «для каждого пользователя» в каталоге% appdata%. Так что, возможно, размещение его там решит вашу проблему.