Latest Posts
LAS VEGAS, Oct. 19 /PRNewswire/ -- (at the Microsoft(®) SharePoint(®)
Conference); BlueThread Technologies(®), Inc. (BlueThread) announced
StoragePoint(®) for SharePoint 2010. Attendees at the conference can preview a
demonstration of the 2010 version at the BlueThread booth. StoragePoint
enables organizations to realize at least a 95% reduction in the size of their
SharePoint content databases by relocating content BLOBs (Binary Large
Objects) out of the SQL database onto virtually any Cloud-based or on-premise
storage platform. It improves SharePoint manageability, scalability,
performance and security without any sacrifice to functionality or user
experience.
"We wanted to provide our clients with unprecedented SharePoint 2010 BLOB
storage flexibility," says Rob D'Oria, BlueThread's CTO and co-Founder. "With
StoragePoint 2010, you will be able to create policy-based storage profiles
which manage content BLOBs at a very granular level. It also leverages both
SharePoint 2010 EBS and RBS provider interfaces. Clients can choose to use
them independently, side-by- side or leverage our out-of-the-box the EBS to
RBS migration capability."
D'Oria continues, "Organizations don't have to wait for 2010 in order to
realize the benefits of StoragePoint. WSS 3.0 and MOSS 2007 customers can
install StoragePoint within their existing SharePoint deployment while taking
comfort that a no-hassle upgrade to 2010 is already in place."
Mark Wiley, Chesapeake Energy's IT Supervisor for Document Management &
Collaboration said; "Our current StoragePoint deployment reduced our content
databases from 450 gigabytes to less than 20, a reduction of over 95%. Not
only did it dramatically improve SharePoint manageability, it surprisingly
increased performance as well. As an early adopter of Microsoft technologies,
we are looking forward to SharePoint 2010 and leveraging StoragePoint."
"BlueThread is a great partner and StoragePoint is a perfect complement to our
SharePoint 2010 ECM solution," said Ron Cameron; President and CEO of
Knowledgelake, a BlueThread partner. "StoragePoint enables our customers who
are scanning millions, or even ten-of-millions of documents with our software
to manage them simply and easily within SharePoint."
Customers can download a 30 day, no-cost trial version at StoragePoint's
website: www.storagepoint.com
About BlueThread Technologies, Inc.
A Microsoft Gold ISV, BlueThread Technologies(®), Inc. (www.bluethreadinc.com)
is an Ann Arbor, Michigan-based company that specializes in Enterprise Content
Management (ECM) and system performance solutions exclusively for the
Microsoft(®) SharePoint(®) platform. With decades of ECM and years of
SharePoint experience, we develop highly-scalable solutions and tools which
are deployed at some of the largest organizations around the globe
Jeff Teper announced SharePoint Conference 09 award winners during his keynote address. BlueThread Technologies, Inc. was awarded the Innovative SharePoint ISV Award for StoragePoint. You can find more information about BlueThread Technologies and StoragePoint at
http://www.storagepoint.com and
http://www.bluethreadinc.com .
While troubleshooting a Records Center Routing Rule Event Receiver issue recently, I ran into a problem whereby ULS was apparently erroring when trying to log errors to the Application event log on the server. (So this error ended up masking the “real”\underlying error). The error ULS was throwing was “The Records Center refused the submission. There was an error routing the file: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.” Turns out, this issue arises when you configure SharePoint to run in a “least privileged” type scenario whereby the service account and/or IIS app pool account isn’t a member of the local Administrators group.
The resolution, the steps of which I’ve added to my standard SharePoint Installation Guide, is below:
The following steps should be performed on each SharePoint front end web server: 1. Open RegEdit and navigate to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog key. 2. Grant each SharePoint Application Pool Identity Full Control of the EventLog node and the Security child node. 3. Exit RegEdit and perform an IISRESET /NOFORCE . |
I was troubleshooting another issue on a client's production server and ran across the following errors in the event log (Application Log). The error was occurring on a KnowledgeLake Viewer web service. After some quick searching I found Namwar Rizvi's post on how to fix the problem. It appears that SharePoint output caching is trying to access the web service that is called by a web part which is causing the error to occur.
Event Type: Error
Event Source: Office SharePoint Server
Event Category: Publishing Cache
Event ID: 5785
Date: 9/2/2009
Time: 9:29:56 AM
User: N/A
Computer: <WebFrontEnd>
Description:
Unable to connect publishing custom string handler for output caching. IIS Instance Id is '50319175', Url is 'http://xxxx.com/_layouts/klviewer/WebResource.axd?d='.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Ugh! I am stuck in Windows Registry hell. Here is the situation. I have a Windows Server 2008 R2 Standard Edition install running SQL Server 2008 SP1 and Visual Studio.NET 2008 SP1. It seems that with this configuration I get the following error in SQL Server Management Studio (SSMS).
Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.VisualStudio.OLE.Interop.IServiceProvider'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{6D5140C1-7436-11CE-8034-00AA006009FA}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). (Microsoft.VisualStudio.OLE.Interop)
After doing some searching it appears that this is a result of Windows registry corruption that can be solved by re-registering the actxprxy.dll (you need to open the command line running as administrator and run 'regsvr32 actxprxy.dll'). There are serveral blog posts that document this solution (below are a few links). Unfortunately for me this did not fix my problem and I haven't been able to find a fix making SSMS unusable. The irony of this situation is that I have a laptop with the exact same problem and it is running Windows 7 RC1 with SQL Server 2005 and Visual Studio.NET 2008 so the common demoninator appears to be VS.NET 2008. I an anxious to see if others are having this problem if the above workaround was successful for them or not.
http://www.thisispaulsmith.co.uk/BLOG/post/SQL-Server-Management-Studio-Error-Unable-to-cast-COM-objecthellip3b.aspx
http://support.microsoft.com/kb/922214
http://blog.newslacker.net/2008/02/sql-server-2005-unable-to-cast-com.html
There are a zillion and one posts and how-tos out there amongst the Interwebs detailing the supposed “correct” way to use STSADMIN to copy or promote SharePoint Content Databases between different environments (i.e. Dev<->Stage<->Prod). The problem with the typical STSADMIN approach is that it forces you to create a new Web Application within the target environment. Well what if you’re dealing with a pre-existing target environment with complex IIS Bindings and or Alternate Access Mappings, etc (i.e. things that make you not want to hassle with having to re-set them all up.) So in these circumstances, the easiest thing to do is just to grab the content database from the source environment and copy/bind it to the target environment. The instructions to follow outline the steps needed in order to successfully perform such a promotion:
Pre-Move
SharePoint won’t automatically update all the links in your site to match the target environment’s host address, especially if you’ve added your own links to places within the site structure. So, to make sure links work once the site has been moved, you need to go through any links you’ve created and make sure they are relative URLs and not fully-qualified. It’s also a good idea to navigate to the internal site list for the Site Directory entries (http://<your host>/SiteDirectory/SitesList/AllItems.aspx) and modify them to be relative.
Performing the Copy/Promotion
First - Copying Content Databases Between Environments
Same Database Name:
If the target database has the same name as the source database
- Backup the source database (full backup).
- Copy the backup to the target database server.
- Stop the target IIS Website on all target front-end-web servers.
- Perform a full restore to the target database using the backup.
- Start the target IIS Website on all target front-end-web servers.
Different Database Names:
If the target database has a different name than the source database
- Stop IIS on each of the target front-end-web servers.
- On the target database server:
a. Note the name of the applicable content database.
b. Document the security applied to the applicable content database
(Specifically, what logins have what access to the database).
c. Document any backup/maintenance plans for the applicable content database.
d. Detach the applicable content database.
e. Backup the corresponding database data (.MDF) and log (.LDF) files to another location. - Stop IIS on Website on all source front-end-web servers.
- Stop the source content database on the source database server.
a. Copy the corresponding .MDF and .LDF files to the target database server
(usually C:\SQL\MSSQL10.MSSQLSERVER\MSSQL\DATA\) .
i. Rename the copied database files to match the names of the files in 2.e.
b. Re-Start the applicable source database on the source server. - Re-Start IIS on the source server.
- On the target database server:
a. Open the Attach Database dialog:
i. Select the renamed MDF file from 4.a.i.
ii. In the upper “Databases to attach:” area, change the “Attach As” value to match 2.a.
iii. In the lower “’<database name>’ database details” area, change the “Current File Path” values for both rows to match the paths and filenames in 4.a.i
b. Modify the security of the newly attached database to match 2.b.
c. Re-Apply any backup/maintenance plans from 2.c. - Do not yet start IIS on each of the target web front end servers as we’ll do that later.
Second – Reconfiguring the Content for its New Home
At this point, were you to try to load the restored site, you’d most likely receive a “400 BAD REQUEST” error when browsing “/” and a “File Not Found.” error when browsing the default “/Pages/Default.aspx” path. This is because SharePoint has gotten a little confused about what has just been done to it. To resolve the confusion, we need to essentially force SharePoint to reconfigure the newly promoted content database. The easiest non-STSADMIN way to do this is to use Central Administration web UI to remove the content database and re-add it:
- Navigate to the Central Administration Website for the target SharePoint instance.
- Within the Application Management tab, find the SharePoint Web Application Management section and open the Content Databases link.
- Change the Web Application to match the applicable application we’ve just updated.
- Click the Content Database name item to open its property page:
a. Document the following settings for use later:
-- Database server
-- SQL Server database name
-- Number of sites before a warning event is generated
-- Maximum number of sites that can be created in this database
-- Windows SharePoint Services search server
b. Place a check mark in the Remove content database box
(and click OK in the resulting prompt)
c. Click the OK button to perform the removal of the content database.
(The database itself will not be deleted, it is just no longer associated with this site) - You should now be back at the Content Databases Application Management screen.
- Verify the Web Application is still the applicable application .
(change it if necessary) - Click the Add a content database menu item to open the Ad Content Database page:
a. Verify the selected Web Application is correct.
b. Using the information documented in 4.a. fill in the properties for each to match exactly.
c. Click the OK button to add the existing content database.
(SharePoint will now update the promoted Content Database to work with its new home) - Start IIS on each of the target web front end servers.
- Test the target site.
(Sometimes the first load will result in an error. It should work if you refresh the page)
I have recently switched my laptop over to Windows Server 2008 from Windows 7 to take advantage of hyper-v. I wasn't happy with Virtual PC 2007 for Windows 7 and VMWare is too expensive when I have access to Windows Server 2008. Overall the experience is very good as Windows Server 2008 runs very quickly on my Lenovo t61 (I am not running the Desktop Experience feature as this sucks too many system resources). Since I am running this machine as my core workstation I am running Office 2007. I ran into a scenario where I wanted to enable Outlook Instant Search. Here is a link to a good blog post that walks you through the process of enabling Outlook Instant Search on Windows Server 2008.
http://exchangepedia.com/blog/2009/04/using-outlooks-instant-search-feature.html
This is mostly for my own reference, but I'm sure others on the Interwebs might find this useful as well.
If, per chance, you find yourself pasting a large amount of code into Visual Studio that, for whatever reason, has line numbers included in the copied data, one can easily remove the line number's using Visual Studio's Find & Replace with the "Use Regular Expressions" option...
The trick, obviously is the RegEx, which is: ^ *:d+\:
Make sure the Match case and Match whole word options are disabled and that the Replace with text box is empty, and you're good to go!
I have ran into this issue several times in the past where a SharePoint server’s event log is filling up with event id’s 6398, 6482, and 7076. These errors typically popup in your event viewer for administrative timer jobs. According to Microsoft there is an issue with multithreaded applications accessing IIS at the same time. Microsoft does have a hot fix to address the issue. The knowledgebase article is located here http://support.microsoft.com/default.aspx?scid=kb;EN-US;946517
When attempting to install applications on Windows Server 2008, even though the user account is part of the administrator group, you will receive an error stating as follows:
"Administrator privileges are required to install a web application"
This is due to the fact that being part of the Local Administrator Group doesn't provide the same access as the Local Administrator Account (the same also applies to Windows Vista). With Windows Server 2K8, the administrator access token is split into 2 tokens when logged into the server. One of these is an administrator token and the other a standard user token. During the logon process, authorization and access control components that identify an administrator are removed, leaving a standard user token. The standard user token is used to start the desktop and, therefore, all applications that start, will be run as a standard administrator. As a result of this, the workaround is to disable the UAC (User Account Control) so that the logged in user will have the administrator token. It's interesting to note that the error that you receive isn't a UAC pop-up message, but just a general error message.
Disabling UAC
- Click Start, and then Control Panel
- Click on User Accounts
- Click on Turn User Accounts on or off
- Uncheck the User User Account Control (UAC) to help protect your computer checkbox and click OK
- Click on Restart Now
*Note, it is not recommended to leave UAC turned off due to the exposure of increased risk of malicious software attacks.
For further information regarding UAC and configuring it on Windows Server 2K8, please see Microsoft's TechNet article: http://technet.microsoft.com/en-us/library/cc709691.aspx
This pertains to Windows Vista and Windows 7 only. If you are running Windows XP then stop reading.
If you are running Vista or Windows 7 and you are attempting use the “Upload Multiple Documents” feature of MOSS 2007 or WSS 3.0 to upload zip files you have probably noticed that zip files do not show in the upload explorer window. The “Upload Multiple Documents” feature is an ActiveX control that installs with Office 2003/2007 so if you aren’t running either Office versions then the option won’t show up in SharePoint. The problem with zip files and the ActiveX control has to do with how Vista deals with zip and CAB files. By default Vista is configured to show zip and CAB files as folders allowing the user to drill into their contents within Windows Explorer. For this reason they do not show up in the ActiveX control that handles multiple file uploads for SharePoint. To fix this problem you need to delete the following registry keys. WARNING! Backup your registry before making any changes!
HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11D1-A9F0-00AA0060FA31}
HKEY_CLASSES_ROOT\CLSID\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
Now deleting the above registry keys is a bit more involved than running RegEdit, finding the keys, and deleting them. Both keys above are protected keys and are own by the SYSTEM account. In order to delete the keys you need to change ownership of the keys, delete sub keys first, and then delete the root key. To do this you need to download the PSExec utility from Microsoft that is part of the Sysinternals tools. The download is located here http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx . Once you have downloaded the tools and extracted the PSExec utility from the zip file, you need to then start a windows command prompt as the local machine administrator (if you are not logged in as the administrator then run the following from the RUN dialog: runas :user/localhost\administrator CMD ). Once the command window launches navigate to the directory where you unpacked the contents of the zip file that you downloaded earlier and execute the following command: psexec -i -d -s c:\windows\regedit.exe. At this point you are now running RegEdit as the SYSTEM account and will be able to change ownership of registry keys. It is important to note that you have to delete child keys before deleting the root key.

