Das Jahr 2012

31 Dezember 2011 von Marek Keine Kommentare »

Für das neue Jahr wünsche ich Euch viel, viel positive Energie! Der Rest erledigt sich dann von alleine.

For the New Year I wish you a lot, a lot of positive energy! The rest practically takes care of itself.

Marek

Bookmark and Share

SharePoint Workflow Debugging & Troubleshooting

22 Oktober 2011 von Marek Keine Kommentare »

Developing workflows in SharePoint should be so easy that also a power user is able to do it. I run a lot of training in this area and I stay in contact with my customers very often, so I can see what they really build and what kind of problems they may have to face.

This is where the trouble begins. It is not at all an easy task to identify errors in the system when you run into them. You can discover some error messages in the UI but most of them are in the logs or EventLog only. For bigger companies it is not a standard process to get access to this kind of information, not even for a power user.

If you develop the workflows on your local developing system, before moving to the stage or production, you can configure a powerful additional tracing of the execution of the workflow foundation engine. With this information you will be able to understand how the engine is really executing the workflow, when the system is going to hydrate or dehydrate the workflows. This will enhance the level of understanding and also give you additional exception messages which are a level below the workflow foundation layer. For example you will see an SQL exception about a lock instead of generic “error occurred” message in the SharePoint UI or the logs.

To activate it, you must add this XML configuration to the web.config of your SharePoint WFE. You can add it e.g. bellow </system.web> node. In the customListener you can define the name of the file, where the trace data will be logged:

</system.web>

<!– START –>

<system.diagnostics>

<switches>

<add
name=System.Workflow LogToTraceListeners
value=1 />

<add
name=System.Workflow.Runtime.Hosting
value=All />

<add
name=System.Workflow.Runtime
value=All />

<add
name=System.Workflow.Runtime.Tracking
value=All />

<add
name=System.Workflow.Activities
value=All />

</switches>

<trace
autoflush=true
indentsize=4>

<listeners>

<add
name=customListener
type=System.Diagnostics.TextWriterTraceListener
initializeData=WFTrace.log />

</listeners>

</trace>

</system.diagnostics>

<!– END –>

<system.webServer>

 

Let’s now see the tracer in action. We start with the following scenario. For a leave approval we have a form as a SharePoint list. The applicant creates a new form and fills it out. After this point it should be not possible for this person to manipulate the form and e.g. change the date. To do so we use a custom workflow action – Set Item Permissions. You can download it for SharePoint Designer from codeplex http://spdactivities.codeplex.com/. If you are using Nintex Workflow you can just choose the Set Item Permission Action. We start with a very simple workflow:

In the “Set Item Permissions” we configure it as follows:

In this case we remove all rights and give full control rights to only one user – User1.

To start the workflow we sign in as an another SharePoint user – User2.

If we run this workflow, the workflow is executed with the rights of User2. So we can expect, that the workflow will run into errors an throw an access denied exception. But something different is happening! Actually we are able to change the value of the form and the element disappears from the list, because we as User2 don’t have the permission even to see it. Very strange!

To understand this behavior we can look at what the workflow engine is doing. We now analyze the run of this workflow instance in WFTrace.log
(if you have the same configuration as I do in the example, you will find the file in the same folder as the web.config).

 

I have removed all the “noise” from the file and just left the action which you can also see in the workflow history:

ManualWorkflowSchedulerService: Running workflow 4a2e76af-278b-4f2b-b4af-9f901445b1a6

Workflow Runtime: Scheduler: InstanceId: 4a2e76af-278b-4f2b-b4af-9f901445b1a6 : Done with running scheduled entry: SubscriptionEvent((1)ROOT, ActivityStatusChange(’(1)setItemPermissions1‘, Closed, Succeeded))

pending work hc 48569549 added workItem hc 2904135

Activity Status Change – Activity: updateItemActivity1 Old:Initialized; New:Executing

pending work hc 21962844
added workItem hc 54551106

Activity Status Change – Activity: writeToHistoryListActivity1 Old:Initialized; New:Executing

pending work hc 21962844 added workItem hc 56161022

