SharePoint Dev Error: Exception from HRESULT: 0x80040E14

I told myself I was going to stop blogging about SharePoint 2007 stuff but this one may apply to 2010 as well. And it took me and a cohort nearly 3 days to figure out.

Scenario:

The project is using MOSS 2007 as a Supply Chain Management Application Platform. A SharePoint data access layer (DAL) was built to speed development across the development teams so that they didn’t have to worry about the intricacies of working with the SharePoint object model. The data primarily resided within a single SharePoint list and consisted of ~80 columns and > 100,000 list items. My part was to create a custom Edit/Display/Version History form web part that would render data according to custom user roles, rights, and various other criteria. For example, User A can see 50 fields, write to 10 fields and see 40 as read-only data. User B can see 20 fields, write to 5 fields and see the rest as read-only data. The custom web part also utilizes the DAL to update SharePoint list items with new data.

Problem:

Upon saving the data back to SharePoint using the custom DAL, the version history was incremented but none of the form data was being written back to the SharePoint list item. As we were debugging the issue, we came across the following exceptions and errors messages from Visual Studio and the SharePoint diagnostic logs.

Exception from HRESULT: 0x80040E14

Source = “Microsoft.SharePoint”

StackTrace = ”   at Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, …

Windows SharePoint Services | Database | 6f8g | Unexpected

Unexpected query execution failure, error code 8145. Additional error information from SQL Server is included below. “@tp_ID is not a parameter for procedure proc_UpdateListItem.” Query text (if available): “BEGIN TRAN;DECLARE @@iRet INT,@DN nvarchar(256),@LN nvarchar(128),@@S uniqueidentifier,@@Level tinyint,@@DocUIVersion int,@ExtraItemSize bigint;SET @@iRet = 0;SET @@S=’B1DA1F55-D16D-4E46-9FB8-F0B4795368EB’;SET @@Level=1;SET @@DocUIVersion = 512; SELECT @ExtraItemSize = 0 EXEC @@iRet = proc_UpdateListItem @SiteId=’B1DA1F55-D16D-4E46-9FB8-F0B4795368EB’,@WebId=’5ABC8FE7-112D-40A9-A2B7-F731F620F549′, @ListID = ‘37386B71-16F1-4EC4-BF4B-80B83F847F0E’, @ItemID=1759, @RowOrdinal = 0,@ReturnRowset = 1,@ItemDirName=@DN OUTPUT,@ItemLeafName=@LN OUTPUT,@UserId=1,@TimeNow = ‘20100527 15:09:30’,@Ma…

Windows SharePoint Services | Database | 8e2s | Medium

Unknown SPRequest error occurred. More information: 0x80040e14

Solution:

My unnamed cohort really gets the credit for this one. In the DAL, all the SPListItem field updates were referencing internal field names. For example:

SPListItem item = some item you get from SharePoint;
item[internalFieldName] = “some value”;
item.update();

Usually, that would work just fine and is typically the preferred method since often times the field display names can be changed through the user interface rendering your code useless. But it simply wouldn’t work in our situation. After modifying the DAL to update the items using the display names, everything worked as expected! What a cockeyed bugger right?

SPListItem item = some item you get from SharePoint;
item[displayFieldName] = “some value”;
item.update();

SharePoint 2010 Troubleshooting: 503 Service Unavailable, App Pool Shutdown

Environment:

SharePoint 2010 Enterprise RTM
Windows Server 2008 R2 Domain

Description:

I chose not to use the Farm Configuration Wizard, but instead create my web applications manually.

1. Created a new Web Application.
2. Added a new managed service account.
3. Created a new application pool for this web app.
4. Created a Site Collection for this web app.

Error Messages:

The following error occurs when trying to launch the newly created Site Collection:

HTTP Error 503. The service in unavailable.

The application pool is shutdown and the Event Viewer indicates:

Log Name:      Application
Source:        Microsoft-Windows-User Profiles Service
Date:          4/24/2010 4:58:28 PM
Event ID:      1500
Task Category: None
Level:         Error
Keywords:
User:          GUERILLA\spapppool
Computer:      SPS2010RTM.guerilla.local
Description:
Windows cannot log you on because your profile cannot be loaded. Check that you are connected to the network, and that your network is functioning correctly.

DETAIL – Unspecified error

Observations:

Seems like the application pool was having trouble loading the user profile for the service account. Since I had never logged on locally with the service account before, it was unable to find a user profile for it (C:\Users\).

Resolutions:

Option 1 – Log on locally with the service account once to create a local profile for it.

Option 2 – Modify the application pool by going into IIS > Application Pools > Right-Click offending app pool > Advanced Settings > Set “Load User Profile” to False.

Side Effects?

Haven’t seen any yet… Not sure if SharePoint service accounts need to have local user profiles for anything in particular.

Automated SharePoint 2007 Farm Configuration Batch File

This one’s been sitting in my queue for a few weeks, hopefully it could still be of value to people out there still building out MOSS 2007 farms. I think this script took me roughly a week to put together and pretty much configures a farm just the way I like it. Now only if I had done this earlier in the product cycle…Anyways, much thanks to those that came before me and also to Gary Lapointe for his custom STSADM commands which my script does leverage for a couple of things. This will also probably be my last post about WSSv3/MOSS 2007. From here on out, it’s 2010 stuff baby!

Download batch file here.

Or scan the script below…

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Requires Gary Lapointe’s STSADM Extensions for complete automation.
:: Place his WSP package into the %UtilitySolutions% directory.
:: http://stsadm.blogspot.com/2009/02/downloads.html
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::————————————————::::————————————————::::————————————————::
::————————————————::::————————————————::::————————————————::
::————————————————::::—————Start Variables—————::::————————————————::
::————————————————::::————————————————::::————————————————::
::————————————————::::————————————————::::————————————————::

::————————————————::
::—————– Set Tools ——————–::
::————————————————::
set SPLocation=”%CommonProgramFiles%\Microsoft Shared\web server extensions\12″
set STSADM=%SPLocation%\BIN\stsadm.exe
set PSCONFIG=%SPLocation%\BIN\psconfig.exe
set UtilitySolutions=C:\temp
::————————————————::

::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::: Set SharePoint Farm Configurations ::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::
::————– Server Names———————::
set SQLServerName=YourSQLInstanceInstanceName
set SPWebFrontEndName=YourSharePointWebFrontEndServerName
set SPSearchIndex=YourSharePointIndexServerName
::————————————————::

::————– Web application ports ———–::
::——– These ports are configurable ———-::
::————————————————::
set SPCentralAdminPort=90
set SPSSPPort=91
set SPMySitePort=81
set DefaultApplicationPort=80
::————————————————::

::—- Shared Services Provider Configurations —::
:: You can leave most of these alone except for the index location ::
::————————————————::
set SPSSPName=SharedServices1
set SPSSPUrl=http://%SPWebFrontEndName%:%SPSSPPort%
set SPSSPWebAppName=”Shared Services Provider”
set SPSSPDescription=”SSP Host”
set SSPApplicationPoolName=”SharedServices1″
set SPSearchIndexLocation=c:\temp\spsearchindexes
mkdir %SPSearchIndexLocation%
::————————————————::

::————— Database Names —————–::
:: Change if you want or leave them as they are   ::
::————————————————::
set SPConfigDatabaseName=SharePoint_Config
set SPConfigContentDB=SharePoint_CentralAdmin_Content
set SPSearchDatabaseName=WSS_Search
set SPSSPConfigDatabaseName=%SPSSPName%_Config_DB
set SPSSPDatabaseName=%SPSSPName%_DB
set SPSSPSearchDatabaseName=%SPSSPName%_Search_DB
set SPMySiteContentDBName=WSS_Content_MySites
::————————————————::

::————————————————::
::——– Central Admin Configurations ———-::
::————————————————::

::————– Email Settings ——————::
set SPSearchContactEmail=email@emailcom
set SPOutboundSMTPServer=email@emailcom
set SPOutboundEmailFrom=email@emailcom
set SPReplyToEmail=email@emailcom
::————————————————::

::————- Search Settings ——————::
set SPSearchIndexPerformance=Reduced
:: Your options: < Reduced | PartlyReduced | Maximum >

set SPSearchRole=indexquery
:: Your options: < Index | Query | IndexQuery >
::————————————————::

::————- Diagnostic Logging —————::
set SPDiagnosticLoggingThrottle=Verbose
:: Your options: < None | Unexpected | Monitorable | High | Medium | Verbose >

:: You can change this directory if you want
set SPDiagnosticLoggingDirectory=c:\temp\spdiagnostics
mkdir %SPDiagnosticLoggingDirectory%

set SPDiagnosticLoggingFileCount=10
:: Your options: <0-1024>

set SPDiagnosticLoggingFileMinutes=30
:: Your options: <0-1440>
::————————————————::

::———— Usage Analysis Settings ———–::

