2009-06-24 29 views
6

Tôi đã tạo bộ sưu tập trang web bên trong ứng dụng web với người dùng A làm người quản trị tuyển tập site. Tôi đã thêm một liên kết trong trang tính năng của trang. Khi được nhấp liên kết mà tôi đang cố gắng để tạo ra một bộ đếm thời gian job.Below là mã thực thi trên nhấp vào liên kếtSự cố khi tạo Công việc hẹn giờ

//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(); 

Bây giờ khi tôi đăng nhập với người dùng A và nhấp vào liên kết đó trên trang 'Cài đặt trang web' , Tôi nhận được một ngoại lệ bảo mật với thông báo "Truy cập bị từ chối" tại dòng automaticArchiveJob.Update(). Nhưng nếu tôi đăng nhập với người dùng quản trị viên (tôi cũng đã đăng nhập vào máy bằng người dùng này) và nhấp vào liên kết để tạo thành công công việc đó. Ngoài ra tôi đã làm cho người dùng Một thành viên của nhóm WSS_ADMIN_WPG nhưng vẫn nhận được cùng một vấn đề. Có điều gì khác mà tôi cần phải làm để giải quyết vấn đề.

Trả lời

23

Hành vi "Truy cập bị từ chối" là hành vi được mong đợi cho những gì bạn đang cố gắng thực hiện. Cho phép tôi giải thích.

Khi một cá thể công việc hẹn giờ được tạo, nó được lưu giữ trong cơ sở dữ liệu cấu hình trang trại. Việc truy cập cơ sở dữ liệu này cho các mục đích ghi là một hoạt động đặc quyền; theo quy tắc, chỉ tài khoản dịch vụ trang trại (nghĩa là tài khoản mà OWSTIMER.EXE thực hiện) hoặc tài khoản rõ ràng có các quyền cần thiết để thực hiện thao tác trên cơ sở dữ liệu cấu hình (thường là quản trị viên) sẽ thành công.

Theo mặc định, việc cố gắng thực hiện công việc hẹn giờ từ bên trong ngữ cảnh tập hợp trang web sẽ không thành công. Cố gắng hoạt động trong một khối đặc quyền nâng cao (thông qua SPSecurity.RunWithElevatedPrivileges) sẽ chỉ dẫn đến ngữ cảnh tài khoản của ứng dụng web của ứng dụng web đang được sử dụng thay cho bối cảnh người dùng hiện tại; điều này chỉ thành công nếu tài khoản hồ bơi ứng dụng có quyền ghi vào cơ sở dữ liệu cấu hình trang trại. Nếu điều này xảy ra, thường là vì (a) tài khoản dịch vụ trang trại đang được sử dụng trong các vai trò mà nó không nên ở (để chạy các ứng dụng web nội dung), hoặc (b) các quyền bổ sung đã được cấp cho nhóm ứng dụng tài khoản. Cả hai trường hợp đều thể hiện độ lệch so với mô hình hoạt động tốt nhất.

Trường hợp công việc hẹn giờ thường được tạo tại thời gian kích hoạt tính năng trong các tính năng được phạm vi ở cấp độ Farm hoặc WebApplication. Tại sao? Bởi vì các tính năng này thường được kích hoạt bởi các quản trị viên từ dòng lệnh (giả sử quản trị viên cũng có quyền trong cơ sở dữ liệu cấu hình trang trại) hoặc từ bên trong Trung tâm quản trị (nơi kích hoạt xảy ra thông qua tài khoản dịch vụ trang trại - được bảo đảm có quyền đối với cơ sở dữ liệu cấu hình). Khi tính năng được kích hoạt và phương thức FeatureActivated của SPFeatureReceiver được gọi, nó là an toàn (từ quan điểm bảo mật) để thiết lập công việc hẹn giờ.

Giải quyết vấn đề cụ thể của bạn đúng cách sẽ liên quan đến việc biến vấn đề trên đầu một chút. Thay vì cố gắng khởi tạo công việc hẹn giờ từ bộ sưu tập trang web theo yêu cầu, tôi khuyên bạn nên thiết lập tương đương với công việc hẹn giờ "quét" tại thời điểm tính năng của bạn được kích hoạt. Phải thừa nhận rằng, điều này cần nhiều kế hoạch và nỗ lực hơn những gì bạn đang cố gắng làm, nhưng con đường hiện tại của bạn sẽ chỉ hoạt động nếu bảo mật được điều chỉnh bằng cách nào đó - và điều đó không được khuyến khích.

Khi tôi kết hợp tính năng xóa trang trại bộ nhớ cache BLOB của mình (http://blobcachefarmflush.codeplex.com), tôi phải tự làm điều tương tự.Bạn có thể xem các chi tiết cụ thể về cách tôi đã làm việc thông qua tạo công việc hẹn giờ trong lớp FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). Phần còn lại của mã và tài liệu liên quan cũng có thể giúp bạn giải quyết một số thách thức khác.

Hãy sử dụng những gì bạn tìm thấy theo bất kỳ cách nào; đó là lý do tại sao nó ở đó!

Tôi hy vọng điều đó sẽ hữu ích. Nếu có các câu hỏi tiếp theo, hãy sa thải và tôi sẽ trả lời tốt nhất có thể :-)

+0

Hey Sean Thanx cho câu trả lời của bạn ..... Tôi thấy nó rất hữu ích. Tôi chắc chắn sẽ hỏi truy vấn nếu tôi sẽ có .... Thanx một lần nữa – Anoop

+0

Làm thế nào để cấu hình và chạy công việc này sau đó? – Evgeny

+0

Tôi là quản trị viên trên máy tính của tôi. – Evgeny

-3

Tôi đã sử dụng RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (đại biểu() { });

Nó hoạt động cho tôi ..... Có ai có giải pháp khác không? Nếu vậy, xin vui lòng cho tôi biết.

+0

Bạn có thể tìm thấy điều này hữu ích: http://stackoverflow.com/questions/638314 –

+2

Anoop, xem lời giải thích từ Sean trên lý do tại sao bạn không bao giờ nên (có thể) sử dụng phương pháp bạn mô tả ở đây. Sean đã làm rất tốt trong việc giải thích rõ ràng điều này. –

0

Cố gắng ghi đè phương thức SPPersistedObject.HasAdditionalUpdateAccess() và trả về true.

protected override bool HasAdditionalUpdateAccess() { return true; }

Các vấn đề liên quan