2009-06-24 23 views
6

Utworzyłem zbiór witryn w aplikacji internetowej z użytkownikiem A jako administratorem zbioru witryn. Dodałem link na stronie funkcji witryny. Po kliknięciu tego łącza próbuję stworzyć job.Below timera jest kod wykonywany po kliknięciu łączaProblem w tworzeniu zadania Timer

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

Teraz, kiedy zalogować się z użytkownikiem A i kliknij na ten link na stronie „Ustawienia witryny” , Otrzymuję wyjątek bezpieczeństwa z komunikatem "Odmowa dostępu" w linii automaticArchiveJob.Update(). Ale jeśli zalogowałem się z administratorem (jestem również zalogowany na komputerze za pomocą tego użytkownika) i kliknę link, to z powodzeniem utworzy to zadanie. Również utworzyłem użytkownika A członkiem grupy WSS_ADMIN_WPG, ale wciąż otrzymuję ten sam problem. Czy jest coś jeszcze, co muszę zrobić, aby rozwiązać problem.

Odpowiedz

23

"Odmowa dostępu" to oczekiwane zachowanie, z uwagi na to, co próbujesz zrobić. Pozwól mi wyjaśnić.

Po utworzeniu instancji zadania zegara jest ona przechowywana w bazie danych konfiguracji farmy. Uzyskiwanie dostępu do tej bazy danych w celu zapisu jest uprzywilejowaną operacją; z reguły tylko konto konta usługi rolniczej (to znaczy konto, na którym uruchamiany jest OWSTIMER.EXE) lub konta, które wyraźnie mają uprawnienia wymagane do przeprowadzenia takiej operacji w bazie danych konfiguracji (zazwyczaj administratorach), zakończy się pomyślnie.

Domyślnie próba utworzenia zadania czasomierza z poziomu kontekstu zbioru witryn kończy się niepowodzeniem. Próba wykonania operacji w bloku podwyższonych uprawnień (za pośrednictwem SPSecurity.RunWithElevatedPrivileges) spowoduje, że zamiast kontekstu bieżącego użytkownika zostanie użyty kontekst konta aplikacji aplikacji WWW; to się powiedzie, jeśli konto puli aplikacji ma prawa do zapisu w bazie danych konfiguracji farmy. Jeśli tak się dzieje, jest to zazwyczaj spowodowane tym, że (a) konto usługi rolniczej jest używane w rolach, w których nie powinno być (na przykład uruchamianie aplikacji sieci Web z treścią) lub (b) dodatkowe uprawnienia zostały przyznane puli aplikacji konto. Oba przypadki przedstawiają odchylenie od modelu operacyjnego opartego na najlepszych praktykach.

Instancje zadania czasomierza są zwykle tworzone w momencie aktywacji funkcji w funkcjach z zakresem na poziomie farmy lub aplikacji sieciowej. Czemu? Ponieważ te funkcje są zazwyczaj aktywowane przez administratorów z poziomu wiersza poleceń (zakładając, że administrator ma również prawa w konfiguracji farmy) lub z poziomu administracji centralnej (gdzie aktywacja odbywa się za pośrednictwem konta usługi farmy - gwarantowane jest posiadanie uprawnień do bazy danych konfiguracji). Po włączeniu funkcji i wywołaniu metody FeatureActivated SPFeatureReceiver jest bezpieczne (z punktu widzenia bezpieczeństwa) ustawienie zadania timera.

Prawidłowe rozwiązanie konkretnego problemu będzie wymagało nieco odwrócenia problemu na głowie. Zamiast próbować utworzyć zadanie czasomierza z poziomu zbioru witryn na żądanie, zaleciłbym ustawienie równoważnego zadania zliczania "wymiata" w momencie aktywowania funkcji. To prawda, że ​​wymaga to więcej planowania i wysiłku, niż to, co próbujesz zrobić, ale twoja obecna ścieżka będzie działać tylko wtedy, gdy bezpieczeństwo zostanie dostosowane - i nie jest to zalecane.

Kiedy składałem razem funkcję BLU farmy pamięci podręcznej BLOB (http://blobcachefarmflush.codeplex.com), musiałem zrobić to samo.Możesz zobaczyć szczegóły, jak pracowałem przy tworzeniu zleceń czasowych w klasie FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). Reszta kodu i związana z nim dokumentacja mogą również pomóc w niektórych innych pojawiających się wyzwaniach.

Zapraszam do korzystania z tego, co można znaleźć w dowolny sposób; właśnie dlatego tam jest!

Mam nadzieję, że to pomaga. Jeśli pojawią się dalsze pytania, odpal, a ja odpowiem najlepiej jak potrafię :-)

+0

Hey Sean Dziękuję za odpowiedź ..... Znalazłem to bardzo przydatne. Na pewno zadaję pytania, czy będę miał ... Thanx ponownie – Anoop

+0

Jak skonfigurować i uruchomić tę pracę? – Evgeny

+0

Jestem administratorem na moim komputerze. – Evgeny

-3

I stosowane RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (pełnomocnik() { });

To działa dla mnie ..... Czy ktoś ma inne rozwiązanie? Jeśli tak, proszę dać mi znać.

+0

może okazać się przydatne: http://stackoverflow.com/questions/638314 –

+2

Anoop patrz wyjaśnienia z Seanem powyżej dlaczego nigdy nie powinno się (być może) używać ty tu opisać metodę. Sean wykonał świetną robotę wyjaśniając to jasno. –

0

Spróbuj zastąpić metodę SPPersistedObject.HasAdditionalUpdateAccess() i zwrócić wartość true.

protected override bool HasAdditionalUpdateAccess() { return true; }