:: You can change this directory if you want
set SPUsageAnalysisLogFileLocation=c:\temp\spusageanalysis

mkdir %SPUsageAnalysisLogFileLocation%
set SPUSageAnalysisLogFileCount=1
:: Your options: <0-30>

set SPUsageAnalysisJobStartTime=2:00AM
set SPUsageAnalysisJobEndTime=3:00AM
::————————————————::
::————————————————::

::————————————————::
::—— Main Content Web App Configurations —–::
::————————————————::
IF /i %DefaultApplicationPort%==80 (set OOBApplicationURL=http://%SPWebFrontEndName%) ELSE (set OOBApplicationURL=http://%SPWebFrontEndName%:%DefaultApplicationPort%)
ECHO Default web application port is %DefaultApplicationPort%

:: Optional Alternate Access Mapping configurations
::set NewAlternateAccessMapping=http://test
::set NewAlternateAccessMappingZone=Default
:: <Default | Intranet | Internet | Extranet | Custom>
:: More AAM settings can be added here if necessary

set WebApplicationOwner=domain\henry.ong
set WebApplicationOwnerEmail=email@email.com
set WebApplicationOwnerDisplayName=”Henry Ong”
set SPSiteTitle=”Collaboration Portal”
set SPSiteDecription=”This is a description for your site collection.”
set ApplicationPoolName=”Application Pool Name for this Web App”
set SPContentDBName=WSS_Content_AppName

set SPSiteTemplate=SPSPORTAL#0

:: Possible templates listed below
:: GLOBAL (Placeholder, no template)
:: STS#0 (Team Site)
:: STS#1 (Blank Site)
:: STS#2 (Document Workspace)
:: MPS#0 (Basic Meeting Workspace)
:: MPS#1 (Blank Meeting Workspace)
:: MPS#2 (Descision Meeting Workspace)
:: MPS#3 (Social Meeting Workspace)
:: MPS#4 (Multipage Meeting Workspace)
:: CENTRALADMIN#0 (Central Administration)
:: WIKI#0 (Wiki Site)
:: BLOG#0 (Blog Site)
:: BDR#0 (Document Center)
:: OFFILE#1 (Records Center)
:: OSRV#0 (Shared Services Administration Site)
:: SPSPERS#0 (SharePoint Portal Server Personal Space ? Obsolete ?)
:: SPSMSITE#0 (Personalization Site)
:: CMSPUBLISHING#0 (Publishing Site)
:: BLANKINTERNET#0 (Publishing Site)
:: BLANKINTERNET#1 (Press Releases Site)
:: BLANKINTERNET#2 (Publishing Site with workflow)
:: SPSNHOME#0 (News Site)
:: SPSSITES#0 (Site Directory)
:: SPSREPORTCENTER#0 (Report Center)
:: SPSPORTAL#0 (Collaboration Portal)
:: SRCHCEN#0 (Search Center with Tabs)
:: PROFILES#0 (Profiles)
:: BLANKINTERNETCONTAINER#0 (Publishing Portal)
:: SPSMSITEHOST#0 (My Site Host)
:: SRCHCENTERLITE#0 (Search Center)
:: SRCHCENTERLITE#1 (Search Center)

::————————————————::
::———— My Site Configurations ————::
::————————————————::
set CreateNewWebApp=false
:: Your options: <true | false>
:: False will create the My Site under your default web app configured above.

set MySiteApplicationURL=http://%SPWebFrontEndName%:%SPMySitePort%
::set MySiteAlternateAccessMapping=http://mysite******
::set MySiteAlternateAccessMappingZone=Default ******
:: Your options: <Default | Intranet | Internet | Extranet | Custom>
:: More AAM settings can be added if necessary

set MySiteWebApplicationOwner=domain\henry.ong
set MySiteWebApplicationOwnerEmail=email@email.com
set MySiteWebApplicationOwnerDisplayName=”Henry Ong”
set SPMySiteTemplate=SPSMSITEHOST#0
set SPMySiteSiteDecription=”My Site Host”
set MySiteApplicationPoolName=”My Sites”
::————————————————::
::————————————————::

::————————————————::
::——— Set SharePoint Service Accounts ——::
::————— All Configurable —————::
::————————————————::
set ServiceAccountSPFarm=domain\spdbaccess
set ServiceAccountSPFarmPassword=password

set ServiceAccountSSP=domain\spssp
set ServiceAccountSSPPassword=password

set ServiceAccountSPSearch=domain\spsearch
set ServiceAccountSPSearchPassword=password

set ServiceAccountContentAccess=domain\spcontentaccess
set ServiceAccountContentAccessPassword=password

set ServiceAccountMySite=domain\spmysite
set ServiceAccountMySitePassword=password

set ServiceAccountApplicationAppPool=domain\spapppool
set ServiceAccountApplicationAppPoolPassword=password

::————————————————::::————————————————::::————————————————::
::————————————————::::————————————————::::————————————————::
::—————————————————————-:: END VARIABLES ::————————————————.————::
::————————————————::::————————————————::::————————————————::
::————————————————::::————————————————::::————————————————::

::————————————————::
:: Creating Central Administration
::————————————————::
ECHO “Create Central Admin”

%PSCONFIG% -cmd configdb -create -server %SQLServerName% -database %SPConfigDatabaseName% -user %ServiceAccountSPFarm% -password %ServiceAccountSPFarmPassword% -admincontentdatabase %SPConfigContentDB%

%PSCONFIG% -cmd helpcollections -installall

%PSCONFIG% -cmd secureresources

%PSCONFIG% -cmd services -install

:: Use this if activating all the farm services on this server
::%PSCONFIG% -cmd services -provision

%PSCONFIG% -cmd installfeatures

%PSCONFIG% -cmd adminvs -provision -port %SPCentralAdminPort% -windowsauthprovider onlyusentlm

%PSCONFIG% -cmd applicationcontent -install
ECHO “Finished creating Central Admin…”

::————————————————::
:: Configuring Central Administration
::————————————————::
ECHO “Configuring Central Admin…”

%STSADM% -o addsolution -filename %UtilitySolutions%\Lapointe.SharePoint.STSADM.Commands.wsp
%STSADM% -o deploysolution -name Lapointe.SharePoint.STSADM.Commands.wsp -immediate -allowgacdeployment
%STSADM% -o execadmsvcjobs
%STSADM% -o spsearch -action start -farmperformancelevel %SPSearchIndexPerformance% -farmserviceaccount %ServiceAccountSPSearch% -farmservicepassword %ServiceAccountSPSearchPassword% -farmcontentaccessaccount %ServiceAccountContentAccess% -farmcontentaccesspassword %ServiceAccountContentAccessPassword% -databaseserver %SQLServerName% -databasename %SPSearchDatabaseName%
%STSADM% -o osearch -action start -role %SPSearchRole% -farmcontactemail %SPSearchContactEmail% -farmperformancelevel %SPSearchIndexPerformance% -farmserviceaccount %ServiceAccountSPSearch% -farmservicepassword %ServiceAccountSPSearchPassword%
%STSADM% -o email -outsmtpserver %SPOutboundSMTPServer% -fromaddress %SPOutboundEmailFrom% -replytoaddress %SPReplyToEmail% -codepage 65001
%STSADM% -o setlogginglevel -tracelevel %SPDiagnosticLoggingThrottle%
%STSADM% -o gl-tracelog -logdirectory %SPDiagnosticLoggingDirectory% -logfilecount %SPDiagnosticLoggingFileCount% -logfileminutes %SPDiagnosticLoggingFileMinutes%
ECHO “Finished configuring Central Admin…”

IISRESET /STOP /NOFORCE
IISRESET /START

::————————————————::
:: Create Initial Application Web App
::————————————————::
ECHO “Creating initial web application portal…”

%STSADM% -o extendvs -url %OOBApplicationURL% -ownerlogin %WebApplicationOwner% -owneremail %WebApplicationOwnerEmail% -exclusivelyusentlm -ownername %WebApplicationOwnerDisplayName% -databaseserver %SQLServerName% -databasename %SPContentDBName% -donotcreatesite -description %SPSiteDecription% -apidname %ApplicationPoolName% -apidtype configurableid -apidlogin %ServiceAccountApplicationAppPool% -apidpwd %ServiceAccountApplicationAppPoolPassword%
%STSADM% -o createsite -url %OOBApplicationURL% -owneremail %WebApplicationOwnerEmail% -ownerlogin %WebApplicationOwner% -ownername %WebApplicationOwnerDisplayName% -sitetemplate %SPSiteTemplate% -title %SPSiteTitle% -description %SPSiteDecription%
ECHO “Finished creating initial web application portal…”

::————————————————::
:: Create My Site Web App
::————————————————::
ECHO “Creating My Site Host…”

IF /i %CreateNewWebApp%==true (goto CreateNewMySiteWebApp) ELSE (goto CreateNewMySiteExistingWebApp)

:CreateNewMySiteWebApp
ECHO “Creating new My Site Web App”
%STSADM% -o extendvs -url %MySiteApplicationURL% -ownerlogin %MySiteWebApplicationOwner% -owneremail %MySiteWebApplicationOwnerEmail% -exclusivelyusentlm -ownername %MySiteWebApplicationOwnerDisplayName% -databaseserver %SQLServerName% -databasename %SPMySiteContentDBName% -sitetemplate %SPMySiteTemplate% -description %SPMySiteSiteDecription% -apidname %MySiteApplicationPoolName% -apidtype configurableid -apidlogin %ServiceAccountMySite% -apidpwd %ServiceAccountMySitePassword%
%STSADM% -o enablessc -url %MySiteApplicationURL%
set MySiteURL=%MySiteApplicationURL%
ECHO “Finished Creating My Site Host…”

GOTO SSP

:CreateNewMySiteExistingWebApp
ECHO “Creating My Site Host using existing web app”
%STSADM% -o addpath -url %OOBApplicationURL%/MySites -type explicitinclusion
:: <ExplicitInclusion | WildcardInclusion>
%STSADM% -o enablessc -url %OOBApplicationURL%/MySites

%STSADM% -o createsite -url %OOBApplicationURL%/MySites -oe %MySiteWebApplicationOwnerEmail% -ol %MySiteWebApplicationOwner% -on %MySiteWebApplicationOwnerDisplayName% -lcid 1033 -st %SPMySiteTemplate% -t %SPMySiteSiteDecription% -desc %SPMySiteSiteDecription%
set MySiteURL=%OOBApplicationURL%/MySites/
ECHO “Finished Creating My Site Host…”

GOTO SSP

:SSP
::————————————————::
:: Create SSP
::————————————————::
ECHO “Creating SSP…”
%STSADM% -o extendvs -url %SPSSPUrl% -exclusivelyusentlm -databaseserver %SQLServerName% -databasename %SPSSPDatabaseName% -donotcreatesite -description %SPSSPWebAppName% -apidname %SSPApplicationPoolName% -apidtype configurableid -apidlogin %ServiceAccountSSP% -apidpwd %ServiceAccountSSPPassword%

IISRESET /STOP /NOFORCE
IISRESET /START

%STSADM% -o createssp -title %SPSSPName% -url %SPSSPUrl% -mysiteurl %MySiteURL% -ssplogin %ServiceAccountSSP% -indexserver %SPSearchIndex% -indexlocation %SPSearchIndexLocation% -ssppassword %ServiceAccountSSPPassword% -sspdatabaseserver %SQLServerName% -sspdatabasename %SPSSPConfigDatabaseName% -searchdatabaseserver %SQLServerName% -searchdatabasename %SPSSPSearchDatabaseName% -ssl no
ECHO “Finished Creating SSP…”

ECHO “Ignore Syntax error messages if not using alternate access mapping configurations in this script.”

%STSADM% -o gl-setusageanalysis -enablelogging true -enableusageprocessing true -logfilelocation %SPUsageAnalysisLogFileLocation% -numberoflogfiles %SPUSageAnalysisLogFileCount% -processingstarttime %SPUsageAnalysisJobStartTime% -processingendtime %SPUsageAnalysisJobEndTime% -sspname %SPSSPName% -enableadvancedprocessing true -enablequerylogging true
%STSADM% -o addalternatedomain -url %OOBApplicationURL% -incomingurl %NewAlternateAccessMapping% -urlzone %NewAlternateAccessMappingZone%
%STSADM% -o addzoneurl -url %NewAlternateAccessMapping% -urlzone %NewAlternateAccessMappingZone% -zonemappedurl %NewAlternateAccessMapping%

ECHO Done!
PAUSE

SharePoint Active Directory FBA Configuration References

Just some personal reference so I don’t have to go hunting for this stuff again. Nothing to see here folks… move steadily along… single file please…

Using Active Directory as the membership store via 2 different methods simultaneously –

System.Web.Security.ActiveDirectoryMembershipProvider & Microsoft.Office.Server.Security.LdapMembershipProvider

Assumptions:
MOSS 2007 Farm Configured
Port 80: Initial NTLM Web Application and Site Collection configured.
Port 81: ActiveDirectoryMembershipProvider.
Port 82: LDAPMembershipProvider.

Step 1: Extend Port 80 to Port 81 & Port 82

Step 2: Update the web.config for port 81 (ActiveDirectoryMembershipProvider)
Add the connection string settings to anywhere with the <configuration> section.

<configuration>
...
<connectionStrings>
<add connectionString="LDAP://DomainController.local/DC=DomainController,DC=local" 
name="ADConnection"/>
</connectionStrings>
...
</configuration>

Within <system.web> add the following:

<system.web>
...
<membership defaultProvider="ADMembershipProvider">
 <providers>
 <add name="ADMembershipProvider" 
type="System.Web.Security.ActiveDirectoryMembershipProvider, 
System.Web, 
Version=2.0.0.0, 
Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a" 
connectionStringName="ADConnection" 
connectionUsername="domain\account" 
connectionPassword="password" 
attributeMapUsername="SAMAccountName"/>
 </providers>
</membership>
...
</system.web>

Step 3: Update the web.config for port 82 (LDAPMembershipProvider)

Within <system.web> add the following:

<system.web>

...
<membership defaultProvider="LDAPProvider">
 <providers>
 <add name="LDAPProvider" 
type="Microsoft.Office.Server.Security.LdapMembershipProvider, 
Microsoft.Office.Server, 
Version=12.0.0.0, 
Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" 
server="yourDomain.local" 
port="389" 
useSSL="false" 
userDNAttribute="distinguishedName" 
userNameAttribute="SAMAccountName" 
userContainer="DC=yourDomain,DC=local" 
userObjectClass="person" 
userFilter="(|(ObjectCategory=group)(ObjectClass=person))" 
scope="Subtree" 
otherRequiredUserAttributes="sn,givenname,cn" />
 </providers>
</membership>
...
</system.web>

Step 4: Update the web.config for Central Administration

Add the connection string settings to anywhere with the <configuration> section.

<configuration>
...
<connectionStrings>
<add connectionString="LDAP://DomainController.local/DC=DomainController,DC=local" 
name="ADConnection"/>
</connectionStrings>
...
</configuration>

Within <system.web> add the following:

<system.web>
...
<membership>
 <providers>
 <add name="ADMembershipProvider" 
type="System.Web.Security.ActiveDirectoryMembershipProvider, 
System.Web, Version=2.0.0.0, 
Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a" 
connectionStringName="ADConnection" 
connectionUsername="domain\account" 
connectionPassword="password" 
attributeMapUsername="SAMAccountName"/>

 <add name="LDAPProvider" 
type="Microsoft.Office.Server.Security.LdapMembershipProvider, 
Microsoft.Office.Server, 
Version=12.0.0.0, 
Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" 
server="yourDomain.local" 
port="389" 
useSSL="false" 
userDNAttribute="distinguishedName" 
userNameAttribute="SAMAccountName"
userContainer="DC=yourDomain,DC=local" 
userObjectClass="person" 
userFilter="(|(ObjectCategory=group)(ObjectClass=person))" 
scope="Subtree" 
otherRequiredUserAttributes="sn,givenname,cn" />
 </providers>
</membership>
...
</system.web>


Step 5: Update Central Administration Settings

Go to Central Administration > Application Management > Authentication Providers > Adjust the Membership Provider Names to match your providers. In this case, the zone representing port 81would utilize “ADMembershipProvider” and the zone representing port 82 would utilize “LDAPProvider”

Configure unique outgoing email settings per SharePoint web application

Here’s something new that I just came across as I was trolling STSADM documentation… Did you know that you can set unique outgoing email settings per web application in SharePoint? Well, you probably didn’t because there’s no configuration page for it in Central Administration (there’s a config page that applies the outgoing email settings globally, not per web app).

What are some use cases for this?

  • Maybe you have a different web app per business unit and you want to have each web app send emails from different addresses. Examples:
    • SharePoint emails from Accounting department comes from accounting@company.com while emails from Human Resources come from hr@company.com. The same configuration options are available for the reply-to addresses.
  • Maybe you have some multi-tenancy going on in your environment and you want each web app to send SharePoint emails through unique SMTP servers.
    • You can configure one tenant’s web app to send mail through one SMTP server while another tenant’s uses another SMTP server.

Magical STSADM command:
stsadm -o email -outsmtpserver mail.example.com -fromaddress someone@example.com -replytoaddress someone@example.com -codepage 65001 -url http://web_app_url

 

SharePoint Workflow & BPM Vendor Comparison Chart

I had every intention of going into each of these software packages in much greater detail but as I started unwrapping these packages, I quickly found out that doing so is no easy task. There is so much depth to all of these products that I would simply not do any of them justice without spending an inordinate amount of time becoming deeply familiar with each and every one of them. So instead, I’ll capture whatever notes I’ve come up with here and will continue to update this as an evolving pseudo-wiki page going forward. Take these opinions with a grain of salt, but yes please do comment if any of it is mistaken or incorrect! With that said, let’s do a recap of what we learned so far…

Since I can’t do IFrames with WordPress, you’ll have to click here for the comparison chart. Sorry bub.

Workflow Software vs. BPM Software: What’s the difference?

I’m curious about what you think, so here’s a question for you:

Let’s think about this at the software level – In your opinion/experience/expertise, what are the key differentiators between a workflow product and a business process managmement (BPM) product? Your opinions can be formed with experience from within or outside of the SharePoint arena.

A lucky commenter that I choose at random on January 31, 2010 will win a super rare, ultra collectable copy of SharePoint Designer 2007 in mint condition pictured below :).

