Welcome to MSDN Blogs Sign in | Join | Help

Server Upgrade and Migration Tool for Microsoft Office InfoPath

The Server Upgrade and Migration tool allows a SharePoint farm administrator to change hard-coded URLs in InfoPath form templates, UDC files, and content types to ensure that the form templates continue to work correctly in the following circumstances:
  • When performing a gradual upgrade from Microsoft Windows SharePoint Services 2.0 to Microsoft Windows SharePoint Services 3.0 or from Microsoft Office SharePoint Portal Server to Microsoft Office SharePoint Server 2007.
  • When migrating InfoPath forms and form templates from one Windows SharePoint Services 3.0 or Office SharePoint Server 2007 or Web site collection to another.
And can be downloaded here.

December Cumulative Update for MOSS 2007 and WSS 3.0 is now available for download!

December Cumulative Update for Office SharePoint Server 2007 and Windows SharePoint Services 3.0 is now available for download: 

December Cumulative Update for Windows SharePoint Services 3.0
December Cumulative Update for Microsoft Office Servers

More information can be found here.

 

Support for WSS 3.0 and MOSS 2007 withouht SP1 will end on January 13th 2009

Per our "Lifecycle Supported Service Packs" link the support for WSS 3.0 and MOSS 2007 without SP1 will end on January 13th 2009 and it is recommended to apply SP1 before the deadline to be in supported state.

Quick Deploy link is disabled even when user is a member of Quick Deploy group and Quick Deploy job is enable for the Content deployment path

I was asked by couple of my customers, why the "Quick Deploy" link under Tools on Page Editing toolbar is disabled even though the user is a member of "Quick Deploy Users" group and Quick Deploy job is already enabled for the Content Deployment path:

image

 

Solution:

  1. After modifying the change make sure to approve and publish the page
  2. From "Site Actions" menu select "Show Page Editing Toolbar"
    image
  3. "Quick Deploy" option should be enabled under Tools
    image
  4. To verify that the Quick Deploy job is created check the following hidden list: http://[site name]/Quick%20Deploy%20Items/AllItems.aspx
    image
Posted by AMazaheri | 0 Comments
Filed under:

Customizing High Confidence Search Result for People search in MOSS 2007

OOTB when searching for a person using "PreferredName", "WorkEmail", "UserName" and "AccountName", along with the core search result (Displayed via Search Core Result webpart) person's information is also displayed using "Search High Confidence Results" webpart (Same webpart used for Best bet) as exact match.

image

By default following properties are included in the high confidence search result:

  • Title
  • Skills
  • Work Email
  • Work Phone
  • Department
  • Office
  • About Me
  • Responsibility

Following steps allows administrators to add additional information (e.g. Cell Phone or any custom profile property) to the resultset.

Step 1

From "Metedata Property Mapping" page select and edit any of the available High Confidence Display Properties (HighConfidenceDisplayProperty12-HighConfidenceDisplay15):

image

And from "Edit Managed Property" page map it to the desired profile property:

image

Step 2

Run a full crawl on a content source which contains sps3://[Mysite web application url] as one of the entries in start addresses list:

image

Step 3

On "results.aspx" or "peopleresults.aspx" replace the "Search High Confidence Results" webpart's XSLT with the following:

XML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xmp><xsl:copy-of select="*"/></xmp>
</xsl:template>
</xsl:stylesheet>

And make sure that the profile property added in step 1 is included in the resultset:

image

Note: Make sure to save the original XSLT before applying the above change. 

Step 4

Add a reference to the "highconfidencedisplayproperty12" in the original XSLT as follows:

XML

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:param name="BBLimit">3</xsl:param>

<xsl:param name="DisplayDefinition">True</xsl:param>

<xsl:param name="DisplayDescription">False</xsl:param>

<xsl:param name="DisplayHCDescription">False</xsl:param>

<xsl:param name="DisplayHCImage">True</xsl:param>

<xsl:param name="DisplayHCProps">True</xsl:param>

<xsl:param name="DisplayHCTitle">True</xsl:param>

<xsl:param name="DisplayTerm">True</xsl:param>

<xsl:param name="DisplayTitle">True</xsl:param>

<xsl:param name="DisplayUrl">True</xsl:param>

<xsl:param name="ResultsPerTypeLimit">1</xsl:param>

<xsl:param name="DisplayST">True</xsl:param>

<xsl:param name="DisplayBB">True</xsl:param>

