sharepoint - 创建定时器作业的问题

标签 sharepoint moss scheduled-tasks timer-jobs access-denied

我在 Web 应用程序中创建了一个网站集,用户 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() 处收到带有消息“拒绝访问”的安全异常。 .
但是,如果我使用管理员用户登录(我也使用此用户登录到机器)并单击链接,它会成功创建作业。
我也让用户成为 WSS_ADMIN_WPG 的成员(member)组,但仍然遇到同样的问题。还有什么我需要做的事情来解决这个问题。

最佳答案

鉴于您尝试执行的操作,“拒绝访问”是预期行为。请允许我解释一下。

创建计时器作业实例后,它会持久保存到场配置数据库中。出于写入目的访问此数据库是一项特权操作;根据经验,只有场服务帐户(即执行 OWSTIMER.EXE 的帐户)或明确具有对配置数据库执行此类操作所需权限的帐户(通常是管理员)才会成功。

默认情况下,尝试从网站集上下文中实例化计时器作业将会失败。在提升的权限块中尝试操作(通过 SPSecurity.RunWithElevatedPrivileges)只会导致使用 Web 应用程序的应用程序池帐户上下文而不是当前用户上下文;仅当应用程序池帐户有权写入场配置数据库时,这才会成功。如果发生这种情况,通常是因为 (a) 农场服务帐户被用于它不应处于的角色(例如运行内容 Web 应用程序),或者 (b) 已向应用程序池授予额外权限帐户。这两种情况都代表了与最佳实践运营模式的偏差。

计时器作业实例通常在功能激活时在功能范围内创建于场或 Web 应用程序级别。为什么?因为这些功能通常由管理员从命令行(假设管理员在场配置数据库中也有权限)或从管理中心内(通过场服务帐户进行激活 - 保证对配置数据库具有权限)激活)。当 Feature 被激活并调用 SPFeatureReceiver 的 FeatureActivated 方法时,设置计时器作业是安全的(从安全角度来看)。

正确解决您的特定问题将涉及稍微扭转问题。我建议不要尝试根据需要从网站集中实例化计时器作业,而是建议在您的功能激活时设置等效的“扫描”计时器作业。诚然,这需要比您尝试做的更多的计划和努力,但是您当前的路径只有在以某种方式调整安全性的情况下才能发挥作用——这是不推荐的。

当我将我的 BLOB 缓存场刷新功能 (http://blobcachefarmflush.codeplex.com) 放在一起时,我自己也不得不做同样的事情。您可以在 FeatureReceiver 类 (BlobCacheFarmFlushSweepJobFeatureReceiver) 中查看我如何创建计时器作业的详细信息。其余的代码和相关文档也可能有助于解决出现的其他一些挑战。

随意使用您发现的任何方式;这就是为什么它在那里!

我希望这有帮助。如果有后续问题,请开火,我会尽我所能回答:-)

关于sharepoint - 创建定时器作业的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036589/

相关文章:

javascript - MOSS 2007 中 InfoPath 表单中的数字签名是否更简单?

SharePoint "Thread was being aborted"循环遍历 SPListItemCollection

c# - 在 C# 中注册新任务不起作用

javascript - 动态创建选择类

javascript - 为什么 Sharepoint 在复制到剪贴板时会意外重新加载页面?

c# - 如何使用 C# 访问共享点数据?

php - 在 windows server 2003 上设置 PHP cron 作业

c# - 从命令行运行带有参数的exe

sharepoint - CALM 查询获取任意年份的特定日期和月份

web-services - 通过 List Webservice 更新列表项来触发 SharePoint 工作流