<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.digineer.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Greg Manrodt's Blog</title><link>http://blogs.digineer.com/blogs/gregm/default.aspx</link><description>Development, customization, administration and thoughts on Microsoft Office SharePoint Server 2007 (MOSS), Windows SharePoint Services v3 (WSSv3), SharePoint Portal Server 2003, BizTalk, and anything else that comes to mind.</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Unexpected Error</title><link>http://blogs.digineer.com/blogs/gregm/archive/2008/03/13/unexpected-error.aspx</link><pubDate>Thu, 13 Mar 2008 18:56:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:1033</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/1033.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=1033</wfw:commentRss><description>&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Perhaps this was obvious to all but me, but I thought I would post it anyway. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;I am sure all SharePointers out there have seen, and perhaps been plagued by the above error. Well, there is now hope. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Go to the web.config file for your particular SharePoint Web Application, and open it in your favorite editor. At the top, set (forgive the XPath) &lt;A href="mailto:'/configuration/SharePoint/SafeMode/@CallStack'"&gt;'/configuration/SharePoint/SafeMode/@CallStack'&lt;/A&gt;&amp;nbsp;to "true". Then set &lt;A href="mailto:'/configuration/system.web/customErrors/@mode'"&gt;'/configuration/system.web/customErrors/@mode'&lt;/A&gt; to "Off". Finally, set &lt;A href="mailto:'/configuration/system.web/compilation/@debug'"&gt;'/configuration/system.web/compilation/@debug'&lt;/A&gt; to "true". Suddenly, your "Unexpected Error" becomes a "traditional" ASP.NET error that you can actually debug. Now why did I think of this before??&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Big kudos to Jimmie Thompson from Microsoft Consulting Services for pointing this out.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=1033" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category></item><item><title>Uncustomized vs. Customized (Ghosted vs. Unghosted)</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/08/31/uncustomized-vs-customized-ghosted-vs-unghosted.aspx</link><pubDate>Fri, 31 Aug 2007 19:26:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:915</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/915.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=915</wfw:commentRss><description>&lt;P&gt;In SharePoint Portal Server 2003 (and WSS 2.0) it was a simple task to discover the ghosted status of pages in your SharePoint environment. Simply run "select * from docs where content is not null and leafname like '*.aspx' and listid is null". And to reghost them, all you have to do is set the content to null again. &lt;/P&gt;
&lt;P&gt;In Microsoft Office SharePoint Server 2007 (and WSS 3.0), things have become substantially more complicated. In order to alleviate the performance impact of customizing (unghosting) pages, and to alleviate the design burden of modifying SharePoint's look and feel, Microsoft uses Master Pages and Page Layouts to handle the design of a single page in SharePoint. Unfortunately, this means that the content field is almost never null for a page in the database. So how do you figure out if a page is customized?&lt;/P&gt;
&lt;P&gt;There are three ways, I will start with the worst way, and work my way up:&lt;/P&gt;
&lt;P&gt;1. The SPFile object has a property called CustomizedPageStatus, which maps to an enumeration. The values of the enumeration are Customized, Uncustomized and None. (I really wonder what "None" means in this context. It seems to me customized and uncustomized are mutually exclusive, as well as comprehensive.) In the case of a Publishing Page object, i.e. an ASPX page in a "Pages" library with the publishing feature activated, this enumeration &lt;EM&gt;always &lt;/EM&gt;== Customized. I check it like this: &lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicBlueChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#0000ff&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1in;"&gt;&lt;EM&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicBlueChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;foreach&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#000000&gt; (&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;SPListItem&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#000000&gt; item &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicBlueChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;in&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt; List.Items)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1in;"&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleStyleNormalWebArial10ptItalicFirstline05 style="MARGIN:0in 0in 0pt 1in;"&gt;&lt;EM&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicBlueChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;if&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#000000&gt; (&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;PublishingPage&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;.IsPublishingPage(item))&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1.5in;"&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleStyleNormalWebArial10ptItalicLeft1 style="MARGIN:0in 0in 0pt 2in;"&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;NumberOfPages++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1.5in;TEXT-INDENT:0.5in;"&gt;&lt;EM&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;PublishingPage&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt; pPage = &lt;/FONT&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;PublishingPage&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.GetPublishingPage(item);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 2in;"&gt;&lt;EM&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicBlueChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;if&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleNormalWebArial10ptItalicChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#000000&gt; (pPage.ListItem.File.CustomizedPageStatus == &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;SPCustomizedPageStatus&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;.Customized)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 2in;"&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 2in;TEXT-INDENT:0.5in;"&gt;&lt;EM&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Times New Roman';"&gt;&lt;FONT color=#008080&gt;Console&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Courier New';mso-no-proof:yes;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE:8pt;"&gt;WriteLine&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE:8pt;mso-bidi-font-family:'Courier New';mso-no-proof:yes;"&gt;&lt;FONT color=#000000&gt;(pPage.Url + &lt;/FONT&gt;&lt;SPAN style="COLOR:maroon;"&gt;" is customized."&lt;/SPAN&gt;&lt;FONT color=#000000&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1.5in;TEXT-INDENT:0.5in;"&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="mso-bidi-font-family:'Times New Roman';mso-bidi-font-size:8.0pt;"&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1in;TEXT-INDENT:0.5in;"&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="mso-bidi-font-family:'Times New Roman';mso-bidi-font-size:8.0pt;"&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=StyleNormalWebArial10ptItalic style="MARGIN:0in 0in 0pt 1in;"&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;&lt;SPAN class=StyleStyleStyleNormalWebArial10ptItalicFirstlineChar&gt;&lt;SPAN style="mso-bidi-font-family:'Times New Roman';mso-bidi-font-size:8.0pt;"&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;2. The second way is to use PublishingPage.IsDisconnected. This method works much better than the first I mentioned, except in one (admittedly extreme) circumstance. This circumstance is when you have a publishing page object which does not have &lt;EM&gt;any&lt;/EM&gt; assigned page layout. (Even customized (unghosted) pages have a page layout to fall back on.) The only time I have seen this circumstance is when migrating a SharePoint Portal Server 2003 portal, with a custom site definition for areas, and having a "Page Template Upgrade Definition" file fail. The upgrade will still work (no errors, no warnings), but the pages created have no page layout and are "broken".&lt;/P&gt;
&lt;P&gt;3. The last method, by far the most reliable it to use SharePoint designer. SharePoint Designer seems to infallibly detect the customization status for any page. The trouble here of course, is that SharePoint Designer can not be put into&amp;nbsp;a script like the first two methods, there fore limiting optimization.&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=915" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSS/default.aspx">WSS</category></item><item><title>Reasons to Migrate</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/06/28/reasons-to-migrate.aspx</link><pubDate>Thu, 28 Jun 2007 18:36:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:874</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/874.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=874</wfw:commentRss><description>&lt;P&gt;Many organizations have some kind of SharePoint deployment, whether it is a full intranet using SharePoint Portal Server 2003 or a collection of disconnected Windows SharePoint Services sites to manage department or project documentation. The idea of upgrading these sites to the newest version of SharePoint can seem a daunting task, especially if you remember/experienced a similar migration path from SharePoint 2001 to your current implementation. Though the effort is not trivial, it is well worth it, for the features and improvements in the new version.&lt;/P&gt;
&lt;P&gt;Here are some of the key benefits gained from the previous version, broken down by SharePoint version.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SharePoint Portal Server to Microsoft Office SharePoint Server&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Web Content Management&lt;/U&gt; - SharePoint now offers WCM capabilities, like browser-based page editing, reusable content, site collection image libraries and content scheduling. SharePoint also has cross-server&amp;nbsp;deployment capabilities, to ensure that deployments are scheduled and controlled.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Business Data Catalog&lt;/U&gt; - The Business Data Catalog provides the SharePoint&amp;nbsp;instance to&amp;nbsp;use line of business data&amp;nbsp;(from SQL, Oracle, SAP, Siebel, et cetera) in lists, web parts, and search.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Excel Services&lt;/U&gt; - Excel Services allows viewing Excel Spreadsheets on the web (no Excel need be installed on the client). Excel services will also perform scheduled&amp;nbsp;recalculations of the spreadsheet. The web parts available to view the Excel sheet are also very powerful (no more Office Web Components!!&amp;nbsp; Woohoo!), giving organization the ability to quickly create dashboards of their critical business data.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Forms Server&lt;/U&gt; - Forms Server allows for the storing, managing and viewing of InfoPath forms via the SharePoint server. InfoPath forms can now be published as web forms, by passing the need for the InfoPath client to be installed.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Search&lt;/U&gt; - The search in SharePoint hass been completely redone. The search that comes with MOSS is a fully-capable, customizable enterprise search. For search alone, I believe many organization would consider the upgrade.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Windows SharePoint Services v2 to v3&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Workflow&lt;/U&gt; - Workflow in SharePoint fully leverages the .NET Framework 3.0. However, there are still two options here. Workflows in SharePoint can be designed in Visual Studio 2005 and deployed as a feature (assembly), but they can also be designed by business (non-technical) users in SharePoint Designer. The SharePoint Designer interface is wizard driven, intuitive and surprisingly powerful. &lt;/P&gt;
&lt;P&gt;&lt;U&gt;Event Handlers&lt;/U&gt; - Synchronous and Asynchronous Event Handlers (for all list types, not just libraries). See &lt;A class="" href="http://blogs.digineer.com/blogs/gregs_blog/archive/2007/06/27/sharepoint-event-handlers-part-1.aspx"&gt;here.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Content Types and Site Columns&lt;/U&gt;&amp;nbsp;- Content types and site columns allow companies to define metadata at a higher level than the list or document library. This means that you could define a content type called "project plan" and another called "design specification." Both columns could reuse existing site columns, such as "project type" and "business line"&amp;nbsp;but could also define their own fields, specific to those content types. Then SharePoint sites across the organization could leverage that content type on multiple libraries. Content types also define the document template to be used for that content type, minimizing the deployment of new document templates.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Search&lt;/U&gt; - Even the search in WSS has improved. WSS is no longer leveraging SQL Server Full Text search, and instead is using a newly developed indexing engine, which is much more robust.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;Solutions and Features&lt;/U&gt; - Solutions and features make up a new deployment model for enabling new capabiliteis in SharePoint. Not only does the provide a more succinct mechanism for deploying capabilities, but audit of thos capabililties as well.&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=874" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category></item><item><title>SharePoint Event Handlers, Part 2</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/06/27/sharepoint-event-handlers-part-2.aspx</link><pubDate>Wed, 27 Jun 2007 18:45:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:873</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/873.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=873</wfw:commentRss><description>&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;In my previous post, I described the current state of event handlers in MOSS and WSS v3. Also, I listed the available event that can be handled by developers' custom code. In this post, I would like to vent, just a bit, on some of the&amp;nbsp;challenges that I have faced implementing event handlers on a custom list.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;My first challenge is concerning deployment. This&amp;nbsp;is rather easily solved, by implementing a &lt;A title="free tool" href="http://www.codeplex.com/SPSCustomAdmin/"&gt;free tool&lt;/A&gt;&amp;nbsp;to manage the connection between your event handler assembly and event(s) which it will handle. Deploying this bugger is a bit tedious, but at least it is well documented. For more, check &lt;A href="http://blogs.msdn.com/brianwilson/default.aspx"&gt;Brian Wilson's&lt;/A&gt; &lt;A title=posts href="http://blogs.msdn.com/brianwilson/archive/2007/03/05/part-1-event-handlers-everything-you-need-to-know-about-microsoft-office-sharepoint-portal-server-moss-event-handlers.aspx"&gt;posts&lt;/A&gt;. He does a good job of explaining how to write your first event handler.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Now, on to the meat of this post: my second challenge. (Let me apologize now if this is esoteric. I can't help myself.) I would like to talk about the SPItemEventDataCollection object. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;In my particular case, I am using a synchronous event handler, so that I can abort the updates to the list item if they do not meet the business rules. I want to check each field in the list, determine which fields have values that have changed, compare them against the business rules and take some action.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;When you override one of the event handling methods in the SPItemEventReceiver class, you are passed an SPItemEventProperties object. This object contains tons of useful information, such as the list item which fired the event (which in turn can get you to the list, the web or the site collection objects.) This object also has two very interesting members, AfterProperties and BeforeProperties, which&amp;nbsp;are of the type SPItemEventDataCollection. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Your immediate inclination at this point might be to loop through the BeforeProperties collection and compare its values to the corersponding values in the AfterProperties collection, but you would be misguided. The BeforeProperties.count == SPListItem.Fields.Count, however the values for every field in BeforeProperties == null. I also tried the AfterProperties.ChangedProperties collection with similar results. Everything is null. After some research, I discovered that this class is only used in event tied to document libraries. Bummer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;All is not lost, however, since you can access the SPListItem object trough the SPItemEventProperties object. Now, I can just compare them, right? Almost. The values stored in the AfterPropereties collection are all stored as strings, compared to the SPListItem, which stores some its fields as SPField objects. Comparing their values is far from straightforward. I'll give you a couple of examples.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Single-valued Person lookup fields are stored as just their ID, where ID is a string representation of their integer User ID (ID field in the userinfo and userdata tables). Multi-valued Person lookup fields store the user information as&amp;nbsp; ID;#domain\username;#ID;#domaing\username... (One other thing to note here: If you enter the user's email addres into a Person lookup field, the corresponding AfterProperties value will be null. Entering their name or user id works fine.)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;DateTime fields are stored as GMT in AfterProperties, but as local time in SPListItem, so don't try to just DateTime.Parse((string)properties.AfterProperties["MyDateField"]), unless of course you live in Greenwich, England. Otherwise your values will be off (in my case they were off by 7 hours, since I am CST and have Daylight Savings).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;All this being said, I am sure that it added less than 10% more code to my 600 line event handler. But they are things to watch out for, especially if you expecting the AfterProperties to store your list item changes as their respective SharePoint types (SPFieldDateTime, SPFieldUrl, et cetera).&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=873" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSS/default.aspx">WSS</category></item><item><title>SharePoint Event Handlers, Part 1</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/06/27/sharepoint-event-handlers-part-1.aspx</link><pubDate>Wed, 27 Jun 2007 18:21:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:872</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/872.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=872</wfw:commentRss><description>&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Let me begin by saying some nice things about SharePoint event handlers. &amp;lt;Aside&amp;gt;I am talking here of course about MOSS and WSS v3&amp;lt;/Aside&amp;gt; Microsoft has really opened the doors on SharePoint, allowing developers unprecedented granularity in handling SharePoint events. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Event handlers in SharePoint come in two flavors: synchronous and asynchronous. The synchronous events occur during processing of the event, allowing the developer to cancel the event if necessary. Asynchronous event handlers are like the ones from&amp;nbsp;SPS 2003 and WSS v2. The handlers will be called some time after the event has fired, but may or may not occur before the event completes its processing. For example, the ItemUpdated event on list items may finish updating the item in question &lt;EM&gt;&lt;SPAN style="FONT-FAMILY:Arial;"&gt;before&lt;/SPAN&gt;&lt;/EM&gt; the event handler attached to it fires. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;This approach gives developers a lot of flexibility for how they want to implement their event handlers. In WSS v3, you can now bind events to lists, sites or content types. Here are the events (note that synchronous events end with -ing, asynchronous with -ed):&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Lists&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;FieldAdded &lt;BR&gt;FieldAdding &lt;BR&gt;FieldDeleted &lt;BR&gt;FieldDeleting &lt;BR&gt;FieldUpdated &lt;BR&gt;FieldUpdating &lt;BR&gt;EmailReceived &lt;BR&gt;ItemAdded &lt;BR&gt;ItemAdding &lt;BR&gt;ItemAttachmentAdded &lt;BR&gt;ItemAttachmentAdding &lt;BR&gt;ItemAttachmentDeleted &lt;BR&gt;ItemAttachmentDeleting &lt;BR&gt;ItemCheckedIn &lt;BR&gt;ItemCheckedOut &lt;BR&gt;ItemCheckingIn &lt;BR&gt;ItemCheckingOut &lt;BR&gt;ItemDeleted &lt;BR&gt;ItemDeleting &lt;BR&gt;ItemFileMoved &lt;BR&gt;ItemFileMoving &lt;BR&gt;ItemFileConverted &lt;BR&gt;ItemUncheckedOut &lt;BR&gt;ItemUncheckingOut &lt;BR&gt;ItemUpdated &lt;BR&gt;ItemUpdating&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Sites&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;SiteDeleted &lt;BR&gt;SiteDeleting &lt;BR&gt;WebDeleted &lt;BR&gt;WebDeleting &lt;BR&gt;WebMoved &lt;BR&gt;WebMoving &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Content Types&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;FieldAdded &lt;BR&gt;FieldAdding &lt;BR&gt;FieldDeleted &lt;BR&gt;FieldDeleting &lt;BR&gt;FieldUpdated &lt;BR&gt;FieldUpdating &lt;BR&gt;EmailReceived &lt;BR&gt;ItemAdded &lt;BR&gt;ItemAdding &lt;BR&gt;ItemAttachmentAdded &lt;BR&gt;ItemAttachmentAdding &lt;BR&gt;ItemAttachmentDeleted &lt;BR&gt;ItemAttachmentDeleting &lt;BR&gt;ItemCheckedIn &lt;BR&gt;ItemCheckedOut &lt;BR&gt;ItemCheckingIn &lt;BR&gt;ItemCheckingOut &lt;BR&gt;ItemDeleted &lt;BR&gt;ItemDeleting &lt;BR&gt;ItemFileMoved &lt;BR&gt;ItemFileMoving &lt;BR&gt;ItemFileConverted &lt;BR&gt;ItemUncheckedOut &lt;BR&gt;ItemUncheckingOut &lt;BR&gt;ItemUpdated &lt;BR&gt;ItemUpdating&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;In my next post, I will go into some nitty gritty details on my experience dealing with these event handlers. It has not all been pretty. Stay tuned.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=872" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category></item><item><title>SharePoint 2007 and Office 2000/XP/2003</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/05/18/sharepoint-2007-and-office-2000-xp-2003.aspx</link><pubDate>Fri, 18 May 2007 20:13:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:843</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/843.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=843</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Are you running an older version of Office and wondering how your organization will fare with Windows SharePoint Services v3 or Microsoft Office SharePoint Server 2007? There are a lot of features that come with Microsoft Office 2007, but what is "business critical" vs. "nice to have" when it comes to the "ribbon" or the SharePoint metadata bar at the top of your Word 2007 documents? &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;And what about basic functionality, like open document from a document library, saving them back to SharePoint and check-in/check-out?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Thankfully, Microsoft has written a &lt;A title=whitepaper href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E0D05A69-F67B-4D37-961E-2DB3C4065CB9&amp;amp;displaylang=en" target=_blank&gt;whitepaper&lt;/A&gt;&amp;nbsp;which describes the features and functionality in each Office platform to help set your expectations (or more importantly, your management's expectations).&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=843" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MS+Office/default.aspx">MS Office</category></item><item><title>Extending STSADM</title><link>http://blogs.digineer.com/blogs/gregm/archive/2007/05/18/extending-stsadm.aspx</link><pubDate>Fri, 18 May 2007 13:31:00 GMT</pubDate><guid isPermaLink="false">bca6acaf-c141-4620-b5b4-ced221f55cdc:842</guid><dc:creator>gmanrodt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.digineer.com/blogs/gregm/comments/842.aspx</comments><wfw:commentRss>http://blogs.digineer.com/blogs/gregm/commentrss.aspx?PostID=842</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;In MOSS and WSS v3, it is now possible to extend the functionality of stsadm (pronounced s-t-s-admin). For those who may not know, stsadm.exe is located (in a typical installation) at c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin. Stsadm is the primary tool for administrative access to your SharePoint instance, and can be used for scripting mass updates as well. They are many things that can be done from stsadm that cannot be done from anywhere else.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;There are of course many benefits to extending stsadm, as its OOB functionality is not exhaustive. One major advantage of extending stsadm is that security privileges are not an issue. Since you have to have administrative privileges to run stsadm in the first place, the whole object model is available to you when writing your own custom operations. This means that you could write operations to gather reporting data against your installation (number of sites, users docs, list items, et cetera) to swapping out versions of a Web Part across an entire installation. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;The steps for extending stsadm, run as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Create a Class Library project in Visual Studio 2005. &lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Have your class inherit from ISPStsadmCommand, which is found in the Microsoft.SharePoint.Publishing namespace.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Implement the two methods from this interface, which are GetHelpMessage and Run. &lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Write your custom logic in the run method.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Sign your assembly, so that it is strongly named.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Deploy your assembly to the GAC on your SharePoint server(s).&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;Create an XML file called stsadmcommands.custom.xml, or something similar. The important thing is that the name you give it is &lt;STRONG&gt;not&lt;/STRONG&gt; already taken by another file in the CONFIG folder of your SharePoint server. The name stsadmcommands.custom.xml works well. Also, it is not necessary to have a new stsadmcommands.*.xml file for each assembly that you create; a single file can reference all of your custom operations across multiple assemblies.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN:0in 0in 0pt;"&gt;&lt;FONT face=Arial size=2&gt;The content of the XML file should look something like this:&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;FONT color=#0000ff size=2&gt;&amp;lt;?&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;xml&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;version&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;1.0&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;encoding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;utf-8&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; ?&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;commands&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;command &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;operation1&lt;/FONT&gt;&lt;FONT size=2&gt;" &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;class&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;namespace.class1,assemblyname,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=fe06441db3bdd371&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;/&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;command &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;operation2&lt;/FONT&gt;&lt;FONT size=2&gt;" &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;class&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;namespace.class2,assemblyname,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=fe06441db3bdd371&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;/&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;command &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;operation3&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;class&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;namespace.class3,assemblyname,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=fe06441db3bdd371&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;/&amp;gt;&lt;BR&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;commands&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Now, deploy this XML file to (again, in a typical installation) c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\config. When you run stsadm.exe (no parameters) it lists all of the available operations. Your new operations (in this case operation1, operation2, and operation3) should appear in the list. Running "stsadm -help operation1" will call the GetHelpMessage method in the namespace.class1 class.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.digineer.com/aggbug.aspx?PostID=842" width="1" height="1"&gt;</description><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.digineer.com/blogs/gregm/archive/tags/WSSv3/default.aspx">WSSv3</category></item></channel></rss>