SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




TimeJob löst Workflow nicht richtig aus

Geprüfte Antwort Dieser Beitrag hat 14 Antworten

Ohne Rang
152 Beiträge
Michael Hoffmann erstellt 26 Aug. 2011 13:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Zusammen,

ich habe einen TimeJob auf dem Server installiert, der jeden Tag einen Eintrag in eine bestimmte Liste macht. Dieser Eintrag löst zum Teil weitere Workflows aus. In einem dieser Workflows sind mehrere Aktivitäten. Wenn der TimeJob nun den Eintrag macht, startet der Workflow, erledigt jedoch nur die erste Aktivität (läuft aber nicht auf Fehler).
Wenn Ich selbst einen Eintrag in die Liste mache, läuft der Workflow komplett durch.

Ich habe keine Ahnung warum da ein Unterschied ist?!
Kann mir jemand helfen???

Danke und Gruß
Michael

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Aug. 2011 16:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut
Wahrscheinlich läuft der Timerdienst als Systemkonto.
Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 08:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist richtig.
Aber was macht das für einen Unterschied? Der Workflow wird ja richtig ausgelöst. Er macht nur einfach weniger als beim manuellen anstoßen.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Aug. 2011 09:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie wird der Workflow denn gestartet? Per Code oder automatisch? Normalerweise löst das Systemkonto keine automatischen Workflows aus und ich nehme an, daß hier auch das Problem liegt. Du kannst die Änderungen in Deinem TimerJob auch unter einem anderen (fest angegebenen) Konto machen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 10:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der TimeJob erstellt einfach einen Eintrag in eine Liste. Der Workflow wird dann durch die Startoption "Diesen Workflow starten, wenn ein neues Element erstellt wird." ausgelöst. Das funktioniert auch, allerdings führt er dann nicht alle Schritte aus, die ich im Code festgelegt habe. Anders als wenn ich einfach manuell einen Eintrag in die Liste mache.

Wie kann ich denn festlegen mit welchem Konto der Listeneintrag erstellt werden soll?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Aug. 2011 10:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Michael Hoffmann"]Wie kann ich denn festlegen mit welchem Konto der Listeneintrag erstellt werden soll?[/quote]

Indem Du das SPSite-Objekt unter einem bestimmten Account instanzierst. Du brauchst dann zuerst ein "normales" SPSite und SPWeb, holst Dir dort einen User und benutzt dann dessen UserToken:
SPSite site = new SPSite("URL", UserToken);

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 10:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]SPSite site = new SPSite("URL", UserToken);[/quote]

Hab ich jetzt mal versucht. Leider nimmt er immernoch das Systemkonto zum erstellen des Listeneintrages.

Mir ist immernoch nicht ganz klar warum es daran hängt. Der Workflow wird ausgelöst und arbeitet auch. Er führt eben nur nicht alle Schritte aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Aug. 2011 11:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Michael Hoffmann"]Leider nimmt er immernoch das Systemkonto zum erstellen des Listeneintrages[/quote]

Du mußt natürlich das Web und die Liste aus diesem neuen SPSite-Objekt holen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 13:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Du mußt natürlich das Web und die Liste aus diesem neuen SPSite-Objekt holen.

[/quote]

Das habe ich gemacht. Ich glaube aber das ich nicht den korrekten Token habe. Wie bekomme ich denn den Token eines bestimmten Users?

Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 13:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habs jetzt mal mit AllUsers[Username] probiert, aber das klappt irgendwie nicht.
Hier mal mein Code aus dem TimeJob: 

 

SPWeb

webOrigUser = SPContext .Current.Web;
SPUserToken token = webOrigUser.AllUsers[ Username ].UserToken;
SPSite site = new SPSite ( URL ,token);
SPWeb web = site.OpenWeb();
SPList list = web.Lists[ Listname ];
web.AllowUnsafeUpdates = true ;
SPListItem newList = list.Items.Add();
newList[
"Title" ] = DateTime .Now.ToString();
newList.SystemUpdate(
false );

Siehst du vielleicht den Fehler?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Aug. 2011 14:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

SPContext.Current.Web ist in einem Timerjob null - eben weil es keinen Kontext gibt. Erstelle einfach ein normales SPSite und SPWeb mit der URL und hole dann einen User. Der Rest dürfte passen.

Übrigens solltest Du das durch debugging ziemlich schnell herausfinden ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 29 Aug. 2011 16:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Übrigens solltest Du das durch debugging ziemlich schnell herausfinden ;-)

[/quote]

Danke aber ich stehe mit dem Debugger noch ziemlich auf Kriegfuß. Ich bekomms nicht hin mir den Status der Variablen anzeigen zu lassen.

 

Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 30 Aug. 2011 13:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn ich einen Haltepunkt setzte bekomme ich beim Debuggen immer "Der Haltepunkt wird momentan nicht erreicht. Für dieses Dokument wurden keine Sysmbole geladen." angezeigt.
Laut Google soll man in der Symbolleiste vom VS einfach von Release auf Debug bzw andersrum umstellen. Bring bei mir aber nichts.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Aug. 2011 13:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Assembly muß als "Debug" kompiliert und dann bereitgestellt werden. Anschließend den Timerdienst neu starten, damit er auch die neue Assembly nutzt. Dann in Visual Studio Debug - Attach to process und an den Timerdienst hängen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
152 Beiträge
Michael Hoffmann Als Antwort am 31 Aug. 2011 14:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Klappt jetzt. Vielen Dank für die geduldige Hilfe!