WorkflowExecutor: Calling CommitTransaction for instance 4a2e76af-278b-4f2b-b4af-9f901445b1a6 hc 36692160

… pending work hc 21962844 added workItem hc 18298772

… pending work hc 21962844 added workItem hc 54551106

… pending work hc 21962844 added workItem hc 56161022

… pending work hc 48569549 added workItem hc 2904135

… pending work hc 50487737 added workItem hc 60477497

As you can see the workflow foundation puts ALL the Microsoft action in one batch hc 21962844
and all Nintex a
ction in another one hc 48569549. The idea behind this is to improve the performance and cumulate the executions. It works, as long as you are running Microsoft as the only action. If you mix it with your custom action, like here with Nintex action, you can get into trouble.

Nintex adds an action “commit pending changes” to overcome this issue. To have a correctly running workflow you must change the design of the workflow, too:

What we can see now. The workflow runs into an error as expected before:

What happened behind the scene?

System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 : Running scheduled entry: ActivityOperation((1)setItemPermissions1, Execute)

… pending work hc 48569549 added workItem hc 1221152

: Workflow Runtime: WorkflowExecutor: Calling SaveWorkflowInstanceState for instance f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 hc 8536155

System.Workflow.Runtime.Hosting Information: 0 : Serialized a System.Workflow.ComponentModel.ActivityExecutionContextInfo with id f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 to length 8918. Took 00:00:00.0087939.

0 : Workflow Runtime: WorkflowExecutor: Calling CommitTransaction for instance f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 hc 8536155

System.Workflow.Runtime Information: 0 : pending work hc 58093310 added workItem hc 6984404

System.Workflow.Runtime Information: 0 : pending work hc 48569549 added workItem hc 1221152

System.Workflow.Runtime Information: 0 : pending work hc 50487737 added workItem hc 18578734

System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 : Scheduling entry: ActivityOperation((1)updateItemActivity1, Execute)

System.Workflow.Runtime Critical: 0 : Uncaught exception escaped to the root of the workflow. In instance f920b7a1-cf74-44ef-b79c-c4efd3a14fa1 in activity Inner exception: System.ArgumentException: Item does not exist. It may have been deleted by another user. at Microsoft.SharePoint.SPList.GetItemById(String strId, Int32 id, String strRootFolder, Boolean cacheRowsetAndId, String strViewFields, Boolean bDatesInUtc) at Microsoft.SharePoint.Workflow.SPWinOEWSSServ

As you can see (2) it forces the workflow engine to call the CommitTransaction after the Set item permission action. What does this mean?

The workflow engine dehydrates (2) and hydrates the workflow instance to and from the SQL database! After this step the workflow continues with the next action Update Item.

You must be aware of this kind of effects when you design your workflow and use the tracing possibility described in this post, if you develop workflow to validate the correct execution.

 

Bookmark and Share

Nintex Workflow Delegation für “fremde” Tasks – Site Owner oder spezielle Gruppe

3 Februar 2011 von Marek Keine Kommentare »


Letzte Woche wurde ich von einem Kunden angerufen. Es geht um die Task-Delegation beim Nintex Worflow. Er wollte eine spezielle Gruppe mit dem Möglichkeit versehen, auch “fremde” Aufgaben zu delegieren. Hmm… Gar nicht so einfach…

Wie sieht es eigentlich das Standardverhalten bei der Delegation aus?

Es ist recht einfach zu erklären. Wurde für eine Aufgabe das Delegieren erlaubt (ein Häkchen in der Maske), so hat die Person oder die Gruppe die Möglichkeit diese Aufgabe an eine weitere Person zu delegieren. Es gilt auch für Gruppen. Jeder Mitglied der zugeordneten Gruppe, kann die Aufgabe einen anderen Person oder Gruppe delegieren.

Außerdem kann auch der Site Owner so eine “fremde” Aufgabe an jede beliebige Person delegieren. Das kann auch sehr wichtig sein, wenn eine Person nicht verfügbar ist oder die bei der Aufgabenerstellung noch nicht definierbar sei. Das Problem dabei sind aber die Rechte, die mit einem Site Owner einhergehen. Bei den meisten Firmen werden die Rechte des Site Owner ungerne für die Power User gesehen. Was nun?

