.NET создает запланированную задачу на сервере с ошибкой E_ACCESSDENIED

У меня есть веб-сайт ASP.NET (на C #), который принимает пользовательские данные, а затем пытается создать запланированную задачу Windows. Конечно, это отлично работает на машине DEV, но не работает на сервере. Я пытаюсь выяснить, какие разрешения требуются пользователю ASPNET (или анонимному веб-пользователю) для создания задач.

Ошибка:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 
Stacktrace: 
    at MyScheduler.NewWorkItem(String TaskName, Guid& rclsid, Guid& riid, Object& obj) 
    at MyScheduler.CreateTask(String name)

Я провел некоторый поиск, и предлагаемое решение - использовать флаг 'impersonate' в web.config, чтобы заставить приложение запускаться от имени пользователя с достаточными разрешениями, в отличие от учетной записи ASPNET, которая может не иметь этих разрешений.

Пример:

<system.web>
    <identity impersonate="true" />
</system.web> 

К сожалению, это не решает проблему. Из документации, которую я прочитал, это должно работать от имени анонимного веб-пользователя, но кажется, что у пользователя недостаточно прав.

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

<system.web>
    <identity impersonate="true" userName="WindowsDomain\YourUserName" password="YourPassword" />
</system.web> 

Это позволило приложению успешно создать запланированную задачу Windows. Итак, очевидно, что с правильным набором разрешений Windows 2003 я могу заставить приложение работать так, как оно работает в среде разработки. Однако я не собираюсь размещать учетные данные учетной записи администратора сети или компьютера в виде обычного текста в файле Web.config.

Кто-нибудь знает, какие именно разрешения необходимо установить, чтобы учетная запись ASPNET вела себя так, как нужно?

РЕДАКТИРОВАТЬ: Win32 API используется для создания запланированных задач.


person Jay S    schedule 20.01.2009    source источник
comment
Какой метод вы используете для создания запланированных задач? Win32, команда AT, команда SCHTASKS?   -  person Kev    schedule 20.01.2009
comment
Хорошая точка зрения! Мы используем Win32 API. Я отредактирую это в вопросе.   -  person Jay S    schedule 20.01.2009


Ответы (4)


Вместо того, чтобы беспокоиться о разрешениях пользователей ASPNET, позволит ли ваш внутренний процесс создать учетную запись для конкретной машины и предоставить туда учетные данные?

person Chris Stewart    schedule 20.01.2009
comment
Я согласен, создание фиктивной учетной записи для запуска задачи было бы вариантом. Однако для этой фиктивной учетной записи по-прежнему требуются правильные разрешения. На данный момент я понимаю, что включение пользователя в группу администраторов работает, но мне нужно знать, какие конкретные разрешения требуются для учетной записи. - person Jay S; 20.01.2009

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

  1. Добавьте <identity impersonate="true" /> в Web.config
  2. Добавьте пользователя IUSR (который является пользователем, от имени которого приложение будет работать с олицетворением) в группу «Операторы резервного копирования».

Это дает приложению доступ к папке «Запланированные задачи», чтобы они могли создавать и запускать задачу.

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

person Jay S    schedule 26.01.2009

Вы что-то пишете в журнал событий? Возможно, ваш компонент (который, как я полагаю, размещен в IIS?) Не имеет доступа к записи чего-либо в журнал событий.

Это всего лишь предположение ~ некоторое время назад я столкнулся с похожей проблемой, и я решил ее следующим образом:

Нажмите

person Frederik Gheysels    schedule 20.01.2009

Другой вариант - прошить биос на сервере

person Community    schedule 10.03.2009