This is just so I can remember what the date and time formats look like when you reference the current date in a workflow variable.
Here’s a short workflow
and here are the results.
One of the issues with SharePoint 2007 workflows was the actions within a workflow could process out of order due to the asynchronous nature of the workflow processing. In order to work around these “race” conditions you had to put a checkpoint or commit in your workflow. This usually means you put a pause in your workflow to make the workflow serialize and de-serialize in the database, thus causing a commit to occur.
The same issue exists with SharePoint Designer 2010 workflows. I just had an “update list item” action update the incorrect list item, even though it was specified with a unique key. In many of my workflows I create a name/value pair list that stores values I need to pass around. In this case I had a “LastMonthProcessed” entry and a “MonthlyControlsListURL” entry. Each time I updated the “MonthlyControlsListURL” key the value would end up in the “LastMonthProcessed.” After putting a 1 minute delay (pause for duration) action after the update of the “LastMonthProcessed,” all of the updates occurred correctly.
You’d think some clever MS programmer would fix this issue once and for all…or they would a least give you a commit action in SPD. Arghhhhh!
This is a bit of a weird one. I had the user profile incremental synchronization job set hourly, but it never showed up as being scheduled.
If you notice here, it shows up as “No schedule set.”
Change the schedule to daily…
…and voilà! It now shows up as being set.
Not sure I’m going to spend too much time on this one until after I upgrade to SP1.
Tags:
User Profile Service Synchronization
User Profile Service Scheduling
I ran across this today which is a very interesting problem that may be the underlying issue that a client is experiencing. Here are a couple of helpful links on the subject.
This is an old post from Josh Gaffey, but some folks are still using the old-er stuff.
http://tomblog.insomniacminds.com/2008/07/23/sharepoint-branding-issues-edit-in-datasheet-view/
Republished from original post in 2009.
Give Blood to your Workflow
Give the gift of life.
What does this have to do with SharePoint workflows? Last week I was teaching our Mission: Automation class where we cover InfoPath and workflows created with SharePoint Designer. One of the things we like to do in these classes is take some ideas from our students on business problems that they are trying to solve using SharePoint workflows and attempt to outline the solution and partially implement it during class (if it doesn’t become overly complicated). This particular idea was generated by Janice and here was her problem.
Janice is the blood drive coordinator at her place of business. She wanted to figure out a way to use SharePoint and InfoPath to allow people to register for times to give blood. I thought this sounded like a great example of a scheduling application that many people could find other applications for, so I started down the road of creating the “Blood Drive Scheduling Application” during the class. It uses an InfoPath form that an employee fills out to reserve a time slot for donating blood. In this case, there are two donating stations and each one is scheduled at 15 minute intervals during the day. In other words, for each 15 minute interval during the day, we can schedule a maximum of two people to donate at one time.
If someone changes their mind about the time slot they’ve reserved, we want to give them a way to make a change. However, we don’t want to give them the ability to change the original form…they will simply request a cancellation and submit another form for a new time slot. Some of this has to do with who has security to the different lists that we’ll be using in SharePoint to solve this problem.
Now, before we get started let me say that there are a number of ways to solve this problem. I was going for a solution that could be implemented during the class and illustrated some of the features of InfoPath and SPD workflows. This is only one solution. Much more elegant solutions could be implemented!
In this solution we’re going to use several lists. Blood Drive Reservations will be a forms library where we’ll store the completed InfoPath forms. Departments contains a list of the departments at the company. Time Slots contains a list of all the available time slots during the day when a donation reservation can be made. We’ll have a Cancellations list that we can use for someone to request a cancellation of their reservation. Finally, we’ll use the built-in Tasks list to assign tasks when a cancellation is requested.
First we’ll start out by creating a custom list that has two columns. One is the time for each of the 15 minute time slots during the day that we want to schedule and the other column is for recording how many reservations have been made for the time slot. Here’s what the table looks like in datasheet view.
I created all the time slots for 8:00 AM thru 5:00 PM.
Next up is to create the InfoPath form and library in which the completed forms will be stored. The form is pretty simple for our example. Greg suggested we add the department field so there could be some competitive statistics compiled between the different departments. Nothing like a little competition during blood letting!
The four fields defined in our form’s data source are DonorName, DonorEmail, DonorDept and TimeSlot.
The DonorName and DonorEmail are populated using default values obtained by calling the GetUserProfileByname method in the web service, UserProfileService, referenced at http://server/_vti_bin/userprofileservice.asmx. This web service will return name/value pairs from the user profile store that is part of SharePoint and normally configured to synchronize with Active Directory. The PreferredName and WorkEmail are used in this example.
The DonorDept field is populated by creating a data connection to a SharePoint list containing departments. Nothing really complicated here.
Now, the time slot field is populated in a rather unique way. The idea here is to filter the available time slots based on the value in Counter field in the Time Slot list. We’re going to be updating the Counter field with a workflow whenever a new reservation is submitted. We need to create a view on the field that is filtered to only show time slots when the value of the counter is less than 2. I created a view called AvailableTimeSlots and added the simple filter as shown.
Now we’re going to use a trick to populate the DonorTimeSlot field. We’re going to create a data source to an XML file and reference the SharePoint URL protocol supported by OWSSVR.DLL. This is documented in the WSS SDK and is referenced as follows. http://server/path/sitename/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=TRUE&List={ListGUID}&View={ViewGUID}. The exact URL for our example is http://portal.awbikes.local/sitedirectory/bd/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=TRUE&List={BAA912CA-D4D4-4786-B2B8-B33DA8691CA4}&View={35F16EC8-64E9-4BCE-8C8A-CD3D142AD894}.
The GUIDs for the List and View can be found by selecting the Modify View link in the view selector and decoding the GUIDs in the URL that is displayed.
http://portal.awbikes.local/SiteDirectory/bd/_layouts/ViewEdit.aspx?List=%7BBAA912CA%2DD4D4%2D4786%2DB2B8%2DB33DA8691CA4%7D&View=%7B35F16EC8%2D64E9%2D4BCE%2D8C8A%2DCD3D142AD894%7D&Source=http%253A%252F%252Fportal%252Eawbikes%252Elocal%252FSiteDirectory%252Fbd%252FLists%252FTime%2520Slots%252FAvailableTimeSlots%252Easpx
The List GUID and View GUID are URL encoded, and you can “un-encode” them if you want to (but you don’t have to) by replacing %7B with a left curly brace { and %7D with a right curly brace }. %2D can be replaced with hyphens. In the example above, %7BBAA912CA%2DD4D4%2D4786%2DB2B8%2DB33DA8691CA4%7D becomes {BAA912CA-D4D4-4786-B2B8-B33DA8691CA4}.
In the next dialog on the Data Connection Wizard, choose the option to Access the data from the specified location.
Give the data connection a name and make sure you automatically retrieve data when the form is opened and click Finish.
You can see the completed URL n the Summary section. I like the way the URL looks when the GUIDs are un-encoded…just easier on the eyes.
On the list box entries for the DonorTimeSlot field you need to reference this data source, OWSSVR, and select the entries as shown.
This will populate the DonorTimeSlot list with the filtered list from the AvailableTimeSlots view.
When we publish our form we will promote all of our fields so they appear as metadata columns in SharePoint.
Now, on to our first workflow.
The first workflow is fairly simple. When a new form is added we want to increment the value of the counter in the Time Slots list for the time slot selected. If two people select the same time slot, the value will be incremented to 2 and the time slot will no longer show up as an available time slot on the drop-down list in our form (because of the filter we created for our AvailableTimeSlots view). Within this workflow, we can also send a confirmation email to the donor. If we really want to get fancy, we can send a reminder email 24 hours before the scheduled appointment. Here’s the workflow in SPD.
First, let’s calculate the new counter value by retrieving the value currently in the time slot and adding 1. We’ll save this calculated value in a variable called IncrementedTimeSlotCounter.
To retrieve the current value of the counter we perform a lookup which reads as
Select Counter from Time Slots where Time Slots:Title equals Blood Drive Reservations:Donor Time Slot.
We are matching up the Title in the Time Slot list (e.g. 8:15 AM) with the time slot selected by the donor on the form from the drop-down list. Then we simply add 1 to it and store it in a variable.
Next we update the value of the counter in the Time Slots list. In this example, we’ve created another step in the workflow to do this.
Here’s the screen shot of selecting the Counter field to update in the Time Slots list.
In the “Find the List Item” section, here’s the lookup. Again, we’re matching up the Time Slots:Title field with the Current Item:Donor Time Slot field (Current Item being our item we’re working on in the Blood Drive Reservations list).
Now let’s create a workflow that sends a confirmation email and a reminder email. We’ll send the confirmation email right away and pause until early in the morning on February 3rd and then send a reminder email. We can do this with a new workflow that also starts when the item is created. It is okay to have multiple workflows running. Here’s what it looks like (nothing fancy). We can reference the Donor Time Slot in the email by clicking the Add Lookup to Body button.
The second step we’ll use the Pause Until Date action and put in a pause with a hard date of February 3rd and a time of 4 a.m. Just a quick and dirty reminder email.
We’re all set on the reservation side. Now, on to the cancellation process. Here’s the way the cancellation process will work.
We really don’t want end users to be able to delete reservation in the list and we can control that by creating a permission level that is similar to Contribute but without the permissions to edit and delete. We can alter the security settings on the reservation list so that our Visitors have this permission level for the reservation list.
If someone wants to cancel, they can insert an item in the Cancellations list. They can select themselves from a drop-down list of people who have reservations and click OK to create the request. I chose to do it this way so we can get a good match on the Donor Name. There are other ways to handle this, but this is quick and dirty.
Once they create a cancellation request, a task is assigned to Connie via a workflow. In this workflow I Iogged some variables to the workflow history list for debugging purposes and then assigned a task to Janice, er, I mean, Connie using the Collect Data from a User action. Logging information to the history list is a very valuable technique for troubleshooting and validating information in the workflow. I normally use three actions in sequence to do this: Build Dynamic String, Set Workflow Variable and Log to History List.
Tasks are very important to understand in workflows. They are so important they get their own categorization in the Actions selection list.
Collect Data from a User allows you to assign a task and, when that task is edited, a custom form is displayed with fields on it that you define in the workflow. In this case we are going to ask Connie if it is okay to delete the reservation with a Yes/No drop-down. Another workflow, Delete Reservation, was created to start on a change to the Tasks list. It’s job is to determine what the response was (Yes or No) and lookup and delete the reservation. One of the reasons this method was chosen was because the workflow runs with the credentials of the person who started it. Connie will have the permissions required to delete the item in the reservations list, while the donor does not. It also allows her to verify that the person has requested to delete their reservation and not somebody else’s. Here’s what the Collect Data from a User action looks like.
Next we’ll take a look at the Delete Reservation workflow. This workflow is created on the Tasks list. It has three steps. In the first step we set some variables that we’ll use in the workflow. These are very important because we are looking up the IDs of the Blood Drive Reservation we need to delete as well as the Time Slot we need to decrement so it is again available. The key to these lookups begins with the fact that workflow tasks hold some very important information. The contain a “foreign key” back to the ID of the item in the original list.
The first thing we need is the ID of the reservation we might be deleting. To get this we choose to lookup the ID field from the source Blood Drive Reservations. We are going to find this by first matching the name selected in the Cancellations list with the Donor Name in the Blood Drive Reservations list. To find the correct item in the Cancellations list, we need to reference the Workflow Item ID in the Tasks list (our current list) and match that to the ID of the item in the Cancellations list. It is very important to understand that you have access to the Workflow Item ID in the Tasks list. This can be very confusing if you are new to SharePoint Designer workflows, but with some patience it can be understood without having to be a programmer.
Once we have the ID of the reservation, we can find the ID of the time slot that is referenced on the reservation. We’ll use this to update the counter on the time slot. We want to find the ID of the time slot so we match the Donor Time Slot on the Blood Drive Reservations list (e.g. 8:30 AM) with the Title on the Time Slots list. We can find the Donor Time Slot by matching the ID of the Blood Drive Reservation with the ID that we looked up in the previous action and stored in the variable ReservationID.
The next step is just some more logging of messages and variables to the history list for debugging purposes. In this example I’m logging the IDs I looked up to insure that I have the right ones.
The final step is to actually delete the reservation. First we look up the current value of the time slot of the reservation to be deleted and subtract 1 and store the result in a variable called DecrementedTimeSlotCounter. This is easy to do since we have already looked up the value of the ID of the time slot that we need to update in the Set variables step.
We can then update the counter value, again using the ID of the time slot that we previously set in the variable TimeSlotID.
Finally we can delete the reservation by using the ID of the reservation that we previously stored in the variable ReservationID.
I know this has been a long post, but hopefully it helps some folks out there become more familiar with SPD workflows. This solution is far from perfect and there are several other ideas I would probably incorporate, but it provides a good demonstration of creating a scheduling application with workflows. I hope you’ve enjoyed it and learned at least one thing (always my goal).
I’m on my way to bed so I can get on a plane tomorrow to do some training in San Antonio, Texas…a short flight from Dallas. Y’all take care!
Give the gift of life…donate often!
Here’s the situation. You are remoted into a client’s instance of SharePoint and you are attempting to start Dashboard Designer to check out some PerformancePoint stuff. But, you are met with errors of all kinds, one which provides detail similar to that shown below. Basically, you get a 401 error…access denied.
PLATFORM VERSION INFO
Windows : 6.1.7601.65536 (Win32NT)
Common Language Runtime : 4.0.30319.235
System.Deployment.dll : 4.0.30319.1 (RTMRel.030319-0100)
clr.dll : 4.0.30319.235 (RTMGDR.030319-2300)
dfdll.dll : 4.0.30319.1 (RTMRel.030319-0100)
dfshim.dll : 4.0.31106.0 (Main.031106-0000)
SOURCES
Deployment url :
http://test.bisite.com/_layouts/ppsma/1033/designer.application?
Operation=CreateItem&SiteCollection=http://test.bisite.com&SiteLocation=
%2FAccounting%2FBI&ListLocation=%2FAccounting%2FBI%2FData%20Connections%20for
%20PerformancePoint&ItemType=DataSource
ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed
later in the log.
* Activation of
http://test.bisite.com/_layouts/ppsma/1033/designer.application?
Operation=CreateItem&SiteCollection=http://test.bisite.com&SiteLocation=
%2FAccounting%2FBI&ListLocation=%2FAccounting%2FBI%2FData%20Connections%20for
%20PerformancePoint&ItemType=DataSource resulted in exception. Following failure
messages were detected:
+ Downloading
http://test.bisite.com/_layouts/ppsma/1033/designer.application?
Operation=CreateItem&SiteCollection=http://test.bisite.com&SiteLocation=/Account
ing/BI&ListLocation=/Accounting/BI/Data Connections for
PerformancePoint&ItemType=DataSource did not succeed.
+ The remote server returned an error: (401) Unauthorized.
COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.
WARNINGS
There were no warnings during this operation.
OPERATION PROGRESS STATUS
* [7/18/2011 5:38:36 PM] : Activation of
http://test.bisite.com/_layouts/ppsma/1033/designer.application?
Operation=CreateItem&SiteCollection=http://test.bisite.com&SiteLocation=
%2FAccounting%2FBI&ListLocation=%2FAccounting%2FBI%2FData%20Connections%20for
%20PerformancePoint&ItemType=DataSource has started.
ERROR DETAILS
Following errors were detected during this operation.
* [7/18/2011 5:38:41 PM]
System.Deployment.Application.DeploymentDownloadException (Unknown subtype)
– Downloading
http://test.bisite.com/_layouts/ppsma/1033/designer.application?
Operation=CreateItem&SiteCollection=http://test.bisite.com&SiteLocation=/Account
ing/BI&ListLocation=/Accounting/BI/Data Connections for
PerformancePoint&ItemType=DataSource did not succeed.
– Source: System.Deployment
– Stack trace:
at
System.Deployment.Application.SystemNetDownloader.DownloadSingleFile
(DownloadQueueItem next)
at
System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
at
System.Deployment.Application.FileDownloader.Download(SubscriptionState
subState)
at
System.Deployment.Application.DownloadManager.DownloadManifestAsRawFile(Uri&
sourceUri, String targetPath, IDownloadNotification notification,
DownloadOptions options, ServerInformation& serverInformation)
at
System.Deployment.Application.DownloadManager.DownloadDeploymentManifestDirectBy
pass(SubscriptionStore subStore, Uri& sourceUri, TempFile& tempFile,
SubscriptionState& subState, IDownloadNotification notification, DownloadOptions
options, ServerInformation& serverInformation)
at
System.Deployment.Application.DownloadManager.DownloadDeploymentManifestBypass
(SubscriptionStore subStore, Uri& sourceUri, TempFile& tempFile,
SubscriptionState& subState, IDownloadNotification notification, DownloadOptions
options)
at
System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation
(Uri activationUri, Boolean isShortcut, String textualSubId, String
deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String&
errorPageUrl)
at
System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker
(Object state)
— Inner Exception —
System.Net.WebException
– The remote server returned an error: (401) Unauthorized.
– Source: System
– Stack trace:
at System.Net.HttpWebRequest.GetResponse()
at
System.Deployment.Application.SystemNetDownloader.DownloadSingleFile
(DownloadQueueItem next)
COMPONENT STORE TRANSACTION DETAILS
No transaction information is available.
This is likely caused by your machine not being joined to the domain and credentials not being passed correctly. Assuming you are running Windows 7, you can open control panel and use Credential Manager to add the proper Windows credentials.
Click on the link “Add a Windows credential.” Enter your site name and your credentials.
Now it’s in the list and stored.
…and Dashboard Designer should now launch.
You might be able to get the same result by putting the site in your trusted site list and insuring that automatic logon is selected in IE.
This isn’t exactly SharePoint related, but it does deal with SQL Server (that is used by SharePoint) so I’m going to post it here anyways. So shoot me.
To run SQL Server Enterprise Manager (Ouch! What is he doing with SQL 2000?) as another user from the command line you can either use short file names or nested quotes.
C:\Windows\System32\runas.exe /user:domain\username "C:\Windows\System32\mmc.exe /s C:\Progra~2\Mi3EDC~1\80\Tools\BINN\SQLSer~1.msc"
If you want to use short filenames, you can cd to each directory and perform a dir /x to display the short directory or filename.
Or, if you want to use long filenames:
C:\Windows\System32\runas.exe /user:domain\username "C:\Windows\System32\mmc.exe /s \"C:\Program Files (x86)\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSC"\"
The trick to using long filenames is to use \" for the first nested quote and "\ for the matching nested quote.
In either case, when you run the shortcut you’ll be prompted to enter your password.
Let’s see, I installed the December 2010 CUs for SP 2010 and updated my VMs and host servers with Windows 2008 R2 SP1. Long day…found a bad drive in one of my arrays that was forcing a controller reset degrading the array…that’s another story.
Tried to get into manage the User Profile Service (UPS) application and was met with an error and correlation ID. Found that the User Profile Sync Service wasn’t started (?).
Tried starting it but it appeared that it didn’t want to start.
Checked out the logs from the correlation ID and searched using Google.
03/01/2011 09:32:42.95 w3wp.exe (0x0870) 0x14F8 SharePoint Portal Server User Profiles et8j High UserProfileServiceUserStatisticsWebPart:LoadControl failed, Exception: System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager.InitializeIlmClient(String ILMMachineName, Int32 FIMWebClientTimeOut) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager..ctor(UserProfileApplicationProxy userProfileApplicationProxy, Guid partitionID) at Microsoft.SharePoint.Portal.WebControls.UserProfileServiceStatisticsWebPartBase.LoadControl(Object sender, EventArgs e) f48806c2-7dac-439f-ba7d-078054357959
03/01/2011 09:32:42.95 w3wp.exe (0x0870) 0x14F8 SharePoint Portal Server User Profiles et8j High UserProfileServiceAudienceStatisticsWebPart:LoadControl failed, Exception: System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager.InitializeIlmClient(String ILMMachineName, Int32 FIMWebClientTimeOut) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager..ctor(UserProfileApplicationProxy userProfileApplicationProxy, Guid partitionID) at Microsoft.SharePoint.Portal.WebControls.UserProfileServiceStatisticsWebPartBase.LoadControl(Object sender, EventArgs e) f48806c2-7dac-439f-ba7d-078054357959
03/01/2011 09:32:42.95 w3wp.exe (0x0870) 0x14F8 SharePoint Portal Server User Profiles et8j High UserProfileServiceImportStatisticsWebPart:LoadControl failed, Exception: System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager.InitializeIlmClient(String ILMMachineName, Int32 FIMWebClientTimeOut) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager..ctor(UserProfileApplicationProxy userProfileApplicationProxy, Guid partitionID) at Microsoft.SharePoint.Portal.WebControls.UserProfileServiceStatisticsWebPartBase.LoadControl(Object sender, EventArgs e) f48806c2-7dac-439f-ba7d-078054357959
03/01/2011 09:32:42.98 w3wp.exe (0x0870) 0x14F8 SharePoint Foundation Runtime tkau Unexpected System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager.InitializeIlmClient(String ILMMachineName, Int32 FIMWebClientTimeOut) at Microsoft.Office.Server.UserProfiles.UserProfileConfigManager..ctor(UserProfileApplicationProxy userProfileApplicationProxy, Guid partitionID) at Microsoft.SharePoint.Portal.UserProfiles.AdminUI.ProfileAdminPage.IsProfileSynchronizationRunning() at Microsoft.SharePoint.Portal.WebControls.UserProfileServiceImportStatisticsWebPart.RenderSectionContents(HtmlTextWriter writer) at Microsoft.SharePoint.Portal.WebControls.UserProfileServiceImportStatisticsWebPart.RenderWebPart(HtmlTextWriter write... f48806c2-7dac-439f-ba7d-078054357959
03/01/2011 09:32:42.98* w3wp.exe (0x0870) 0x14F8 SharePoint Foundation Runtime tkau Unexpected ...r) at Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at Syst... f48806c2-7dac-439f-ba7d-078054357959
03/01/2011 09:32:42.98* w3wp.exe (0x0870) 0x14F8 SharePoint Foundation Runtime tkau Unexpected ...em.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase.RenderChildren(HtmlTextWriter writer) at System.Web.UI.Page.Render(HtmlTextWriter writer) at Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase.Render(HtmlTextWriter writer) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) f48806c2-7dac-439f-ba7d-078054357959
Found this blog post.
http://praveenbattula.blogspot.com/2010/05/userprofileserviceuserstatisticswebpart.html
I had gone through the Forefront issues before and had checked to insure they were running, so I performed an IISRESET. Went back to look at the User Profile Sync Service and it showed to be started.
All I needed was an IISRESET? Maybe it was due to restarting all my servers in an incorrect order after the SP1 update.
If you are upgrading from SharePoint 2007 to SharePoint 2010 and run into an error when using the Test-SPContentDatabase cmdlet in Powershell, try this quick tip.
Navigate to the C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES folder on the SharePoint 2007 box and perform a GREP (search using “look in” files option) for part of the GUID of the missing feature.
This will likely point you to a feature.xml file that has the feature GUID inside it.
Using this file and the containing folder, you should be able to identify what feature is causing your problem.
Here is the original error.
Category : MissingFeature
Error : True
UpgradeBlocking : False
Message : Database [WSS_Content_SharePointRx] has reference(s) to a mis
sing feature: Id = [d0944c5e-9a3a-41a0-ab89-6a810e305574].
Remedy : The feature with Id d0944c5e-9a3a-41a0-ab89-6a810e305574 is r
eferenced in the database [WSS_Content_SharePointRx], but is
not installed on the current farm. The missing feature may ca
use upgrade to fail. Please install any solution which contai
ns the feature and restart upgrade if necessary.
You might also find some custom InfoPath form templates that have been installed and activated as a feature.
Category : MissingFeature
Error : True
UpgradeBlocking : False
Message : Database [WSS_Content_SharePointRx] has reference(s) to a mis
sing feature: Id = [f1af5c31-4605-4469-f8bb-a65f854060e9].
Remedy : The feature with Id f1af5c31-4605-4469-f8bb-a65f854060e9 is r
eferenced in the database [WSS_Content_SharePointRx], but is
not installed on the current farm. The missing feature may ca
use upgrade to fail. Please install any solution which contai
ns the feature and restart upgrade if necessary.
The incremental User Profile Service timer job was failing.
After looking around, I also noticed the User Profile Service would not start correctly.
The Forefront Identity Manager Service and Forefront Identity Manager Synchronization Service were both disabled for some reason. I set them to Automatic. They already had the SPFarm credentials assigned to them.
Now the User Profile Service starts correctly and the incremental job runs successfully.
References