Recently, a colleague of mine was working on a SharePoint event handler to automatically apply security to an item on insert into a list. In performing my own research on the topic, I came to realize there wasn’t a lot of concise or really usable information out there on the Interwebs about programmatically modifying the security and roles for a list item. An additional constraint was that the list of users and groups to be added were contained in SharePoint “Users or Groups” column in another list.
After a lot of research and some time spent stubbing out a test harness, I came upon the solution and created a helper method with overloads that allows you to programmatically add security to a list item with a number of different options for how the user or group is passed in, including support for passing in a list of SPRoleDefinition items to grant to the security item:
- SPFieldUserValue - Useful if you're iterating through the values of a SharePoint User or Group column
- String – Useful for passing in an ActiveDirectory group or user account name (If the user or group don’t already have access to the site itself, they will be automatically added)
- SPPrincipal – Useful if you have an SPPrincipal, SPGroup, or SPUser object (since the latter two inherit from SPPrincipal).
#region addPermissionToListItem Overloads
/// <summary>
/// Applies role-based security to a user or group for a particular list item.
/// This overload is useful if you're iterating through the values of a SharePoint User or Group column.
/// </summary>
/// <param name="SharePointWeb">The SharePoint Web the List belongs to.</param>
/// <param name="ListItemToAddTo">The particular List Item to apply the security to.</param>
/// <param name="UserOrGroupToAdd">The SPFieldUserValue type from a SharePoint User or Group column.</param>
/// <param name="RolesToGrant">SPRoleDefinition items to apply to the user or group being added.</param>
private void addPermissionToListItem(SPWeb SharePointWeb, SPListItem ListItemToAddTo, SPFieldUserValue UserOrGroupToAdd, params SPRoleDefinition[] RolesToGrant)
{
if (SharePointWeb != null && ListItemToAddTo != null && UserOrGroupToAdd != null && RolesToGrant != null && RolesToGrant.Length > 0)
{
// Get SPPrincipal from the UserOrGroupToAdd parameter
SPPrincipal newItemToAdd;
if (UserOrGroupToAdd.User != null)
{
// We have a user
newItemToAdd = UserOrGroupToAdd.User as SPPrincipal;
}
else
{
// We have a group
newItemToAdd = SharePointWeb.SiteGroups.GetByID(UserOrGroupToAdd.LookupId) as SPPrincipal;
}
// Call the overload that accepts an SPPrincipal object to add to the list
addPermissionToListItem(ListItemToAddTo, newItemToAdd, RolesToGrant);
}
}
/// <summary>
/// Applies role-based security to a user or group for a particular list item.
/// This overload is useful if you only have the windows login id of a user or a group name.
/// If the user or group doesn't belong to the site, they will be automatically added.
/// </summary>
/// <param name="SharePointWeb">The SharePoint Web the List belongs to.</param>
/// <param name="ListItemToAddTo">The particular List Item to apply the security to.</param>
/// <param name="WindowsUserIdOrGroupToAdd">The SPFieldUserValue type from a SharePoint User or Group column.</param>
/// <param name="RolesToGrant">SPRoleDefinition items to apply to the user or group being added.</param>
private void addPermissionToListItem(SPWeb SharePointWeb, SPListItem ListItemToAddTo, string WindowsUserIdOrGroupToAdd, params SPRoleDefinition[] RolesToGrant)
{
if (SharePointWeb != null && ListItemToAddTo != null && WindowsUserIdOrGroupToAdd != null && RolesToGrant != null && RolesToGrant.Length > 0)
{
// Get SPPrincipal from the UserOrGroupToAdd parameter
SPPrincipal newItemToAdd;
if (Microsoft.SharePoint.Utilities.SPUtility.IsLoginValid(SharePointWeb.Site, WindowsUserIdOrGroupToAdd))
{
// We have a user
newItemToAdd = SharePointWeb.EnsureUser(WindowsUserIdOrGroupToAdd) as SPPrincipal;
}
else
{
// We have a group
SPGroup groupToAdd = SharePointWeb.SiteGroups[WindowsUserIdOrGroupToAdd];
if (groupToAdd != null)
{
// The group exists, so get it
newItemToAdd = groupToAdd as SPPrincipal;
}
else
{
// The group didn't exist so we need to create it:
// Create it:
SharePointWeb.SiteGroups.Add(WindowsUserIdOrGroupToAdd, SharePointWeb.Site.Owner, SharePointWeb.Site.Owner, string.Empty);
// Get it:
newItemToAdd = SharePointWeb.SiteGroups[WindowsUserIdOrGroupToAdd] as SPPrincipal;
}
}
// Call the overload that accepts an SPPrincipal object to add to the list
addPermissionToListItem(ListItemToAddTo, newItemToAdd, RolesToGrant);
}
}
/// <summary>
/// Applies role-based security to a user or group for a particular list item.
/// </summary>
/// <param name="ListItemToAddTo">The particular List Item to apply the security to.</param>
/// <param name="UserOrGroupToAdd">The SPFieldUserValue type from a SharePoint User or Group column.</param>
/// <param name="RolesToGrant">SPRoleDefinition items to apply to the user or group being added.</param>
/// <remarks>This overload is called by the other overloads to actually set the the security.</remarks>
private void addPermissionToListItem(SPListItem ListItemToAddTo, SPPrincipal UserOrGroupToAdd, params SPRoleDefinition[] RolesToGrant)
{
if (ListItemToAddTo != null && UserOrGroupToAdd != null && RolesToGrant != null && RolesToGrant.Length > 0)
{
// Create a new role assignment for the principal
SPRoleAssignment newRoleAssignmentToAdd = new SPRoleAssignment(UserOrGroupToAdd);
// Bind the role definitionss to the new role assignment
foreach (SPRoleDefinition roleDefinition in RolesToGrant)
{
if (roleDefinition != null)
{
newRoleAssignmentToAdd.RoleDefinitionBindings.Add(roleDefinition);
}
}
// Add the new role assignment to the list item
ListItemToAddTo.RoleAssignments.Add(newRoleAssignmentToAdd);
}
}
#endregion
I wrapped the overloads (titled addPermissionToListItem) in a winform test harness that linked below. The test harness will pull groups and users from a SharePoint “Users and Groups” column in a separate list, and use those items to replace any existing permissions on a specified list item (breaking inheritance along the way).
Test Harness Screenshot:
Test Harness and referenced code:
Applicable Code KeyWords: RoleDefinitionBindings, SPFieldUserValue, SPFieldUserValueCollection, SPGroup, SPPrincipal, SPRoleDefinition, SPUser
I’ll review the basic steps on creating a SharePoint custom event handler.
You begin by opening up Microsoft Visual Studio 2005 and create a new class project. Reference the Microsoft.SharePoint assembly and then rename the default.cs class to the name that you want to give to your event handler. Also, remember to add your using statement for Microsoft.SharePoint.
Depending on which type of event handler you are wanting to write, will determine the proper SharePoint class to derive from. A breakdown of the available SharePoint classes to derive from are as follows:
· List Items – SPItemEventReceiver
· List Columns – SPListEventReceiver
· Site – SPWebEventReceiver
· Email – SPEmailEventReciever
At this point, you need to make a decision on whether you want to use Asynchronous or Synchronous events in your event handler. In order to determine which one you want, first decide if you want the event to fire before or after the event.
Asynchronous calls occur after the event, and do not block any code being executed in SharePoint. On the flipside, synchronous calls occur before the event, will block code being executed in SharePoint until your custom event handler is completed.
For a list of the available methods for each class, refer to Microsoft’s site:
SPItemEventReceiver Methods
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spitemeventreceiver_methods.aspx
SPListEventReceiver Methods
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisteventreceiver_methods.aspx
SPWebEventReceiver Methods
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spwebeventreceiver_methods.aspx
SPEmailEventReceiver Methods
Once you make your decision on what type of event receiver and also what type of method call you will be using, write out the override method . I will discuss further on manipulating particular methods.
Creating a Strong Name Key
After completing your method, you will need to sign the assembly. You can do this by going into solution explorer and right clicking your project and selecting properties. Then, click the Signing tab, then select Sign the Assembly, then select Choose a strong name key file and click “<New…>”. Type a name into the Key file name box (usually the name of your project). It needs to be in the format of xxxxxx.snk. You can set a password if you want, and click OK.
Creating Event Receiver to be installed as a Feature
Right click on your event handler project and select Add / New Folder. Name the folder as the same name as the project or similar. Add to blank XML files under the folder. Name the XML files as elements.xml and the other feature.xml.
In the feature.xml file, it should follow the following format:
<FeatureScope="Web"
Title="My Event Handler"
Description ="Description goes here."
Id="F141E5EA-796E-4807-AB86-43F5DC560371"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifestLocation="elements.xml"/>
</ElementManifests>
</Feature>
<Elementsxmlns="http://schemas.microsoft.com/sharepoint/">
<ReceiversListTemplateId="101">
<Receiver>
<Name>MyEventHandler</Name>
<Type>ItemAdded</Type>
<SequenceNumber>10000</SequenceNumber>
<Assembly>MyEventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1cd942f82aed8c82</Assembly>
<Class>MyEventHandler.EventHandler</Class>
<Data></Data>
<Filter></Filter>
</Receiver>
</Receivers>
</Elements>
The <Type> node refers to the method that will be raised when the action takes place. For multiple methods, you will need multiple <Receiver> nodes. <SequenceNumber>node refers to the order of execution.
Add a text file to the root of the project and rename it to cab.ddf and input the following:
;** MyEventHandler.wsp **
.OPTION EXPLICIT
.Set CabinetNameTemplate= MyEventHandler.wsp
.Set DiskDirectoryTemplate=CDROM
.Set CompressionType=MSZIP
.Set UniqueFiles="ON"
.Set Cabinet=on
.Set DiskDirectory1=Package
;**************************************************
manifest.xml manifest.xml
MyEventHandler\elements.xml MyEventHandler \elements.xml
MyEventHandler \feature.xml MyEventHandler \feature.xml
bin\debug\ MyEventHandler.dll MyEventHandler.dll
Then add another text file and rename that one to installer.bat. The following should be inputted:
makecab /f cab.ddf
Add a new xml file to the root of the project and rename it to manifest.xml and input the following:
<?xmlversion="1.0"encoding="utf-8" ?>
<Solutionxmlns="http://schemas.microsoft.com/sharepoint/"SolutionId="BF2A762B-A158-456c-BCA5-38120E87D982">
<FeatureManifests>
<FeatureManifestLocation="MyEventHandler\feature.xml"/>
</FeatureManifests>
<Assemblies>
<AssemblyDeploymentTarget="GlobalAssemblyCache" Location="MyEventHandler.dll">
</Assembly>
</Assemblies>
</Solution>
Save all your work and build your project.
For post-configuration testing scenarios, it’s often needed to “reset” the SmartDesk databases to a pre-work-received state. (I.e. users, tabs, views, modules, content have all been configured, but no work has yet come into the system).
For this reason I have created a SmartDesk 4.x Database Cleanup Script that will return a SmartDesk installation to the state described above.
Available for download here: http://www.k2.com/en/displaycontent.aspx?id=1027
My section, excerpted:

.
In the course of engagements, a customer often brings up the "need" to be able to make an already-in-process item switch maps and run against a new map that was published after the item in question already started. I place quotes around "need" because this isn't really a need. It's more of an ill-conceived want based on fear and mis-understanding.
What needs to be understood is why the customer feels they “need” this capability. In general, 99% of customer concerns that could lead to them feeling they have this “need” can be wrapped up into the items below:
· Some data element may change in such a way that it affects processing within a process.
o For example, an approval process involving a system-made decision around some dollar value such that if that value is greater (>) than $5 then the process follows one branch but if it’s less than or equal (<=) to $5, then the process goes another way.
§ What if the business wants to make the decision based on $10 as opposed to the original $5?
o In this scenario, a properly designed process where the decision points are configurable on-the-fly satisfies the need without having to modify the process and push out a new version.
§ Configurable data elements are out-of-the-box functionality of K2 blackpearl, called StringTable entries.
· The process changes in a dramatic way.
o Generally speaking this just doesn’t happen. A properly designed process designed and developed through proper Software Development Lifecycle phases with rounds of detailed user acceptance testing will result in a valid and acceptable process by the business. In the extremely rare off-hand chance that a business’s process changes in such a dramatic way as to be incompatible with the previous process, then the validity of the original process as approved by the business should still be considered valid and applicable for items currently in the system and running against that process. If this isn’t the case, then one would have to seriously reconsider the validity of the completed items that had already finished the previous process…If a process changes so much that items currently running against the previous process are invalid, then the items already completed have to also be considered suspect.
o However, if it is absolutely imperative that currently running process instances against the previous process must go against the new process, then there are two ways to facilitate this:
§ Design the process in such a way that there is a step in the process that would route asynchronously into a new process instance of the same process type (the newly started process as a result will run against the most recently-published process map).
ØThere is out-of-the-box functionality in blackpearl to allow an admin to select currently running instances and direct them to this special ‘re-start’ step in the process.
ØUsing the blackpearl API, a simple web page could also be developed to allow selected business users to also perform this action.
§ Delete the process instance and the associated collateral, and re-start a new process instance.
I ran into this issue several times in the past in setting up SharePoint environments (for both internal development use and customers) so I figured it was time to write a blog post about it. If you are running SharePoint Server 2007 or WSS 3.0 on Windows Server 2003 SP1 or later you will run into authentication issues if you are trying to access a SharePoint site using host headers from the server itself (i.e. host file has portal.mydomain.com pointed to 127.0.0.1). This issue manifests itself as the result of a loop back security check that Microsoft built in to Windows Server 2003 SP1 and later. The purpose of the loopback check is to eliminate denial of service attacks however it causes issues with access SharePoint sites locally from the server. In a typical production environment this is typically not a problem since you rarely access SharePoint sites (besides central admin) from a front end web server itself. However I do have physical and virtual development environments where all activities take place from the server, so this can cause some heartburn unless you have worked through the issue before. You can read the detailed KB article at http://support.microsoft.com/kb/926642 & http://support.microsoft.com/kb/896861. Here is a rundown of how to fix the problem. I typically disable the loopback check however this is not recommended for production server environments.
Method 1: Disable the authentication loopback check
Re-enable the behavior that exists in Windows Server 2003 by setting the DisableLoopbackCheck registry entry in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa registry subkey to 1. To set the DisableLoopbackCheck registry entry to 1, follow these steps on the client computer:
1. Click Start, click Run, type regedit, and then click OK.
2. Locate and then click the following registry subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
3. Right-click Lsa, point to New, and then click DWORD Value.
4. Type DisableLoopbackCheck, and then press ENTER.
5. Right-click DisableLoopbackCheck, and then click Modify.
6. In the Value data box, type 1, and then click OK.
7. Exit Registry Editor.
8. Restart the computer.
Note You must restart the server for this change to take effect. By default, loopback check functionality is turned on in Windows Server 2003 SP1, and the DisableLoopbackCheck registry entry is set to 0 (zero). The security is reduced when you disable the authentication loopback check, and you open the Windows Server 2003 server for man-in-the-middle (MITM) attacks on NTLM.
Method 2: Create the Local Security Authority host names that can be referenced in an NTLM authentication request
To do this, follow these steps for all the nodes on the client computer:
1. Click Start, click Run, type regedit, and then click OK.
2. Locate and then click the following registry subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
3. Right-click MSV1_0, point to New, and then click Multi-String Value.
4. In the Name column, type BackConnectionHostNames, and then press ENTER.
5. Right-click BackConnectionHostNames, and then click Modify.
6. In the Value data box, type the CNAME or the DNS alias, that is used for the local shares on the computer, and then click OK.
Note Type each host name on a separate line.
Note If the BackConnectionHostNames registry entry exists as a REG_DWORD type, you have to delete the BackConnectionHostNames registry entry.
7. Exit Registry Editor, and then restart the computer.
If you are using the SharePoint object model to query a SharePoint list you will find out that SPQuery doesn't retrun items in the subfolders. In order to execute a search query against a list and return results regardless of subfolder location you need to add "Scope='RecursiveAll'" attribute to the SPQuery object's ViewAttributes property. Since the ViewAttributes property is a string you need to make sure that this attribute doesn't already exist. If it exists you must remove it and then add it back to the ViewAttributes property.
SPListItemCollection
foreach
(SPListItem item in itemCollection){
//do something
}SPQuery query = new SPQuery();
query.ViewAttributes += " Scope='RecursiveAll'";
itemCollection = list.GetItems(query);
It is generally accepted that searching for content in MOSS or WSS 3.0 requires the content to first be crawled by the SharePoint Search Service. However in traditional Enterprise Content Management (ECM) scenarios this typically doesn't make a lot of sense. If evaluate how most organizations manage content for the purposes of managing that content, you will quickly see why crawling content doesn't make a whole lot of sense. A typical ECM related business process involves the capture (data stream or scanning of content), categorization, processing, and archival of content. In many cases significant time, money, and effort is expended in these business processes. So if you spent significant resources to capture and categorize content then why would you rely on a search technology that is better suited for unstructured, full text queries to retrieve your content? In most (and I say "most" because there are exceptions to this rule) ECM scenarios users are not conducting broadly scoped searches for content. User's search critieria is very targeted and specific. For example an accounting user might want to search for an invoice for a specific vendor based on vendor id and/or invoice number. A slightly broader search might be executed where the same accounting user is looking for all invoices from a specific vendor for the 2008 calendar year. In either case the search is targeting. Attenmpting to crawl this content doesn't result in a favorable outcomes. For starters crawling content in SharePoint doesn't occur immediately after content is added and incremental crawls can take long periods of time to execute depending on how much content was added since the last incremental crawl was executed. In many EMC scenarios users are required to immediately validate the content once it's archived to SharePoint but requiring the content to first be crawled doesn't support this process due to the latency by which items are made available for searching.
The performance challenges with crawling large volumes of content in SharePoint are well documented. If you are not familiar with SharePoint limitations I would recommend reviewing Microsoft's TechNet article title Plan for Software Boundaries (Office SharePoint Server) located here http://technet.microsoft.com/en-us/library/cc262787.aspx. If you have ECM scenarios where users are conducting targeted searches in SharePoint, I would suggest evaluating existing search utilities that leverage CAML (Collaborative Application Markup Language) or developing your own. In large volumen scenarios it makes sense to exclude the content from the SharePoint crawl all together. I have personally experienced extremely unfavorable crawl performance as a result of larger content volumes in SharePoint even when the underlying SharePoint server infrastructure was optimal.