2009-06-24 38 views
6

我已經在用戶A作爲網站集管理員在Web應用程序內創建了網站集。我在網站功能頁面中添加了一個鏈接。在那個鏈接我想創建一個定時器job.Below的點擊是,當我登錄的用戶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(); 

的點擊現在執行的代碼,我收到安全例外消息「拒絕訪問」,郵件號碼爲automaticArchiveJob.Update()。 但是,如果我以管理員用戶(我也使用此用戶登錄到計算機)登錄並單擊它成功創建作業的鏈接。 我還讓WSS_ADMIN_WPG組的用戶A成員仍然遇到同樣的問題。我還需要做些什麼來解決這個問題。

回答

23

「拒絕訪問」是預期的行爲,具體取決於您嘗試執行的操作。請允許我解釋一下。

創建計時器作業實例時,它將持久保存到服務器場配置數據庫。訪問該數據庫用於寫入目的是一項特權操作;根據經驗,只有農場服務帳戶(即OWSTIMER.EXE執行的帳戶)或明確具有在配置數據庫(通常爲管理員)上執行此操作所需權限的帳戶才能成功。

默認情況下,嘗試從站點集合上下文中實例化計時器作業將失敗。嘗試在提升的權限塊中操作(通過SPSecurity.RunWithElevatedPrivileges)只會導致使用Web應用程序的應用程序池帳戶上下文而不是當前的用戶上下文;這隻有在應用程序池帳戶有權寫入服務器場配置數據庫時纔會成功。如果發生這種情況,通常是因爲(a)服務器場服務帳戶正在用於不應該在其中的角色(例如,運行內容Web應用程序),或者(b)已嚮應用程序池授予額外權限帳戶。這兩種情況均表明與最佳實踐經營模式存在偏差。

計時器作業實例通常在特徵激活時創建,特徵範圍在服務器場或Web應用程序級別。爲什麼?由於這些功能通常由管理員通過命令行(假設管理員在服務器場配置數據庫中擁有權限)或從管理中心(通過服務器場服務帳戶進行激活 - 保證有權訪問配置數據庫)。當功能激活並調用SPFeatureReceiver的FeatureActivated方法時,從安全角度來看,安全定時器作業是安全的。

正確解決您的特定問題將涉及到將問題轉向一點點。與其試圖按需要在網站集內實例化計時器作業,我建議在激活功能時設置等效的「掃描」計時器作業。誠然,這需要比你想要做的更多的計劃和努力,但是你的當前路徑只有在安全性以某種方式被調整時纔會起作用 - 並且這不被推薦。

當我將BLOB緩存服務器場刷新功能(http://blobcachefarmflush.codeplex.com)放在一起時,我不得不親自做同樣的事情。您可以在FeatureReceiver類(BlobCacheFarmFlushSweepJobFeatureReceiver)中看到我如何通過創建計時器作業的具體細節。其他代碼和相關文檔也可能有助於解決其他一些挑戰。

隨意使用你發現的任何方式;這就是爲什麼它在那裏!

我希望有幫助。如果出現後續問題,請儘快解決,我會盡我所能回答:-)

-3

我已經使用RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges(委託() { });

它適用於我.....有沒有人有另一種解決方案?如果有,請讓我知道。

+0

你會發現這個有用:http://stackoverflow.com/questions/638314 – 2009-06-24 10:27:03

+2

Anoop,看到肖恩上面爲什麼你永遠不應該(能夠)說明使用在這裏描述的方法。肖恩清楚地解釋了這一點,做了很好的工作。 – 2012-03-15 10:48:54

0

嘗試覆蓋SPPersistedObject.HasAdditionalUpdateAccess()方法並返回true。

protected override bool HasAdditionalUpdateAccess() { return true; }