2009-06-24 8 views
6

Я создал семейство сайтов внутри веб-приложения с пользователем A как администратором семейства сайтов. Я добавил ссылку на страницу сайта. По щелчку этой ссылке, которую я пытаюсь создать job.Below таймера является код выполняется по щелчку ссылкеПроблема при создании задания таймера

//Allow unsafe updates. 
SPContext.Current.Web.AllowUnsafeUpdates = true; 

//Get current web application. 
SPWebApplication webApp = SPContext.Current.Site.WebApplication; 

// Create new job. 
ArchiveJob automaticArchiveJob = new ArchiveJob(scheduleDetails.scheduleName, webApp); 

SPHourlySchedule hourlySchedule = new SPHourlySchedule(); 
hourlySchedule.BeginMinute = 0; 
hourlySchedule.EndMinute = 1; 
automaticArchiveJob.Schedule = hourlySchedule; 

//Finally update archival job. 
automaticArchiveJob.Update(); 

Теперь, когда я вошел в с пользователем A и нажмите на эту ссылку на странице «Настройки сайта» , Я получаю исключение безопасности с сообщением «Доступ запрещен» по строке automaticArchiveJob.Update(). Но если я вошел в систему с пользователем администратора (я также вошел в систему с помощью этого пользователя) и нажмите на ссылку, которая успешно создает эту работу. Также я сделал пользователя членом группы WSS_ADMIN_WPG, но все еще получал ту же проблему. Есть ли что-то еще, что мне нужно сделать для решения проблемы.

ответ

23

Ожидаемое поведение «Доступ запрещен», учитывая то, что вы пытаетесь сделать. Позвольте мне объяснить.

Когда создается экземпляр задания таймера, он сохраняется в базе данных конфигурации фермы. Доступ к этой базе данных для целей записи - это привилегированная операция; как правило, успешно выполняется только учетная запись службы фермы (то есть учетная запись, по которой выполняется OWSTIMER.EXE) или учетные записи, которые явно имеют права, необходимые для выполнения такой операции в базе данных конфигурации (обычно это администраторы).

По умолчанию попытка создания экземпляра задания таймера из контекста семейства сайтов будет терпеть неудачу. Попытка выполнить операцию в блоке привилегированных привилегий (через SPSecurity.RunWithElevatedPrivileges) приведет только к использованию контекста учетной записи пула приложений веб-приложения вместо текущего контекста пользователя; это может быть выполнено только в том случае, если учетная запись пула приложений имеет права на запись в базу данных конфигурации фермы. Если это происходит, это обычно происходит потому, что (а) учетная запись службы фермы используется в ролях, в которых она не должна находиться (например, для запуска веб-приложений контента) или (б) дополнительные разрешения были предоставлены пулу приложений Счет. Оба случая представляют собой отклонение от оптимальной рабочей модели.

Рабочие экземпляры таймера обычно создаются при включении функции «Функции» в разделе «Возможности», которые находятся на уровне фермы или WebApplication. Зачем? Поскольку эти функции обычно активируются администраторами из командной строки (при условии, что администратор также имеет права в базе данных конфигурации фермы) или из централизованного администрирования (где активация происходит через учетную запись службы фермы - гарантируется наличие прав на базу данных конфигурации). Когда функция активирована и вызывается метод FeatureActivated SPFeatureReceiver, безопасно (с точки зрения безопасности) настраивать задание таймера.

Устранение неполадок, связанных с вашей конкретной задачей, потребует поворота проблемы на голове. Вместо того, чтобы пытаться создать экземпляр задания таймера из семейства сайтов по требованию, я бы рекомендовал настроить эквивалент задания таймера «развертки» во время активации вашей функции. По общему признанию, это требует больше планирования и усилий, чем то, что вы пытаетесь сделать, но ваш текущий путь будет работать, только если безопасность будет скорректирована - и это не рекомендуется.

Когда я собирал свою флеш-память для фермы BLOB (http://blobcachefarmflush.codeplex.com), мне приходилось делать то же самое.Вы можете увидеть особенности того, как я работал с созданием заданий таймера в классе FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). Остальная часть кода и связанная с ним документация также могут помочь в решении некоторых других проблем.

Не стесняйтесь использовать то, что вы находите в любом случае; вот почему он там!

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

+0

Hey Sean Thanx для вашего ответа ..... Я нашел его очень полезным. Я обязательно спрошу, если у меня будет .... Thanx again – Anoop

+0

Как настроить и запустить это задание? – Evgeny

+0

Я администратор моего компьютера. – Evgeny

-3

я использовал RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (делегат() { });

Это работает для меня ..... Есть ли у кого-нибудь другое решение? Если это так, пожалуйста, дайте мне знать.

+0

Вы можете найти это полезным: http://stackoverflow.com/questions/638314 –

+2

Anoop смотрите пояснение от Шона выше, почему вы никогда не должны (быть в состоянии) использовать метод вы описываете здесь. Шон отлично справился с этим. –

0

Попробуйте переопределить метод SPPersistedObject.HasAdditionalUpdateAccess() и вернуть true.

protected override bool HasAdditionalUpdateAccess() { return true; }

Смежные вопросы