Ich habe die Gelegenheit genutzt mit Eben Illingworth vom Nintex darüber zu sprechen (Danke an Eben für den Hinweis!). Es hat sich herausgestellt, dass eine Lösung dafür gerade (wirklich heute!) für WF2007 fertigt gestellt wurde. Eine Lösung für WF2010 existierte bereits.

Es ist ein Add-In für Nintex Workflow, das auch separat installiert werden muss (eine SharePoint Solution .wsp). Danach bekommt man die Möglichkeit, eine Gruppe für die Delegation von “fremden” Tasks festzulegen. Es kann global (teamsite Attribut einfach leer lassen) oder sogar pro Team Site erfolgen! Das einzige Problem dabei, die Konfiguration findet nicht in der Weboberfläche statt, sondern muss in einer Konfigurationsdatei festgelegt werden. Auch das Sonderrecht für den Site Owner kann damit “wegkonfiguriert” werden.

<DelegationControlGroupsConfigSection SiteAdminCanDelegate=”true”>

<!– Permission inheritance will be broken –>

<DelegationControlGroups>

<add group=”Owners” teamsite=”"/>

<add group=”Trusted delegators” teamsite=”http://SharePoint/sites/portal/subsite”/>

</DelegationControlGroups>

</DelegationControlGroupsConfigSection>

Das Handling muss vom Workflow Designer (hier, die Person, die den Worflow entwirft) einsprechend eingeplant werden. Durch das Add-In wird ein Content Type hinzugefugt, das von den normalen Content Types für Nintex Workflow ableitet. Dadurch wird beim Klick auf “delegieren” eine andere Maske angeboten, die das Delegieren jetzt auch für bestimme Gruppen aus der Konfigurationsdatei erlaubt.

Anbei die Links zu Add-Ins und die Dokumentation:

Nintex Workflow 2010:

http://connect.nintex.com/files/folders/workflow_add-ons_nw2010/entry14989.aspx

Nintex Workflow 2007:

http://connect.nintex.com/files/folders/wflowactions/entry15237.aspx

Um das Thema der Delegation in dem Beitrag vollständig abzudecken, möchte ich noch die zwei restlichen Arten der Delegation erwähnen.

  1. Jeder User bekommt in seinem “Welcome User X” Kontext-Menü noch zusätzlich einen Nintex Navigationspunkt. Hier kann er entweder global oder per Team-Site die Delegation seiner Aufgaben für eine Zeitraum an eine bestimme Person oder Gruppe festlegen. So kann er z.B. projektbezogen die Aufgaben für die Dauer von seinem Urlaub delegieren. Diese Delegation gilt nicht für bereits erteile Aufgaben. Diese müssen manuell delegiert werden.
  2. Müssen bereits erteilte Aufgaben von einem User, der vielleicht die Firma verlassen hat, an eine andere Person “umgeschrieben” werden, so kann das globalen erfolgen. Allerdings kann das nicht per Weboberfläche erfolgen, sondern muss über Nintex Kommandozeilentool direkt auf dem Server umgesetzt werden.

    NWAdmin.exe -o DelegateAllTasks –currentUser domain\username -newUser domain\username -username username -password password [-domain domain] [-siteUrl urlToASharePoitnSite] [-comments comments] [-sendNotification]

    Für die vollständige Dokumentation schaut Euch bitte das NWAdmin White-Paper an:

    http://connect.nintex.com/files/folders/technical_and_white_papers_nw2010/entry12004.aspx

Bookmark and Share

Day 1st: MCM SharePoint 2010

12 Oktober 2010 von Marek 1 Kommentar »

Es ist gerade 22:26Uhr, in Deutschland 07:26Uhr. Ich bin erst gestern gelandet und noch nicht wirklich an den großen Zeitunterschied angepasst. Ich schwebe gerade irgendwo dazwischen ;-) Ich hoffe morgen geht es mir schon besser.