Unopened and in mint condition!

SharePoint Workflow != Business Process Management (BPM)

Part 1; You are here.
Part 2: SharePoint Workflow & BPM Vendor Comparison Chart

Once upon a time, I was a fledgling IT business analyst with a concentration in enterprise collaboration tools and processes. So one day, a company executive said, “Henry, we need some tools to help us manage our business processes… you know… like something that can keep track of everyone’s tasks… send emails to the person that has the next action… Then have it email me when everything’s done.”

Well, having looked at oodles of Microsoft SharePoint presentations and pizza charts, I told him, “Mr. Company Executive, I have just the thing in mind. Since we’re already using SharePoint, we can take advantage of the cool workflow capabilities already built into the system!”

And so it began… We started off with some short and sweet implementations like having Joe (the CTO) approve James’ (QA Manager) TPS reports using the OOTB document approval workflows in SharePoint. Then we used SharePoint Designer to make some more robust workflows that enabled James to provide some more information to be used as variables inside the workflow. Then as soon as we outgrew that, we even busted out Visual Studio for some custom SharePoint workflows that copied these TPS reports out to customer extranet sites. Then we wanted to make the workflow talk to our accounting system, and our SalesForce CRM account, and then have it trigger some other processes… yada yada…You get the idea right?  But going down this path, we quickly realized this one critical key point:

SharePoint Workflows are only good for managing business processes if your entire business process resides within SharePoint!

<!— Update (1/11/2010):

“Whoa nelly!” you might be saying to yourself. “That’s quite a loaded statement. Care to clarify?”

SharePoint is meant to be an end-user enabler. In our case, of all the self-service things that an end-user can do in SharePoint, the ability to create workflows by their lonesomes had become one of the most empowering tools. But once we got to the point of having to create custom workflows and workflow actions in Visual Studio for all the different systems, the thought of burdening developers to develop, maintain and enhance these proved to be an overhead that simply wasn’t worth it to us (in comparisons to third-party workflow solutions that are available).

Well I guess that’s not entirely true. If you can afford to have a development team dedicated to creating custom workflows in Visual Studio and are willing to have them update the workflows every two weeks (exaggeration?) as the business process changes, then you should be ok. But how many companies out there can actually afford to do that right?

So that’s when I figured out the difference between OOTB SharePoint workflow capabilities and the difference between user-centric workflow and business process management software.

—>

“Hold on one darn second there”, you’re saying. “So what’s the difference between SharePoint Workflows and Business Process Management Software?”

Well, in some ways they’re the same and in some ways the differences are black and white. In its most basic form (OOTB & SharePoint Designer) I would consider SharePoint workflows to have the following characteristics:

  • Can be manually or automatically invoked by some human action.
  • Workflow states typically consist of Start, Pause, Wait for User Action, End.
  • Workflow states can be changed based on predefined business rules or logic.
  • Actions are typically confined to the boundaries of SharePoint and in many instances, the actions are confined to even more granular levels like the site or document library.
  • Although the results of workflow actions can be recorded and logged in history, multiple versions of the workflow models themselves cannot be saved.
  • Changes to the workflow process can not be applied retroactively. Once a workflow process has begun, it can only follow its predefined path or be terminated.