<xsl:param name="DisplayHC">True</xsl:param>

<xsl:param name="ResponsibilityText" />

<xsl:param name="SkillsText" />

<xsl:param name="HighConfTitle" />

<xsl:param name="IsFirstPage">True</xsl:param>

<xsl:param name="BestBetTitle"></xsl:param>

<xsl:template match="All_Results/SpecialTermInformation">

 <xsl:variable name="keyword" select="Keyword" />

 <xsl:if test="$DisplayST = 'True'" >

   <xsl:if test="($DisplayTerm = 'True'and string-length($keyword) &gt; 0) or ($DisplayDefinition = 'True' and string-length(Description) &gt; 0)" >

     <div class="srch-BB-SpecialTerm">

       <xsl:if test="$DisplayTerm = 'True'and string-length($keyword) &gt; 0"> 

         <span class="srch-BB-SpecialTerm">

           <img src="http://blogs.msdn.com/_layouts/images/star.gif" alt="" />

           <b>

           <xsl:value-of select="$keyword"/>

           </b>

         </span>

       </xsl:if>

       <xsl:if test="$DisplayDefinition = 'True'" >     

         <xsl:value-of disable-output-escaping="yes" select="Description"/>

       </xsl:if>  

     </div> 

   </xsl:if>  

 </xsl:if>

</xsl:template>

<xsl:template match="All_Results/BestBetResults/Result">

 <xsl:if test="$DisplayBB = 'True'" >

  <xsl:if test="position() &lt;= $BBLimit" >

  <xsl:variable name="url" select="url"/>

  <xsl:variable name="id" select="id" />

  <div class="srch-BB-Result">

  <xsl:if test="$DisplayTitle = 'True'" >

    <span class="srch-BestBetsTitle">

     <img src="http://blogs.msdn.com/_layouts/images/sts_site16.gif" alt="" />

     <a href="{$url}" id="{concat('BBR_',$id)}">

      <xsl:value-of select="title"/>

     </a>

    </span>

  </xsl:if>

  <xsl:if test="$DisplayDescription = 'True' and description[. != '']" >

      <div class="srch-BB-Description">

      <xsl:value-of select="description"/>

      </div>

  </xsl:if>

  <xsl:if test="$DisplayUrl = 'True'" >

     <span class="srch-BB-URL">

     <a href="{$url}" id="{concat('BBR_U_',$id)}" dir="ltr">

      <xsl:value-of select="$url"/>

     </a>

     </span>

  </xsl:if>

  </div>

  </xsl:if>

 </xsl:if>  

</xsl:template>