Heute war der erste Tag des Kurses. Wir sind 11 Teilnehmer und haben innerhalb der 3 Wochen 11 Trainer. Die Namen der Trainer hören sich wirklich wie das “Who is who” des SharePoint Experten. Es ist schon beeindruckend.

  1. Scott Jamison (Jornata, Former Microsoft EPG Director, MCM)
  2. Kimmo Forss(SharePoint Online Lead Architect, Former Ranger, MCM)
  3. Sean Livingston (Program Manager, SharePoint Product Team)
  4. Mike Wise (MCS Global Solution Architect, Former SharePoint CAT Team, MCM)
  5. Bill Baer (Product Manager, SharePoint Product Team, MCM)
  6. Spencer Harbar (Independent Consultant, SharePoint MVP, MCM)
  7. Todd Carter(MS Principal PFE, Former ASP.Netteam, MCM)
  8. Maurice Prather (Independent Consultant, SharePoint MVP, MCM)
  9. Vesa Juvonen(MCS Principal Consultant and EMEA IW SME, MCM)
  10. Neil Hodgkinson, Ph.D.(MS Senior PFE, MCM)
  11. Paul Randal (SyssolutionsInc., Former SQL Server Product Team, SQL MVP, SQL MCM)

Entsprechend ist auch der Plan. Wir haben jeden Tag von 8:00 bis mind. 18:00 Uhr Workshops mit den Trainern. Es entstehen sehr wertvolle Diskussionen, wo man die Gelegenheit bekommt die Erfahrung, Fragen, Bedenken untereinander auszutauschen.

Danach geht es an die Blade-Server mit 32 GB Ram und einer Liste vom fertigen Hyper-V Images. Damit bauen wir eigene Umgebungen auf. Spielen mit Services, Proxy Gruppen, UTS, Claim based Authentifikation, Upgrades, Migration etc.

Die Zeit ist extrem knapp bemessen. Es ist fast wie bei einem Marathonlauf. Man muss die Zeit optimal planen, die Kräfte gut verteilen und das maximale am Wissen mitnehmen. Ich freue mich schon auf die nächsten Tage hier.

Bookmark and Share

1 Jahr mit Blog + SharePoint 2010 Master Kurs Redmond

9 September 2010 von Marek 3 Kommentare »

Heute auf den Tag genau ist ein Jahr vergangen, seitdem ich den ersten Eintrag hier geschrieben habe. Das wollte ich kurz mit dem Bild festhalten ;-)

Jetzt steht fest, ab 11. Oktober bin ich für 3 Wochen in Redmond. Dort habe ich meinen SharePoint 2010 Master Kurs und unmittelbar danach auch die Zertifizierung.

Für die Zeit in Redmond habe ich mir vorgenommen, in dem Blog richtig viel Inhalt beizusteuern. Und es gibt sehr viele Themen über die ich hier schrieben wollte, aber bis jetzt zeitlich nicht wirklich dazu gekommen bin.

Damit auf das nächste Jahr mit Blog und Technologie!

Bookmark and Share

Langsam: PeoplePicker SharePoint + Large Active Directory Forest

7 September 2010 von Marek 2 Kommentare »

Seit Monaten habe ich eine Lösung für ein Problem mit dem PeoplePicker gesucht. Wir haben einen eigenen Form Authentification Provider auf Basis einer SQL DB erstellt. Leider versucht SharePoint standardmäßig an dieser Stelle die SID vom User im AD aufzulösen, obwohl es keine Active Directory Account waren. Das führte dazu, dass zwar der User recht schnell gefunden wurde, danach aber es bis zu 3 Minuten gedauert hat, bis SharePoint festgestellt hat, dass der Account in AD nicht existiert. Bei dem Kunden handelt es sich um eine sehr große Landschaft mit über 400.000 Account in vielen Domains.

Es existiert eine nicht dokumentierte Einstellung für den PeoplePicker, die es SharePoint dazu bringt, nur für domain\account, also nur bei Account mit einem Backslash ( \ ) die Funktion TranslateToSids aufzurufen.