On the other hand, Business Process Management is an idea or strategy typically executed with and supported by the use of Business Process Management Systems (BPMS). I would consider the following features to be available at minimum:

  • Can be manually or automatically invoked by some human or system action.
  • Actions are never bound to any particular system.
  • Should be able to communicate with any software system in the enterprise by way of web services and other service oriented architectures.
  • Can be used to model, implement and manage the entire lifecycle of any customer facing or internal business process regardless of the number of different systems it has to interact with.
  • Can enable the business to change their process on the fly without detriment to processes already in flight.

<!— Update (1/11/2010):

Why is the title of this post “SharePoint Workflow != Business Process Management”? Because without getting into code, OOTB SharePoint workflow just doesn’t give you much flexibility in really managing full business processes… but it can be close!

There is a huge market space in between the 2 sets of characteristics that I had listed above. This space, which I will call the “SharePoint Workflow solutions that want to be pseudo BPM machines but can’t call themselves BPM machines because SharePoint people only know what workflow means” category. These solutions typically help business users overcome just about all of the issues with the OOTB SharePoint workflow capabilities, yet also include a multitude of custom actions that enable them to interact with things outside of SharePoint, thus sharing some characteristics of a true BPMS.

—>

Now if you just read that and are still scratching your head, my apologies. Just remember this important differentiator: OOTB SharePoint workflows don’t are difficult to scale outside of SharePoint without Visual Studio.