<xsl:template match="All_Results/HighConfidenceResults/Result">

 <xsl:if test="$DisplayHC = 'True' and $IsFirstPage = 'True'" >

  <xsl:variable name="prefix">IMNRC('</xsl:variable>

  <xsl:variable name="suffix">')</xsl:variable>

  <xsl:variable name="url" select="url"/>

  <xsl:variable name="id" select="id"/>

  <xsl:variable name="pictureurl" select="highconfidenceimageurl"/>

  <xsl:variable name="jobtitle" select="highconfidencedisplayproperty1"/>

  <xsl:variable name="workphone" select="highconfidencedisplayproperty2"/>

  <xsl:variable name="department" select="highconfidencedisplayproperty3"/>

  <xsl:variable name="officenumber" select="highconfidencedisplayproperty4"/>

  <xsl:variable name="preferredname" select="highconfidencedisplayproperty5"/>

  <xsl:variable name="aboutme" select="highconfidencedisplayproperty8"/>

  <xsl:variable name="responsibility" select="highconfidencedisplayproperty9"/>

  <xsl:variable name="skills" select="highconfidencedisplayproperty10"/>

  <xsl:variable name="workemail" select="highconfidencedisplayproperty11"/>

  <xsl:variable name="cellphone" select="highconfidencedisplayproperty12"/>

  <div class="srch-HCMain ">

  <span class="srch-HCSocDistTitle">

    <xsl:value-of select="$HighConfTitle" />

  </span>

  <table class="psrch-HCresult" CELLPADDING="0" CELLSPACING="0" BORDER="0" width="100%">

    <tr>

      <td class="psrch-imgcell" width="0%">

        <xsl:if test = "$DisplayHCImage = 'True'">

          <table class="psrch-profimg" CELLPADDING="0" CELLSPACING="0" BORDER="0" WIDTH="77px" HEIGHT="77px">

            <tr>

              <td align="middle" valign="middle">

                <a href="{$url}" id="{concat('HSR_IMGL_',$id)}" title="{$url}">

                  <xsl:variable name="imgid" select="concat('HSR_IMG_',$id)"/>

                  <xsl:choose>

                    <xsl:when test = "string-length($pictureurl) &gt; 0">

                      <img id="{$imgid}" src="{$pictureurl}" alt="{$preferredname}" border="0" onload="resizeProfileImage('{$imgid}')"/>

                    </xsl:when>

                    <xsl:otherwise>

                      <img id="{$imgid}" src="http://blogs.msdn.com/_layouts/images/no_pic.gif" alt="{$preferredname}" border="0" onload="resizeProfileImage('{$imgid}')"/>

                    </xsl:otherwise>

                  </xsl:choose>

                  <script>

                    window.setTimeout("resizeProfileImage('<xsl:value-of select="$imgid"/>')", 1)

                  </script>

                </a>

              </td>

            </tr>

          </table>

        </xsl:if>

      </td>

      <td valign="top" class="psrch-propcell" width="100%">

        <span class="psrch-Title">

          <img border="0" height="12" width="12" src="http://blogs.msdn.com/_layouts/images/imnhdr.gif" onload="{concat($prefix, $workemail, $suffix)}" ShowOfflinePawn="1" id="{concat('HSRP_',$id)}" />

          <a href="{$url}" id="{concat('HSR_',$id)}">

            <xsl:value-of select="$preferredname"/>

          </a>

        </span>

        <br/>

        <div class="psrch-Description">

          <xsl:call-template name="DisplayOfficeProfile">

            <xsl:with-param name="title" select="$jobtitle" />

            <xsl:with-param name="dep" select="$department" />

            <xsl:with-param name="phone" select="$workphone" />

            <xsl:with-param name="office" select="$officenumber" />

            <xsl:with-param name="cell" select="$cellphone" />

          </xsl:call-template>

        </div>

        <div class="psrch-Description">

          <xsl:choose>

            <xsl:when test="$aboutme[. != '']">

              <xsl:value-of disable-output-escaping="yes" select="$aboutme"/>

              <br/>

            </xsl:when>

          </xsl:choose>

          <xsl:choose>

            <xsl:when test="$responsibility[. != ''] or $skills[. != '']">

              <xsl:choose>

                <xsl:when test="$responsibility[. != '']">

                  <span class="psrch-PropLabel">

                    <xsl:value-of disable-output-escaping="yes" select="$ResponsibilityText"/>

                  </span>

                  <span class="psrch-PropValue">

                    <xsl:value-of select="translate($responsibility,';',',')"/>

                    <xsl:text> </xsl:text>

                  </span>

                </xsl:when>

              </xsl:choose>

              <xsl:choose>

                <xsl:when test="$skills[. != '']">

                  <xsl:if test="$responsibility[. != ''] and $skills[. != '']">

                    <br/>

                  </xsl:if>

                  <span class="psrch-PropLabel">

                    <xsl:value-of disable-output-escaping="yes" select="$SkillsText"/>

                  </span>

                  <span class="psrch-PropValue">

                    <xsl:value-of select="translate($skills,';',',')"/>

                  </span>

                </xsl:when>

              </xsl:choose>

              <br/>

            </xsl:when>

            <xsl:otherwise><span /></xsl:otherwise>

          </xsl:choose>

        </div>

      </td>

    </tr>

  </table>         

  </div>

 </xsl:if>  

</xsl:template>

<!-- XSL transformation starts here -->

<xsl:template match="/">

    <xsl:call-template name="dvt_1.body"/>    

</xsl:template>

<xsl:template name="DisplayOfficeProfile">

  <xsl:param name="title" />

  <xsl:param name="dep" />

  <xsl:param name="phone" />

  <xsl:param name="office" />

  <xsl:param name="cell" />

 

  <span class="psrch-Metadata">

  <xsl:if test='string-length($title) &gt; 0'>  

   <xsl:value-of select="$title" /> 

   -

  </xsl:if>

  <xsl:if test='string-length($dep) &gt; 0'>  

   <xsl:value-of select="$dep" /> 

   -

  </xsl:if>

  <xsl:if test='string-length($phone) &gt; 0'>  

   <xsl:value-of select="$phone" /> 

   -

  </xsl:if>

  <xsl:if test='string-length($office) &gt; 0'>  

   <xsl:value-of select="$office" /> 

    -

  </xsl:if>

  <xsl:if test='string-length($cell) &gt; 0'>

<xsl:value-of select="$cell" />

</xsl:if>

  </span>

  <br/>

</xsl:template>

<xsl:template name="dvt_1.body">

  <xsl:apply-templates />

</xsl:template>

<!-- End of Stylesheet -->

</xsl:stylesheet>

Replace the customized XSLT with the original version and check in the page to apply the changes.

image

Posted by AMazaheri | 3 Comments
Filed under: ,

Patterns and practices for SharePoint is published on MSDN

This guidance helps architects and developers design, build, test, deploy and upgrade SharePoint intranet applications. A reference implementation that is named the Contoso Training Management application demonstrates solutions to common architectural, development, and application lifecycle management challenges.

This guidance discusses the following:

  • Architectural decisions about patterns, feature factoring, and packaging.
  • Design tradeoffs for common decisions many developers encounter, such as when to use SharePoint lists or a database to store information.
  • Implementation examples that are demonstrated in the Training Management application and in the QuickStarts.
  • How to design for testability, create unit tests, and run continuous integration.
  • How to set up different environments including the development, build, test, staging, and production environments.
  • How to manage the application life cycle through development, test, deployment, and upgrading.
  • Team-based intranet application development.

 

check for publisher's certificate revocation slowing down SharePoint

While working on an engagement deploying a medium farm on Windows 2008 with no internet connection I noticed a considerable performance hit causing by check for publisher's certificate revocation which is on by default.

Basically by having this option set, all managed code go through a cert check against crl.microsoft.com (Certification revocation check) by .net runtime before startup. While disabling this option is not recommended for security reasons, for a development environment with no internet connectivity turning off this check should increase the overall performance.

In order to disable this option simply go to Internet Options and uncheck "Check for publisher's certificate revocation" under advanced tab.

Note:

As an alternative, adding the following line to Hosts file should also resolve the issue (Thanks to my friend Ashkan for the hint):

127.0.0.1 crl.microsoft.com

 

Using Team Foundation Server to Develop Custom SharePoint Products and Technologies Applications

A great whitepaper on leveraging TFS for designing and implementing custom SharePoint solutions is now publishd on MSDN.

Posted by AMazaheri | 1 Comments

MOSS 2007 Best Practices articles are now live!

Recently I collaborated on a SharePoint Collaboration best practice article which just got published on Technet along with a series of great articles on Operation, Publishing, Search and My Sites:

·         Ops: http://technet.microsoft.com/en-us/library/cc850692.aspx 

·         Pub: http://technet.microsoft.com/en-us/library/cc850698.aspx

·         Collab: http://technet.microsoft.com/en-us/library/cc850694.aspx

·         Search: http://technet.microsoft.com/en-us/library/cc850696.aspx

·         My Sites: http://technet.microsoft.com/en-us/library/cc262706.aspx

SharePoint 2007 Customer Evidence Update

Here is a great video on how TVGuide is leveraging MOSS 2007 enterprise features for its Online Video Guide (One of the MOSS projects that truly yours was involved along with a team of great folks here in U.S and India!):

Media Company’s Fast, Relevant Internet Video Search Drives Business

TV Guide took advantage of the growing interest in online video content by creating a new service for end-users to search primarily professionally produced video content through a video guide at www.video.tvguide.com. It chose Enterprise Search, an integrated part of Microsoft® Office SharePoint® Server 2007 that delivers fast, accurate results and a pleasant browsing experience to drive customer loyalty and to increase advertising revenue.

Streaming Video

 

Posted by AMazaheri | 1 Comments
Filed under: ,

Visual Studio 2008 Service Pack 1 Available for Download

Visual Studio 2008 Service Pack 1 offers VS 2008 and .NET Framework 3.5 users improvements in responsiveness, stability, and performance. Visual Studio 2008 Service Pack 1 and .NET Framework 3.5 Service Pack 1 downloads are now available to MSDN subscribers.
Posted by AMazaheri | 1 Comments
Filed under:

Known issue with Infrastructure Update for Windows SharePoint Services 3.0

If you are planning to deploy this update to your production environment, pay attention to a known issue that may affect AAM functionality in which discovered after release of Infrastructure Update for WSS 3.0, the KB 951695 has been recently updated with more information on the issue:

"Installing the Infrastructure Update in a SharePoint farm that uses Alternate Access Mapping with a reverse proxy or a network load balancer, such as in an extranet deployment, may cause some public URLs to become unresponsive.
Microsoft is aware of this issue and is developing a solution. Before installing the Infrastructure Update, customers who use this configuration should use a test environment to verify that public URLs remain accessible after the update is installed."

Using nested StateActivity to send regular reminders in Visual Studio SharePoint State Machine Workflow

Note. I want to thank Daniel Odievich for providing the content of this post, a must read!

When developing SharePoint workflows, one often needs to send email notification for a task, and then keep sending regular reminders for this task at scheduled intervals. When developing workflows in SharePoint Designer, one can use DelayUntilActivity and DelayForActivity, but those were not designed for in Visual Studio workflows.

When using State Machine workflows, the implementation for regular reminders is quite different than that in Sequential workflow. One can use put in EventDrivenActivity with DelayActivity but it will only execute once so you can only have one-time reminder, instead of regular reminders. If you try to wrap DelayActivity in a WhileActivity, the EventDrivenActivity won’t compile because its first child must be IEventActivity (such as DelayActivity).

Unlike with the Sequential workflow, ConditionedActivityGroupActivity cannot be used in State machine EventDrivenActivity. Also, one cannot write a loop around DelayActivity as it is supposed to be the first child of EventDrivenActivity.

The approach that can be taken is to use WF ability to reenter the same StateActivity over and over and thus reset the workflow. It is suggested here http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3553632&SiteID=1 but the following discussion adopts it for the SharePoint reality of task correlation tokens.

One common way to use StateMachineActivity in SharePoint is to create a task in StateInitializationActivity, register for OnTaskChanged or OnItemChanged event using EventDrivenActivity and use EventDrivenActivity with DelayActivity to send reminders. When using State Machine and SharePoint tasks, you most likely expect to reenter this state over and over, creating more tasks of the same kind (one common scenario is multi-stage approval with ability to send back the approval to previous people for re-approval). If you expect to reenter this task, you must set the all-important correlation tokens for the task should be set to use the containing StateActivity as a parent. Following is the structure you might create:

<StateActivity Name=“MyCustomTaskState”>

<StateInitializationActivity>

<CreateTask CorrelationTokenParent=“MyCustomTaskState” />

<SendEmail Type=“Task Created” />

</StateInitializationActivity>

<EventDrivenActivity Type=“Task Changed”>

<OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” />

<UpdateTask CorrelationTokenParent=“MyCustomTaskState” />

<IfElseActivity>

<IfElseBranch Condition=”Task Completed”>

<SetStateActivity Target=“OtherState” />

<IfElseBranch />

<IfElseActivity />

</EventDrivenActivity>

<EventDrivenActivity Type=“Item Changed”>

<OnItemChanged />

<IfElseActivity>

<IfElseBranch Condition=”Task Completed”>

<SetStateActivity Target=“OtherState” />

<IfElseBranch />

<IfElseActivity />

</EventDrivenActivity>

<EventDrivenActivity Type=“Reminder”>

<DelayActivity />

<SendEmail Type=“Reminder” />

<SetStateActivity Target=“MyCustomTaskState” />

</EventDrivenActivity>

<StateFinalizationActivity>

<CompleteTask CorrelationTokenParent=“MyCustomTaskState” />

<SendEmail Type=“Task Completed” />

</StateFinalizationActivity>

<StateActivity />

If you run this code, you will notice the following sequence of events:

1. <CreateTask CorrelationTokenParent=“MyCustomTaskState” />

2. <SendEmail Type=“Task Created” />

3. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> - register

4. <OnItemChanged /> - register

5. <DelayActivity /> - sleep

The workflow will then go to sleep and wait for either OnTaskChanged event, OnItemChanged event or for DelayActivity to elapse.

If OnTaskChanged or OnItemChange event wakes up workflow before DelayActivity has ever elapsed, and the user action causes workflow to move to another state everything is going to run correctly. However, once DelayActivity elapses, it wakes up and the following sequence of events occurs:

1. <DelayActivity /> - wake

2. <SendEmail Type=“Reminder” />

3. <SetStateActivity Target=“MyCustomTaskState” />

4. <CompleteTask CorrelationTokenParent=“MyCustomTaskState” />

5. <SendEmail Type=“Task Completed” />

6. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> - register

7. <CreateTask CorrelationTokenParent=“MyCustomTaskState” />

8. <SendEmail Type=“Task Created” />

9. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> - register

10.<OnTaskChanged /> - register

11.<DelayActivity /> - sleep

As you can see, your task will be completed and immediately new task of the same type will be created and new notification emails will be sent. If you sent link to the original task in the emails, the URLs in the email are no longer valid.

To avoid this, you might be tempted to wrap the activities in StateInitializationActivity and StateFinalizationActivity to avoid completing and recreating the task. If you do, you will discover that after reentering the state, OnTaskChanged events will no longer register correctly with exception indicating that correlation token for the task has not been initialized. This is because the correlation tokens use the StateActivity as a parent, and when it is reentered, they are reset, and you have orphaned your original task. There is no way to preserve those correlation tokens from one entry of StateActivity to another. A different approach is needed.

The correct approach is to use ability of StateActivity to host another StateActivity and break up task creation, task completion and task events into three separate StateActivity entities, and set the correlation token to use the top-most parent StateActivity:

<StateActivity Name=“MyCustomTaskState”>

<StateActivity Name=“CreateTaskState”>

<StateInitializationActivity>

<CreateTask CorrelationTokenParent=“MyCustomTaskState” />

<SendEmail Type=“Task Created” />

<SetStateActivity Target=“TaskEventsState” />

</StateInitializationActivity>

<StateActivity />

<StateActivity Name=“TaskEventsState”>

<EventDrivenActivity Type=“Task Changed”>

<OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” />

<UpdateTask CorrelationTokenParent=“MyCustomTaskState” />

<IfElseActivity>

<IfElseBranch Condition=“Task Completed”>

<SetStateActivity Target=“CompleteTaskState” />

<IfElseBranch />

<IfElseActivity />

</EventDrivenActivity>

<EventDrivenActivity Type=“Item Changed”>

<OnItemChanged />

<SetStateActivity Target=“TaskEventsState” />

<IfElseActivity>

<IfElseBranch Condition=“Task Completed”>

<SetStateActivity Target=“CompleteTaskState” />

<IfElseBranch />

<IfElseActivity />

</EventDrivenActivity>

<EventDrivenActivity Type=“Reminder”>

<DelayActivity />

<SendEmail Type=“Reminder” />

<SetStateActivity Target=“TaskEventsState” />

</EventDrivenActivity>

<StateActivity />

<StateActivity Name=“CompleteTaskState”>

<StateInitializationActivity>

<CompleteTask CorrelationTokenParent=“MyCustomTaskState” />

<SendEmail Type=“Task Completed” />

<IfElseActivity>

<IfElseBranch Condition=“Task Completed”>

<SetStateActivity Target=“OtherState” />

<IfElseBranch />

<IfElseActivity />

</StateInitializationActivity>

<StateActivity />

<StateActivity />

If you run this code, you will notice the following sequence of events:

1. <CreateTask CorrelationTokenParent=“MyCustomTaskState” />

2. <SendEmail Type=“Task Created” />

3. <SetStateActivity Target=“TaskEventsState” />

4. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> - register

5. <OnItemChanged /> - register

6. <DelayActivity /> - sleep

The workflow will then go to sleep and wait for either OnTaskChanged event, OnItemChanged event or for DelayActivity to elapse. Once DelayActivity elapses, following sequence of events occurs:

1. <DelayActivity /> - wake

2. <SendEmail Type=“Reminder” />

3. <SetStateActivity Target=“MyCustomTaskState” />

4. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> - register

5. <OnTaskChanged /> - register

6. <DelayActivity /> - sleep

Whenever the task change occurs that indicates that workflow is ready to move to another state, the following sequence of events occurs:

1. <OnTaskChanged CorrelationTokenParent=“MyCustomTaskState” /> or

2. <UpdateTask CorrelationTokenParent=“MyCustomTaskState” />

3. <IfElseActivity>

4. <IfElseBranch Condition=“Task Completed”>

5. <SetStateActivity Target=“CompleteTaskState” />

6. <CompleteTask CorrelationTokenParent=“MyCustomTaskState” />

7. <SendEmail Type=“Task Completed” />

8. <IfElseActivity>

9. <IfElseBranch Condition=“Task Completed”>

10.<SetStateActivity Target=“OtherState” />

Whenever the item change occurs that indicates that workflow is ready to move to another state, the following sequence of events occurs:

1. <OnItemChanged />

2. <SetStateActivity Target=“TaskEventsState” />

3. <IfElseActivity>

4. <IfElseBranch Condition=“Task Completed”>

5. <SetStateActivity Target=“CompleteTaskState” />

6. <CompleteTask CorrelationTokenParent=“MyCustomTaskState” />

7. <SendEmail Type=“Task Completed” />

8. <IfElseActivity>

9. <IfElseBranch Condition=“Task Completed”>

10.<SetStateActivity Target=“OtherState” />

The workflow designer outline of this is shown below:

clip_image002

Overall view of the parent state

clip_image004

Overall hierarchy of all activities

clip_image006

CreateTaskState with creation of the task and events

clip_image008

Properties window of CreateTask activity with correlation token pointing to parent state of all three activities

clip_image010

EventDrivenActivity for OnTaskChanged event

clip_image012

EventDrivenActivity for OnItemChanged event

clip_image014

EventDrivenActivity for DelayActivity and reminder email

clip_image016

CompleteTaskState and transition to another state

Deploying External Collaboration Toolkit for SharePoint in a medium farm

External Coolaboration Toolkit for SharePoint (ECTS) was recently released by The Solution Accelerators – Security and Compliance (SA-SC) team which allows SharePoint administrators to easily invite external users to connect and collaborate with corporate's internal users on existing or new Team/Project sites.

After doing a dry-run deployment for one of my customers I noticed some issues with the installting the solution on a medium farm with more than one web front end server and found quite few posts on the "SharePoint-Collaboration" forum regarding the similar issues and challenges.

I finally managed to successfully deploy the solution by following these steps:

  1. When deploying the ECTS to a farm with multiple front-end servers the “ECTSBase.wsp” and “ECTSSolution.wsp” may not be fully deployed when the setup script tries to activate the features and you may get an error.To mitigate this issue make sure to put a Wscript.sleep(60000) before the feature activation steps in ects_setup_sharepoint.vbs
    image
    image
  2. In Central Administration click on Application Management tab and select Manage Web Application features, make sure both “ECTSBase” and “External Collaboration” are activated for the web application.  ScreenHunter_03 Jun. 18 15.51
  3. Web.config for both Main (Default zone) and Extranet web applications should contain the following settings:
  4. <membership defaultProvider="ADAMUser">
    <providers>
    <clear />
    <add name="ADAMUser" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADAMConnectionString" attributeMapUsername="userPrincipalName" requiresQuestionAndAnswer="true" enablePasswordReset="true" attributeMapPasswordQuestion="eatmuPasswordQuestion" attributeMapPasswordAnswer="eatmuPasswordAnswer" attributeMapFailedPasswordAnswerCount="eatmuFPAC" attributeMapFailedPasswordAnswerTime="eatmuFPAT" attributeMapFailedPasswordAnswerLockoutTime="eatmuFPALT" />
    </providers>
    </membership>
    ...

    If the above settings are missing in Central Administration, click the Application Management tab and then, under Application Security, click Authentication providers. Verify that you are configuring the proper Web application, and then click Extranet. On the Edit Authentication page click Save again(without modifying the settings). This will magically update the WebConfigurationChanges objects in Configuration database and eventually pushes all the custom settings to the web.config for both Internal and external web application.
    image

    Note.
    When installing ECTS on a single server this happens automatically as part of the ECTSBase feature activation at web application level.
  5. As part of “External Collaboration” feature activation process, “ExternalCollaboration.resx” should be copied to “App_GlobalResources” folder for both Internal (Default zone) and Extranet web applications under “[Drive]:\Inetpub\wwroot\wss\virtualdirectories\”, make sure that after installing the solution the file exists on all servers to avoid the following error when accessing the ETCS application pages provisioned under “_layouts” virtual folder:
    image

Windows SharePoint Services 3.0 SP1 Developer Evaluation VPC Image

Windows SahrePoint Services 3.0 SP1 Developer VPC image can now be downloaded from http://www.microsoft.com/downloads/details.aspx?familyid=1BEEAC6F-2EA1-4769-9948-74A74BD604FA&displaylang=en.

Note:

"This is a time limited evaluation VHD containing Windows SharePoint Services 3.0 SP1 and Visual Studio 2005 for use with Virtual PC or Virtual Server" 

 

Posted by AMazaheri | 0 Comments