http://www.cnblogs.com/sygwin/archive/2011/12/23/2299640.html
在上面的链接中,我写了关于如何自定义一个简单的Timer job。这个是在我自己电脑里完成的,一切都很顺利。可是到客户这里就不行了。
在feature的激活事件里,调用update()时提示拒绝访问。即使我使用SPSecurity.RunWithElevatedPrivileges提升权限也不行。经过google总结如下:
首先,要正确理解SPSecurity.RunWithElevatedPrivileges提升的权限是什么。在sharepoint 2010 提供了两种类型数据库,一种是内容数据库(Content Database),一种是配置数据库,默认名字应该叫Sharepoint_Config。
内容数据库,顾名思义,就是存放sharepoint中的内容的,比如列表数据,上传的文档等。配置数据库就是存放全局配置的,它在安装sharepoint的时候生成,而且就一个。
SPSecurity.RunWithElevatedPrivileges提示的权限指的是往内容数据库写数据的权限。比如,当你更新或添加列表项时,提示拒绝访问,使用该功能提升权限基本都可以解决。但是配置数据库的写入权限则不是该方法可以提升的。而计时器(Timer Job)则需要在配置数据库里写入数据,它也就无能为力了。
对于配置数据的对应的级别是场或应用程序,而内容数据库对应的是网站集或网站。换句话说,最好将timer job对应的feature注册范围设置为场或应用程序级别,这么做可能会解决您的问题。Kaneboy回答我的问题时,曾说说网站集级别的feature事件接收器无法注册计时器。我想就是这个原因。
而我的计时器注册范围是网站集,而且我试图将其设置或场或应用程序级别,仍然不行。那么我只要保持网站集级别的部署范围,然后想办法提示权限了。
经查证:1.在配置数据库里写入数据,需要数据库账号拥有wss_content_application_pools角色,参考:http://www.sharepointsecurity.com/sharepoint/sharepoint-security/fixing-access-denied-errors-with-sharepoint-2010-timer-jobs/
2.还有人建议说将我的应用程序池和管理中心应用程序池账号设为一致,这个方法不适合我,毕竟是在客户环境中,这个是下下策。
微软的一篇文章提到这样的问题,好像是建议用stsadm来部署和激活feature,这个我觉得也不好,有兴趣的可以参考:
http://msdn.microsoft.com/zh-cn/library/cc427068.aspx
3.在微软网站上,还有另外一个解决办法,这个我试了一下完全可以。
可参考http://support.microsoft.com/kb/2564009
4.也是我采用的方法,很简单。在继承SPJobDefinition的类中,重写HasAdditionalUpdateAccess()方法,如下:
protected override bool HasAdditionalUpdateAccess()
{
return true;
}
第二个问题,就是计时器的Execute方法不执行。这个原因很简单,就是对于的计时器服务没有启动。可以再命令提示符里输入:
net start sptimerv4
如图提示,无法启动,那就需要进入:开始--管理工具--服务 找到SharePoint 2010 Timer,在登录选项卡中更改账户,重新启动了。
参考http://technet.microsoft.com/en-us/library/ff182790.aspx
第三个问题,更新计时器后,重新部署,执行结果并不是最新的。这个也简单,重启一下IIS,如果还不行,就重启sptimerv4
参考代码:https://files.cnblogs.com/sygwin/DocLibStatistics.rar 仅供参考,切勿硬套。
更多参考:
http://dotnetfinder.wordpress.com/2010/07/24/creatingcustomsharepointtimerjob2010/
http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx
http://social.msdn.microsoft.com/Forums/en/sharepointdevelopment/thread/696a640f-4b8d-44ce-a970-e05bd45c437f
http://social.technet.microsoft.com/Forums/lv-LV/sharepoint2010programming/thread/554f0878-51cc-4caa-9812-82260a5afcd9
http://www.sharepointblues.com/2010/10/22/custom-spjobdefinition-and-access-denied-error/