So how does all this information help you and your SharePoint implementation?

If you’ve been working with SharePoint workflows for awhile and have started looking at supplemental workflow solutions, you’ve probably come across quite a few options out there. As these third party products have matured, they are also increasingly blurring the lines between just being SharePoint workflow solutions to including capabilities that also enable them to become full blown business process management systems. In the next few posts, I’m going to take a good hard look at each of these SharePoint workflow/BPM solutions and give you the low down on the pros and cons of each that I will be evaluating. Stay tuned.

SharePoint + Windows 2008 R2 + SQL 2008 Report Viewer Error

Environment

Windows Server 2008 R2 x64 MOSS 2007 SP2 Web Front End
Windows Server 2008 R2 x64 SQL Server 2008  with all the services installed and SharePoint Integration Mode on.

Issue

Upon trying to launch Central Administration for the first time I was presented with the following error:

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Could not load file or assembly ‘Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The system cannot find the file specified.

Troubleshooting steps

First I tried to manually drag the following DLLs from the SQL Server to the SharePoint Server:

Microsoft.ReportViewer.Common.dll
Microsoft.ReportViewer.ProcessingObjectModel.dll
Microsoft.ReportViewer.WebForms.dll
Microsoft.ReportViewer.WinForms.dll

I soon found out that it’s not possible to drag DLLs the GAC if you have UAC turned on with Windows Server 2008. I really didn’t want to turn that off so I stumbled across some other suggestions on the web that didn’t really work either. These other suggestions were to use the run as command on various Explorer windows to copy the files to the GAC. Eventually I ended up logging on as the SharePoint server’s local administrator account and was able to successfully drag the DLLs into the GAC. Only problem was that the versions didn’t match up…

