1

我正在尝试使用功能区按钮从列表中运行计时器作业,然后单击该按钮会弹出一个页面。在该页面加载上,我已赋予 runwithelevatedprivileges 和job.runnow(). 我在生产环境中遇到拒绝访问异常,但在系统测试中运行良好。请参阅以下代码:

 SPWebApplication mainWebApp = SPContext.Current.Site.WebApplication;
 bool b = mainWebApp.RunningJobs.Cast<SPRunningJob>().Any(curRunningJob => curRunningJob
                    .JobDefinitionTitle.Equals("JobName"));
                try
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        SPJobDefinition job = mainWebApp.JobDefinitions.Cast<SPJobDefinition>().
                            FirstOrDefault(i => i.DisplayName.Equals("JobName"));
SPContext.Current.Web.AllowUnsafeUpdates = true;
                                job.RunNow();//getting access denied exception at this line 
4

1 回答 1

0

TimerJobs 是 Farm (configdb) 项目。
因此,要对他们做任何事情,您需要成为农场管理员。这意味着当前用户必须是场管理员(然后您甚至可能会遇到挑战,具体取决于您使用的身份验证方法)。
或者运行 Web 应用程序的应用程序池的服务帐户必须是农场管理员并使用 runwithelevatedpriviledges,出于明显的安全原因,这是一个糟糕的主意。
或者您需要在某处存储一些农场管理员并从中创建一个上下文(这也对安全性、性能和可维护性不利)。
我强烈建议您查看您的解决方案以避免需要从 Web 界面触发计时器作业。

于 2016-09-29T22:51:35.377 回答