Вопрос

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

//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().Но если я войду в систему под именем пользователя administrator (я также вошел в систему на компьютере под этим пользователем) и нажму на ссылку, она успешно создаст задание.Также я сделал пользователя участником WSS_ADMIN_WPG группа, но все еще сталкиваешься с той же проблемой.Есть ли что-нибудь еще, что мне нужно сделать, чтобы решить проблему?

Это было полезно?

Решение

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

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

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

Экземпляры заданий таймера обычно создаются во время активации компонента в области функций на уровне фермы или веб-приложения. Зачем? Поскольку эти функции обычно активируются администраторами либо из командной строки (при условии, что администратор также имеет права в базе данных конфигурации фермы), либо из центра администрирования (где активация происходит через учетную запись службы фермы), гарантированно иметь права на базу данных конфигурации ). Когда функция активирована и вызван метод FeatureActivation объекта SPFeatureReceiver, можно безопасно (с точки зрения безопасности) настроить задание таймера.

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

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

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

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

Другие советы

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

защищенное переопределение bool HasAdditionalUpdateAccess () {   вернуть истину; }

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

SPSecurity.Выполнить с сохраненными привилегиями (делегировать() { });

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top