【问题标题】:Problem in creating Timer Job创建定时器作业的问题
【发布时间】:2009-06-24 05:50:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    正确解决您的特定问题需要稍微扭转问题。与其尝试从网站集中按需实例化计时器作业,我建议您在激活功能时设置等效于“扫描”计时器作业。诚然,这比您尝试做的事情需要更多的计划和努力,但您当前的路径只有在以某种方式调整安全性的情况下才会起作用 - 不建议这样做。

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

    随意以任何方式使用您找到的内容;这就是它存在的原因!

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

    【讨论】:

    • Hey Sean 感谢您的回复.....我发现它非常有用。我一定会问我是否会有....再次感谢
    • 那么如何配置和运行这个作业呢?
    • 你具体要问什么,Evgeny? Internet 上有大量示例讨论如何创建、配置和运行计时器作业 - 包括我的 BLOB 缓存场刷新功能(如上所述)。我试图通过响应来说明这一点:计时器作业创建不会在网站集级别运行的代码中工作,除非场配置错误。
    • 几年后,这篇文章仍然是一个很好的资源。完美解释!
    【解决方案2】:

    尝试重写 SPPersistedObject.HasAdditionalUpdateAccess() 方法并返回 true。

    protected override bool HasAdditionalUpdateAccess() { return true; }

    【讨论】:

      【解决方案3】:

      我使用过 RunWithElevatedPrivileges

      SPSecurity.RunWithElevatedPrivileges(delegate() { });

      它对我有用.....有人有其他解决方案吗?如果有,请告诉我。

      【讨论】:

      • Anoop,请参阅上面 Sean 的解释,为什么您永远不应该(能够)使用您在此处描述的方法。肖恩在清楚地解释这一点方面做得很好。
      猜你喜欢
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多