System.Security.Principal.NTAccount.TranslateToSids(System.Security.Principal.IdentityReferenceCollection, Boolean ByRef

Das Verhalten vom PeoplePicker kann über stsadm konfiguriert werden. Leider keiner der Parameter hat das gewünschte Verhalten konfigurieren können:

Eigenschaftenname

Beschreibung

Peoplepicker-activedirectorysearchtimeout

Konfiguriert den Timeoutwert zum Ausstellen einer Abfrage für Active Directory.

Peoplepicker-distributionlistsearchdomains

Schränkt die Suche in einer Verteilerliste auf bestimmte Domänen ein.

Peoplepicker-nowindowsaccountsfornonwindowsauthenticationmode

Gibt an, dass Active Directory nicht durchsucht werden soll, wenn für den aktuellen Port die formularbasierte Authentifizierung verwendet wird.

Peoplepicker-onlysearchwithinsitecollection

Zeigt nur Benutzer an, die Mitglieder der Websitesammlung sind.

Peoplepicker-searchadcustomquery

Ermöglicht dem Administrator das Festlegen der benutzerdefinierten Abfrage, die an Active Directory gesendet wird.

Peoplepicker-searchadforests

Ermöglicht einem Benutzer die Suche in einer zweiten unidirektional vertrauenswürdigen Gesamtstruktur oder Domäne.

 

Quelle: http://technet.microsoft.com/de-de/library/cc263318(office.12).aspx

http://blogs.msdn.com/b/sharepoint/archive/2006/03/15/552331.aspx

Die Rettung kam dann vom Russmax-Blog. Er hat eine Einstellung gefunden, die das Verhalten für alle nicht domain\account entsprechend verändert.

Es lässt sich per PowerShell anpassen:

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)
$site = new-object -typename Microsoft.SharePoint.SPSite(“http://url-of-your-site”)
$site.WebApplication.PeoplePickerSettings
$ps=$site.WebApplication.PeoplePickerSettings
$wa=$site.WebApplication
$ps.ActiveDirectoryRestrictIsolatedNameLevel=$true;

$wa.Update();

Und es funktioniert jetzt richtig schnell!

 

Bookmark and Share

Launch Nintex Workflow 2010!

12 Juli 2010 von Marek 1 Kommentar »

ca. 1 Monat nach dem offiziellen Start vom SharePoint 2010 liefert auch Nintex die neue Version aus.

Ich habe mir erlaubt eine neue Marketinggrafik für Nintex zu entwerfen (siehe unten) ;- )

Anbei eine Sammlung an Informationsmaterial:

Nintex Workflow 2010 Overview Video:

http://nintexdownload.com/video/NW2010_Brief_Overview.wmv

Nintex Workflow 2010 Flyer:

http://nintexdownload.com/Nsupport/NW2010_flyer_English.pdf

Edition Comparison Table:

http://nintexdownload.com/Nsupport/NW_Edition_Comparison_Table_English.pdf

Nintex Workflow 2010 Upgrade FAQ:

http://connect.nintex.com/files/folders/sp2010upgrade/entry10011.aspx

Release Notes:

http://nintexdownload.com/sl/supportfiles/NW2010_version_history.pdf

 

 

Bookmark and Share

Speaker auf SharePoint Konferenz – ShareConnect 2010

20 Juni 2010 von Marek Keine Kommentare »

Am Freitag habe ich dann die offizielle Bestätigung bekommen:

Session: Agile Businessprozesse mit SharePoint 2010
Workflow

Status: genehmigt

http://shareconnect.net/2010/sessions/?tid=1654

Gerade beschäftige ich mich sehr intensiv mit dem Thema Workflows/Prozesse im SharePoint 2007 und 2010 Umfeld. Dabei geht es um das gesamte Spektrum,  vom Modelieren bis zu Entwicklung mit Visual Studio. Sehr stark geht es auch in die Richtung der Integration mit Windows Azure. Ich freue mich dann die Zusammenfassung meiner Erfahrung, der Ideen und Richtungen während der Konferenz mitzuteilen. Dabei soll es nicht nur um positive Bespiele gehen sondern auch um die Grenzen. Das ganze aus der Perspektive eines IT-Managers, Infrastrukturverantwortlichen aber auch Entwicklers.