Solution

Enter the Report Viewer 2005 Redistributable. Installing that deployed the proper DLLs to the GAC and SharePoint Central Admin was able to load successfully. Woot.

Visiting AgilePoint HQ this weekend

Howdy y’all,

The folks over at AgilePoint has invited me and a few other SharePoint community MVPs and “VIPs” to spend a few days with them at their company headquarters this upcoming Friday through Sunday. What for you ask? To find out what they’re all about! Well, not only that but to also help them execute on their growth strategy as a member of their very selective partner circle. From what I understand, I’ll be helping you guys better understand the technology behind how AgilePoint works and through the partnership with 6th Street Consulting, hopefully I’ll get to work with you implement some AgilePoint goodness as well.

What is AgilePoint?
Good question. According to their website they specialize in Business Process Management Systems (BPMS).

How’s this different from say K2 or Nintex workflows for SharePoint?
Honestly, I don’t know yet. But I’m eager to find out!

How does this  integrate with SharePoint?
From what I’ve seen so far, SharePoint acts as a front end for rendering AgilePoint data. But I’m sure that’s just scratching the surface…

How long have you been working with the AgilePoint software?
Exactly 3 hours, 12 minutes, and 37 seconds. Aside from that, I truly am quite surprised that they have been around for a few SharePoint iterations now and seem to be doing quite well whereas I’ve seen many other vendors come and go.

What are some of AgilePoint’s competitors?
Off the top of my head, some direct and indirect competitors are K2, Nintex, Bluespring Software, Captaris, Skelta…

So while I’m out there for 3 days doing deep dive BPM stuff, do you guys have any questions you have for/about AgilePoint? I’ll get you the cold hard facts and answers. Promise.

Screenshot of an AgilePoint dashboard.