Frage

Ich habe eine Website-Sammlung in einer Web-Anwendung mit Benutzer A als Websitesammlung adminstrator erstellt. Ich habe einen Link in Website Feature-Seite hinzugefügt. Bei Klick auf diesen Link versuche ich einen Timer job.Below zu erstellen, ist der Code auf Klick auf den Link ausgeführt

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

Wenn ich nun mit Benutzer A angemeldet, und klicken Sie auf den Link auf ‚Website-Einstellungen‘ Seite, erhalte ich eine Sicherheitsausnahme mit der Meldung „Zugriff verweigert“ an der Linie automaticArchiveJob.Update(). Aber wenn ich mit Administrator-Benutzer angemeldet (ich bin angemeldet auch an die Maschine in diesen Benutzer verwenden), und klicken Sie auf den Link erfolgreich den Auftrag erstellt. Auch habe ich ein Spieler Mitglied einer WSS_ADMIN_WPG Gruppe, aber immer noch das gleiche Problem bekommen. Gibt es irgend etwas anderes, das ich tun muß, das Problem zu lösen.

War es hilfreich?

Lösung

Die „Zugriff verweigert“ ist das erwartete Verhalten gegeben, was Sie zu tun versuchen. Lassen Sie mich erklären.

Wenn eine Timer Job-Instanz erstellt wird, wird es auf die Farm Konfigurationsdatenbank beibehalten. Der Zugriff auf diese Datenbank für Schreibzwecke ist ein privilegierter Betrieb; als Faustregel Konto nur der Farm Service (das heißt, das Konto, unter dem OWSTIMER.EXE ausführt) oder Konten, die explizit haben, werden die Rechte erforderlich zur Durchführung einer solchen Operation auf der Konfigurationsdatenbank (in der Regel Administratoren) erfolgreich zu sein.

In der Standardeinstellung versucht, einen Timer Job zu instanziiert innerhalb der Websitesammlungskontext zum Scheitern verurteilt. Der Versuch, den Betrieb in einem erhöhten Privileg Block (via SPSecurity.RunWithElevatedPrivileges) wird nur in der Web-Anwendung Anwendungspoolkonto Kontext führen statt des aktuellen Benutzerkontext wird verwendet; Dies gelingt nur, wenn das App Poolkonto hat Rechte an die Farmkonfigurationsdatenbank zu schreiben. Wenn dies geschieht, es ist in der Regel, weil (a) Konto des Farm-Dienstes verwendet wird in Rollen ist, dass sie nicht in sein sollten (Content-Web-Anwendungen zu laufen, zum Beispiel), oder (b) zusätzliche Berechtigungen für den Anwendungspool erteilt Konto. Beide Fälle stellen eine Abweichung von einem Best-Practices Betriebsmodell.

Timer Job-Instanzen werden in der Regel bei Feature-Aktivierungszeit in Funktionen erstellt scoped entweder auf der Farm oder WebApplication Ebene. Warum? Da diese Funktionen normalerweise von Administratoren aktiviert werden, entweder von der Kommandozeile aus (vorausgesetzt, der Admin auch Rechte in der Farm Konfigurationsdatenbank hat) oder von innerhalb der Zentraladministration (wo die Aktivierung des Farm-Dienstkonto erfolgt durch - garantierten Rechte auf die Konfigurationsdatenbank haben ). Wenn die Funktion aktiviert ist und der FeatureActivated Methode des SPFeatureReceiver genannt wird, es sicher ist (aus Sicht der Sicherheit) zum Einrichten des Timer Job.

Die Lösung Ihr Problem wird beinhalten richtig ein bisschen das Problem auf den Kopf stellt. Statt den Timer Job innerhalb der Websitesammlung auf Anfrage, ich würde empfehlen, bis die Einstellung die Äquivalent eines „Sweep“ Timer Job an der Zeit, um Ihre Funktion wird aktiviert, der versucht, zu instanziieren. Zugegeben, diese mehr Planung und Aufwand dauert als das, was Sie zu tun versuchen, aber Ihr aktueller Pfad wird nur zur Arbeit zu gehen, wenn die Sicherheit irgendwie eingestellt -. Und das wird nicht empfohlen

Als ich Putting meine BLOB-Cache Farm bündig Eigenschaft zusammen ( http://blobcachefarmflush.codeplex.com ) ich hatte viel die gleiche Sache selbst zu tun. Sie können die Besonderheiten, wie ich durch Timer zur Schaffung von Arbeitsplätzen in der FeatureReceiver Klasse gearbeitet (BlobCacheFarmFlushSweepJobFeatureReceiver). Der Rest des Codes und die zugehörigen Unterlagen können auch mit einigen der anderen Herausforderungen helfen, die kommen.

Fühlen Sie sich frei zu verwenden, was Sie in irgendeiner Weise zu finden; das ist, warum es da ist!

Ich hoffe, das hilft. Wenn es Follow-up-Fragen, Feuer weg und ich werde antworten, so gut wie ich kann: -)

Andere Tipps

Versuchen Sie, die SPPersistedObject.HasAdditionalUpdateAccess () -Methode außer Kraft zu setzen und return true.

protected override bool HasAdditionalUpdateAccess() { return true; }

Ich habe verwendet RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges (Delegierter () { });

Es funktioniert für mich ..... Hat jemand eine andere Lösung? Wenn ja, bitte lassen Sie mich wissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top