BASTA! 2010 – Die Europäische Konferenz zum Thema .NET – Technologien findet im kommenden September wieder in Mainz statt.

Unter dem Motto „.NET Everywhere!“ findet sich vom 20.-24. September wieder die deutschsprachige .NET-Community in der Mainzer Rheingoldhalle zusammen. Bereits im 12. Jahr präsentiert die BASTA! auch in diesem Jahr ein hochkarätiges Programm mit bekannten Speakern aus dem In- und Ausland. Zusätzlich zur BASTA! finden auch wieder die Schwester-Konferenzen ShareConnect und SQLCon statt.

Bookmark and Share

SharePoint 2010 – Launch Event Video

30 Mai 2010 von Marek 1 Kommentar »

Schon vom Michael Greth am 12.05 gezeigt, jetzt auch hier zu sehen.

Wir haben die Teilnehmer der SharePoint User Group über deren Erwartungen an SharePoint 2010 gefragt.

Zugleich starten wir eine Facebook-Gruppe für unsere regionale SharePoint User Group. Es würde uns freuen, wenn ihr Euch dort anmeldet und mitmacht! Etwas zum Thema SharePoint entdeckt, einfach auf Facebook mitteilen. Video, Links, Kommentare. Bis bald!

http://www.facebook.com/group.php?gid=107434075969299

Bookmark and Share

14. SharePoint User Group – Wave 14 Launch Event

19 Mai 2010 von Marek 4 Kommentare »

Fast jeder von uns reist ja gerne. Uns reizen die Herausforderungen mit etwas Neuem konfrontiert zu werden, etwas zu entdecken. Noch im Flieger haben wir gerade die Zeit gefunden, über das Zielland etwas zu lesen. Immer dabei, ein Wörterbuch. Zumindest ein paar Worte sollte man immer drauf haben: Entschuldigen Sie bitte.. . Ich möchte zahlen… etc. Viel besser ist es aber, wenn man selbst oder einer der Mitreisenden die Sprache mindesten auf dem Smalltalk-Niveau beherrscht.

Genau an so einen Smalltalk musste ich gerade beim Office 2010 denken.

Sie fragen sich wieso? Es beherrscht perfekt die eigene Disziplin. Zusätzlich wurden aber nahtlos Funktionalitäten von vielen Spezialprogrammen integriert. Es wurden jeweils nur die nötigsten Funktionen ausgesucht und diese sind recht intuitiv zu bedienen. Alles auf einem angenehmen Smalltalk-Niveau.

Beispiel Power-Point: Sie brauchen Bildbearbeitung, da PowerPoint zu 50% aus Bildern bestehen. Bild zuschneiden, komprimieren, Bildfilter inkl. Verzerrung, Kontrast, 3D, Reflexionen… alles da. So habe ich z.B. das Titelbild für diesen Blog-Eintrag mit PowerPoint erstellt.

Sie wollen eine kleine Filmsequenz im PowerPoint. Das Video wurde schnell mit einer Handy-HD-WebCam erstellt. Aber womit schneide ich die nicht richtige Stelle heraus. Auch kein Problem, bereits integriert. Sie werden damit kein “Blair Witch Project” schneiden, aber das letzte Event bestimmt sehr gut in Szene setzen.

Diese Art von Szenarien könnte ich noch lange aufzählen. Die Produktivität steigt damit sehr stark… und es macht auch Spaß!

Und jetzt zu Titelstory… Launch Event SharePoint und Office 2010. Hier lasse ich lieber die Bilder sprechen. Schauen Sie einfach zu : )

Für die Verlosung der vom Microsoft,  AvePoint und MindBusiness für die COmmunity gesponserten Preise, hat jeder der Teilnehmer eine Karte mit Kurzfeedback zum SharePoint 2010 abgegeben. Anbei auch die Karten.

 

Bookmark and Share