<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3997826521443705114</id><updated>2012-01-20T04:28:33.943-07:00</updated><category term='install'/><category term='Traversing list heirarchies'/><category term='Debugging code in MOSS - SharePoint 2007'/><category term='Patterns and Practices'/><category term='MOSS 2007 Service accounts'/><category term='vacation'/><category term='PnP'/><category term='VPC 2007'/><category term='VseWSS'/><category term='Sharepoint 2003 deleting orphans'/><category term='Comments'/><category term='SharePoint Conference 2011'/><category term='SharePoint Certification'/><category term='Microsoft VPC 2004 development'/><category term='Content deployment'/><category term='SSL on MOSS 2007'/><category term='Custom navigation provider'/><category term='Infopath'/><category term='SharePoint 2010'/><category term='IIS'/><category term='Presentations'/><category term='CMS to MOSS migration'/><category term='stsadm'/><category term='Administration'/><category term='About me'/><category term='SharePoint migration'/><category term='Upgrade'/><category term='MOSS 2007 navigation treeeview'/><category term='MOSS Migration option'/><category term='uploading site templates'/><category term='Web Part page template'/><category term='User Profiles'/><category term='DST and SP1'/><category term='MOSS Branding'/><category term='MOSS Document Importer'/><category term='Workflows'/><category term='SharePoint 2010 Install'/><category term='MOSS URL Rewriting'/><category term='Case Studies'/><category term='MOSS'/><category term='MOSS 2007 SSP access denied'/><category term='MOSS 2007 MySites'/><category term='Vista windows update'/><category term='Accessing document hits'/><category term='Change MOSS site URL'/><category term='MOSS Search'/><title type='text'>Faraz Khan's SharePoint blog</title><subtitle type='html'>Faraz's tips and tricks on SharePoint and other technologies.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5645048141869370841</id><published>2012-01-11T12:33:00.001-07:00</published><updated>2012-01-11T12:33:06.054-07:00</updated><title type='text'>Remember password with ISA Server</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here was a scenario I ran into recently. &amp;nbsp;A client had an ISA server 2006 deployment and used forms authentication against AD for logging in their customers. A long time request had been that users did not want to enter their username and password every time, they wanted the browser to remember their credentials.&lt;br /&gt;&lt;br /&gt;After talking the customer through the fact that this was not a good idea from a security standpoint and not succeeding in&amp;nbsp;dissuading&amp;nbsp;them, I started to look for the solution. We took a look at the ISA settings on the server, but couldn't find anything in this regard. I was chatting to a colleague about this who had been making modifications to the ISA server login page to customize the HTML the end user would see, and he pointed out that there is a form option on the login page that turns auto complete on or off. Here is the piece of HTML that causes this:&lt;br /&gt;&lt;br /&gt;&lt;span class="webkit-html-tag" style="font-family: monospace; text-align: -webkit-auto; white-space: pre-wrap;"&gt;form &lt;span class="webkit-html-attribute-name"&gt;autocomplete&lt;/span&gt;="&lt;span class="webkit-html-attribute-value"&gt;off&lt;/span&gt;" &lt;span class="webkit-html-attribute-name"&gt;id&lt;/span&gt;="&lt;span class="webkit-html-attribute-value"&gt;logonForm&lt;/span&gt;" &lt;span class="webkit-html-attribute-name"&gt;method&lt;/span&gt;="&lt;span class="webkit-html-attribute-value"&gt;post&lt;/span&gt;" &lt;span class="webkit-html-attribute-name"&gt;action&lt;/span&gt;="&lt;span class="webkit-html-attribute-value"&gt;/CookieAuth.dll?Logon&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family: monospace; text-align: -webkit-auto; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="webkit-html-tag" style="font-family: monospace; text-align: -webkit-auto; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="white-space: pre-wrap;"&gt;Setting autocomplete="on" then allows the browser to save the username and password credentials. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5645048141869370841?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5645048141869370841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5645048141869370841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5645048141869370841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5645048141869370841'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2012/01/remember-password-with-isa-server.html' title='Remember password with ISA Server'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5018180222766242337</id><published>2011-10-24T12:11:00.002-06:00</published><updated>2011-11-10T15:52:35.758-07:00</updated><title type='text'>A pattern for building custom forms in SharePoint 2010</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Recently, I have been working on a pretty large enterprise intranetproject on SharePoint 2010 that involves building a few modules that meet thebusiness needs. These modules each involve a few related content types. The waywe architected these was to have a main core content type for each module – andhave a few other content types have a lookup column back to that core contenttype. There were some one-one relationships as well as one-many relationshipsin the mix. Given that there were these related entities, there is no OOB wayto allow for a seamless experience for an end user to go through the entireprocess of creating the core entity and all related entities without needing toknow how they are stored in custom lists. There were also event receivers thatneeded to be created in these modules that would do sub-tasks, set permissionson items, send email etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;One of our key design goals from the onset was to make theuser experience as friendly as possible while at the same time accounting forany changes/additions to fields to the content types after the project wasdelivered. So we did not want to build fully custom forms, because those wouldbe tied strongly to the schema as we knew it during development and would needa UI change and deployment to add any new field to the custom pages&lt;/div&gt;&lt;div class="MsoNormal"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here is an example of content types in one specific(relatively simple) module:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WpIAP6wzw5U/TqWpr_X6TzI/AAAAAAAAAJc/0JeWvmK9f58/s1600/ContentTypes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://2.bp.blogspot.com/-WpIAP6wzw5U/TqWpr_X6TzI/AAAAAAAAAJc/0JeWvmK9f58/s320/ContentTypes.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The approach we took was making extensive use of list fielditerators in SP 2010. These are available in the SP API and are fairly easy touse once you get the hang of these. So these would allow us to point theListFieldIterator to a list in SharePoint and set its mode to New, Edit orDisplay. What this would do is open up the list item in one of those modes. Theiterator iterates through all the fields in that list and surfaces them to you,just like in an OOB SharePoint list form. If we needed to edit or display wewould also bind the list item ID to the iterator and set the correspondingmode. If the user did not have permissions to edit the list item, we would showthe iterator in the display mode. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here is how the new/edit form looked with the iterators.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;We used the Tab control in the AjaxControlToolkit to manage theUI using different iterators in the tabs. We also employed the modal frameworkquite extensively to manage sub types as shown below. Here is the management screen for audit tracking.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-e1ABhtSGATc/TrxSFcwWv9I/AAAAAAAAAJo/K_W_GNXrEmE/s1600/auditMain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://1.bp.blogspot.com/-e1ABhtSGATc/TrxSFcwWv9I/AAAAAAAAAJo/K_W_GNXrEmE/s320/auditMain.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;On clicking new audit tracking entry, the user would get this screen as show below. Notice the Tab control and how the result looks like an OOB list form. It is easy to bind the iterator to the list and the item and set its mode (New, Edit or Display). The buttons below are custom and thus the saving has to be done by you as well.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PFXRmiyByqs/TrxSO3lFksI/AAAAAAAAAJw/jzoUvSeufXg/s1600/auditDetail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/-PFXRmiyByqs/TrxSO3lFksI/AAAAAAAAAJw/jzoUvSeufXg/s320/auditDetail.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;You can click the new Audit Finding link to create a new sub type. Here is that screen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GqItXFVRdhY/TrxSxRMJpGI/AAAAAAAAAJ4/M7RfG-8pnnY/s1600/finding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://2.bp.blogspot.com/-GqItXFVRdhY/TrxSxRMJpGI/AAAAAAAAAJ4/M7RfG-8pnnY/s320/finding.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As you can see above, this really is a SharePoint modal dialog showing yet two more sub content types in their own lists and related to the main core Audit content type. The modal framework is really handy for doing these sort of things and improving the user experience vastly. Imagine if the user had to go to 5-6 different lists to create a new audit, to say that would not fly would be an understatement!&lt;br /&gt;&lt;br /&gt;Here is some code that highlights how to bind these. Here is the code to declare the iterator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="contentSection"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the code behind, this is how you bind it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SPList AuditTrackingList = SPContext.Current.Web.Lists[Constants.AUDIT_CORE_LIST_NAME];&lt;br /&gt;ListFieldIteratorAuditTracking.ListId = AuditTrackingList.ID;&lt;br /&gt;//Set the mode as well depending on whether you are opening an existing one to display or new one. lets go with new for here&lt;br /&gt;ListFieldIteratorAuditTracking.ControlMode =&amp;nbsp;SPControlMode.New;&lt;br /&gt;//Could also be&amp;nbsp;SPControlMode.Edit or&amp;nbsp;SPControlMode.Display&lt;br /&gt;&lt;br /&gt;Voila, your iterator binds to the list item and shows it just like SharePoint would.&lt;br /&gt;&lt;br /&gt;To update/save, in your Button_Save event (obviously this is oversimplified):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;protected void ButtonSave_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (this.Page.IsValid)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SPItem item = ListFieldIteratorAuditTracking.Item;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; item.Update();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;Enjoy!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5018180222766242337?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5018180222766242337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5018180222766242337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5018180222766242337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5018180222766242337'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/10/pattern-for-building-custom-forms-in.html' title='A pattern for building custom forms in SharePoint 2010'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-WpIAP6wzw5U/TqWpr_X6TzI/AAAAAAAAAJc/0JeWvmK9f58/s72-c/ContentTypes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5286858086922415661</id><published>2011-10-24T11:57:00.001-06:00</published><updated>2011-10-24T11:57:53.730-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comments'/><title type='text'>Blog Comments were not posting</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;My apologies, I just realized there were many blog comments that were awaiting moderation. For some reason, blogger did not email me about these so I could not reply. I will try to answer the ones that are still relevant, and I am going to take off moderation for now until I start getting spam on the comments.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5286858086922415661?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5286858086922415661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5286858086922415661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5286858086922415661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5286858086922415661'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/10/blog-comments-were-not-posting.html' title='Blog Comments were not posting'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1140671675880039851</id><published>2011-10-07T16:43:00.000-06:00</published><updated>2011-10-07T16:43:29.327-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Conference 2011'/><title type='text'>SharePoint Conference 2011 - Final Thoughts</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;So here I am, sitting at the airport going back to Denver. It’s been a whirlwind week here in Anaheim, CA. We had the RBA consulting private party last night which was attended by quite a few clients as well as Microsoft folks. Jared Spataro, who delivered the keynote at the conference and Matt Berg who ran the conference, was also in attendance which was pretty cool. I did chat for quite a while with Bill Baer from Microsoft, who owns the SharePoint Foundation product. We talked about Remote Blob Storage strategies (he had just presented earlier that evening on that topic), as well as where SharePoint is and where it is going. I also had the opportunity to talk with Ted Pattison, Andrew Connell and Todd Baginskiwho apart from being MVP’s have been involved with SharePoint for a while.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;So here are my personal thoughts about the writing on the wall at this year’s conference. The next wave of SharePoint is going to be a revolution, not an evolution in terms of how we do things and think about the development paradigm and practices. Code/customizations you do in the current release will continue to work in the next release, but they will not utilize the benefits of the new platform. So what technologies can you sharpen your skills on to get ready for the next release? The few areas in my mind are: &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;1.&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;SharePoint Online + Azure&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;There were some good sessions on SharePoint Online and its integration with Azure. With Azure, you can host your custom applications and databases up in the Microsoft cloud and access them that way. Another major advantage of the Azure model is that it has a service bus that can interact with data into your organization’s data center. This, coupled with the ability of SharePoint Online to talk to Azure provides you a model to get back into your data sitting back in your datacenter. This also leads into #2 below, because the way to connect with Azure is through client side object model (sandboxed code cannot call outside the site collection). &lt;b&gt;Another big announcement was that BCS will be supported in the public cloud soon.&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;2.&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;jQuery/Javascript and other client side technologies.&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;jQuery is a literally a set of Javascript libraries that allow you to do things way more efficiently than just using plain Javascript. jQuery also works across browsers seamlessly – so you write it once and it works as expected. There were a few sessions that talked about jQuery (with HTML5, best practices etc.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;3.&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;Social Aspects&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;There were a few sessions that talked about the social features of SP 2010. I didn’t have the opportunity to attend any of these but this is one area that Microsoft will continue to invest heavily in – so this will keep getting better and better.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&lt;b&gt;A note on HTML5 vs Silverlight&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;Ted Pattison covered a session on jQuery with HTML5. HTML5 looks pretty promising with its ability to build pretty cool UX elements – but in terms of the browser experience it still has quite ways to go. The HTML5 specifications are not fully developed yet, so you have to embed different tags for every browser. Plus, if you want to target older browsers then it’s even more effort required. So bottom line, this is coming but not ready for primetime for the browser experience.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sfFfz9ZytW4/To-Ai8mG47I/AAAAAAAAAJU/Or8xCGEHruY/s1600/spataro.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://3.bp.blogspot.com/-sfFfz9ZytW4/To-Ai8mG47I/AAAAAAAAAJU/Or8xCGEHruY/s320/spataro.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1140671675880039851?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1140671675880039851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1140671675880039851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1140671675880039851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1140671675880039851'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/10/sharepoint-conference-2011-final.html' title='SharePoint Conference 2011 - Final Thoughts'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sfFfz9ZytW4/To-Ai8mG47I/AAAAAAAAAJU/Or8xCGEHruY/s72-c/spataro.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1578616959075801374</id><published>2011-10-05T15:38:00.000-06:00</published><updated>2011-10-05T15:38:54.801-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Conference 2011'/><title type='text'>SharePoint Conference 2011 Day 2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="MsoNormal"&gt;Day 2 of the SharePoint conference was more of the same as day 1, except that it was jam packed with sessions all day. There were three notable sessions that I attended that I want to talk about.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The first session was our very own Phil Wicklund’s session on &lt;i&gt;SharePoint in the Cloud: Architecture. &lt;/i&gt;This session was very informative and talked about the different cloud architectures supported by Microsoft, from the SharePoint Online shared to SharePoint Online Dedicated (which is hosted by Microsoft), to a hybrid scenario where some of your SharePoint installation could be hosted on premise and some in the cloud. Phil made very interesting points about which scenario you would address your business needs. He also talked about the search experience and how to store your user profiles and tag clouds so they are aggregated and available. Great session to understand what feature set is supported in each scenario. Tomorrow Phil presents on managing identity in SharePoint online so that will be a great session as well.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Another session I attended was Ted Pattison’s &lt;i&gt;JQuery and HTML5. &lt;/i&gt;This session also contained good information about how to get started in jQuery and provided some examples of how effective it is. Ted had a demo built out of different things that can be done with it and showed some code samples for the same. The interesting part is that jQuery works on every browser just the same so you only have to code it once. Ted also talked about HTML5 and where this is heading vis-à-vis Silverlight. From the session I gathered that HTML5 is not ready for prime time yet, there is work required to make it work with the different latest browsers (due to lack of standards), but it is even more work to make it function in older browsers. So, Silverlight is still the way to go for a delightful user experience, but HTML is the far future in terms of browsers. Using HTML5 for building mobile apps across the different mobile platforms, that is another question altogether..&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Another session I attended was Todd Bleeker’s &lt;i&gt;Building a custom service application in SharePoint 2010. &lt;/i&gt;I have to admit it was one of the most animated technical presentations I have ever attended. He was very excited about what he was presenting, so much so that it was really hard to not get caught up in it. He did a great job explaining the details and the plumbing behind building service applications in SP 2010. It was a very technical session and I thoroughly enjoyed the content and the presentation of that content.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I would definitely recommend checking Todd out for understanding the service application model and building a custom service application.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Going to the SPC 2011 conference at Disneyland tonight (the happiest and most magical place on earth). More till later.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1578616959075801374?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1578616959075801374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1578616959075801374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1578616959075801374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1578616959075801374'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/10/sharepoint-conference-2011-day-2.html' title='SharePoint Conference 2011 Day 2'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5905940703216163622</id><published>2011-10-05T15:37:00.000-06:00</published><updated>2011-10-05T15:37:18.341-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Conference 2011'/><title type='text'>SharePoint Conference 2011</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;We are at the SharePoint Conference 2011 this week, also known as SPC 2011. It is hosted in Anaheim this year. It is a mid-release conference so we didn’t expect to hear many surprises at the keynote or at the sessions. The keynote was hosted by Jeff Spataro, who is the senior director of SharePoint Product management. Though an engaging speaker, the one thing that struck me about the keynote was that there were no surprises, no announcements etc. The most interesting part of the keynote was a demonstration of new failover capabilities of SharePoint 2010 and SQL Server “Denali”. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;After the keynote I attended a couple of sessions that day. One of them was titled &lt;i&gt;Documents are boring but document solutions are not&lt;/i&gt;. It was a pretty good session and the speaker showed off information panel within a word document with an Infopath form embedded in the document. He also showed how fields in the word document can be tied to columns on the document library, and Word will update these everytime it is opened. The interesting part is that these fields could also be bound to information from external sources via the BCS.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The speaker also showed content controls, quick parts, co-authoring of documents and how Word detects and informs users that another person is editing the document. Another good technique is to always render a field code with a link to a picture or chart stored in the library. This way the image/chart is not stored in the document but can be refreshed from the library at any time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The other engaging session I attended was Andrew Connell’s &lt;i&gt;Out of the sandbox and into the cloud: Build you next SharePoint app on Azure&lt;/i&gt;. It does seem like that is one of the directions Microsoft is not only investing heavily in but also starting to push to the developer community. It was a real engaging session and AC talked about the different ways of interfacing Azure data in SharePoint 2010. The session was very informative and engaging. Definitely recommend checking out his presentation over video if you have the time. Scott Key from Microsoft also presented on the next topic the very next day. The key takeaway is that you can store your custom applications and custom databases in Azure (it is easier and cheaper) and build hooks into SharePoint to consume/surface that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Todd Baginski also presented that evening about building SharePoint apps for the Windows phone. That was also a highly engaging session and Todd covered a lot of material and shared what he has been working on lately. If you are interested in that topic definitely recommend checking out his talk. He also laid out the process of interfacing with Twitter/Facebook/Linkedin etc fromyour custom apps.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;So all in all, it was a good first day. There were tons of parties/happy hours/ packed together so we were out till the wee hours of the morning. More on the conference soon.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5905940703216163622?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5905940703216163622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5905940703216163622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5905940703216163622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5905940703216163622'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/10/sharepoint-conference-2011.html' title='SharePoint Conference 2011'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3029692231371542029</id><published>2011-02-21T13:19:00.000-07:00</published><updated>2011-02-21T13:19:39.391-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>View Application Error on SharePoint page</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;When working with SharePoint 2010, when there is an error in the application you may come across the generic SharePoint error page that states to turn the customErrors tag to RemoteOnly or Off in the web.config. So you diligently locate the web.config file for the web app, and turn the customErrors to one of those settings based on your level of comfort.&lt;br /&gt;&lt;br /&gt;The generic page still does not go away, and you can't see the error. What gives? Well, it appears that there is another web.config file in the LAYOUTS directory that has the customErrors set to On. This is overriding the web application web.config setting. So setting this customErrors to Off or RemoteOnly will show you the real error so you can take action on it!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3029692231371542029?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3029692231371542029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3029692231371542029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3029692231371542029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3029692231371542029'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2011/02/view-application-error-on-sharepoint.html' title='View Application Error on SharePoint page'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-9050221702169855817</id><published>2010-08-19T20:52:00.002-06:00</published><updated>2010-08-19T20:56:58.638-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010 Install'/><title type='text'>After Installing SharePoint 2010 Farm, it says Web Server needs to be upgraded</title><content type='html'>I came across this a couple of times recently so I figured I would blog about it. I've been working quite a bit on SharePoint 2010 projects, and usually I am called upon to do farm installs. I recommend that clients always do least privileged installs, so that means advising them on the accounts they need to create for their (dev/test/uat/prod farms) and best practices regarding those. Here is the list of accounts recommended for use on technet for a least privileged install.&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;br /&gt;Account&lt;/th&gt;&lt;th&gt;&lt;br /&gt;Purpose&lt;/th&gt;&lt;th&gt;&lt;br /&gt;Requirements&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;SQL Server service account&lt;/td&gt;&lt;td&gt;&lt;br /&gt;The SQL Server service account is used to run SQL Server. It is the service account for the following SQL Server services:&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;MSSQLSERVER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;SQLSERVERAGENT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If you do not use the default SQL Server instance, in the Windows Services console, these services will be shown as the following:&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;MSSQL$InstanceName&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;SQLAgent$InstanceName&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;Use either a Local System account or a domain user account.&lt;br /&gt;If you plan to back up to or restore from an external resource, permissions to the external resource must be granted to the appropriate account. If you use a domain user account for the SQL Server service account, grant permissions to that domain user account. However, if you use the Network Service or the Local System account, grant permissions to the external resource to the machine account (domain_name\SQL_hostname$).&lt;br /&gt;The instance name is arbitrary and was created when Microsoft SQL Server was installed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;Setup user account&lt;/td&gt;&lt;td&gt;&lt;br /&gt;The Setup user account is used to run the following:&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Setup&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;SharePoint Products Configuration Wizard&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Domain user account.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Member of the Administrators group on each server on which Setup is run.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;SQL Server login on the computer that runs SQL Server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Member of the following SQL Server security roles:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;securityadmin&lt;/strong&gt; fixed server role&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;dbcreator&lt;/strong&gt; fixed server role&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;If you run Windows PowerShell cmdlets that affect a database, this account must be a member of the &lt;strong&gt;db_owner&lt;/strong&gt; fixed database role for the database.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;Server farm account or database access account&lt;/td&gt;&lt;td&gt;&lt;br /&gt;The server farm account is used to perform the following tasks:&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Configure and manage the server farm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Act as the application pool identity for the SharePoint Central Administration Web site.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Run the Microsoft SharePoint Foundation Workflow Timer Service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;Domain user account.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Additional permissions are automatically granted for the server farm account on Web servers and application servers that are joined to a server farm.&lt;br /&gt;The server farm account is automatically added as a SQL Server login on the computer that runs SQL Server. The account is added to the following SQL Server security roles:&lt;br /&gt;&lt;ul&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;dbcreator&lt;/strong&gt; fixed server role&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;securityadmin&lt;/strong&gt; fixed server role&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="unordered"&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;db_owner&lt;/strong&gt; fixed database role for all SharePoint databases in the server farm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Ok, makes sense. So you login to the app server with the setup account, and install SharePoint. Then you do the same on one or more Web Servers. Now go back to the app server and run the Configuration Wizard and set up the farm and Central Admin. After some configuration (setting up services, the first site collection), you come back to the Web Servers and attempt to add them to the farm. The whole process goes smoothly and the Web Server connects to the farm. Great, now you go to the Servers in Farm page in Central Admin, and to your dismay the Web Server line item shows an error and that it needs upgrading.&lt;br /&gt;&lt;br /&gt;What?? So you run the 'stsadm -o localupgradestatus' on the Web Server and it shows you as everything being ok. Hmm..&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resolution&lt;/b&gt;&lt;br /&gt;The way I found to get around this is to remove the Web Server from the farm, then log off the Web Server. Log back on using the Server farm account, not the setup account. Now run the Configuration Wizard and add the Web Server back to the farm. This works well and now when you go to the 'Servers in Farm' page, everything looks good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-9050221702169855817?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/9050221702169855817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=9050221702169855817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/9050221702169855817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/9050221702169855817'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2010/08/after-installing-sharepoint-2010-farm.html' title='After Installing SharePoint 2010 Farm, it says Web Server needs to be upgraded'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-191094030373456023</id><published>2010-07-01T14:15:00.000-06:00</published><updated>2010-07-01T14:15:17.139-06:00</updated><title type='text'>SharePoint Guidance V3 release on MSDN</title><content type='html'>The SharePoint Guidance V3 has been released on MSDN. Here is an overview:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #3f529c; font-family: 'Segoe UI', Verdana, Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 26px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-size: medium; font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;Developing Applications for SharePoint 2010 contains guidance documentation, detailed examples, and a reusable class library. These resources are designed to help solution developers and architects make the right decisions and follow proven practices when designing and developing applications for SharePoint 2010. The guidance focuses primarily on the building blocks that every developer needs to understand to become an effective SharePoint developer or architect. The following diagram shows the key areas that are covered within the guidance documentation, reference implementations, and reusable class library.&lt;/div&gt;&lt;div style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;&lt;/div&gt;The guidance documentation is divided into four core sections.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff798371.aspx" style="color: #1364c4; text-decoration: none;"&gt;Application Foundations for SharePoint 2010&lt;/a&gt;. This section describes approaches you can use to address the challenges of testability, flexibility, configuration, logging and exception handling, and maintainability; it also explains how to use the SharePoint Guidance Library components in these areas.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff798421.aspx" style="color: #1364c4; text-decoration: none;"&gt;Execution Models in SharePoint 2010&lt;/a&gt;. This section provides deep technical insights into the mechanics of the full-trust execution environment, the sandbox execution environment, and various hybrid approaches to executing code in SharePoint applications.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff798364.aspx" style="color: #1364c4; text-decoration: none;"&gt;Data Models in SharePoint 2010&lt;/a&gt;. This section explains new list and external data functionality, key design decision points that can help you to choose between standard SharePoint lists and external lists, and techniques and patterns to address large lists and list aggregation.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff798452.aspx" style="color: #1364c4; text-decoration: none;"&gt;Client Application Models in SharePoint 2010&lt;/a&gt;. This section provides guidance on how best to use the new client-side functionality to access data and build richer client experiences with Silverlight and Ajax.&lt;/li&gt;&lt;/ul&gt;Each section also contains a set of how-to topics. These explain how to perform specific tasks that the team found challenging to discover.&lt;br /&gt;&lt;br /&gt;Go take a look and learn from the Guidance. It is available &lt;a href="http://msdn.microsoft.com/en-us/library/ff770300.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-191094030373456023?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/191094030373456023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=191094030373456023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/191094030373456023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/191094030373456023'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2010/07/sharepoint-guidance-v3-release-on-msdn.html' title='SharePoint Guidance V3 release on MSDN'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-19645227871548058</id><published>2010-07-01T14:10:00.000-06:00</published><updated>2010-07-01T14:10:23.157-06:00</updated><title type='text'>Visual Studio 2010 cannot find SharePoint 2010 site</title><content type='html'>I realize I haven't blogged in a while, but hopefully I should be back on here blogging about all the stuff I am doing in SharePoint 2010. It's a great platform, and I have been working on it for a few months.&lt;br /&gt;&lt;br /&gt;So here is the scenario:&lt;br /&gt;You are using Windows 7 x64 bit and have installed SharePoint 2010 on it. You are building great solutions in VS 2010 for SharePoint 2010. You spin up a quick Console Application to try some stuff out against your local instance of SharePoint and your program throws up an error at this line, indicating that the site cannot be found.&lt;br /&gt;&lt;br /&gt;using (SPSite site = new SPSite([your local URL]))&lt;br /&gt;&lt;br /&gt;This happens because Visual Studio is configured to build for x86 by default. To get past this error, right click on the solution file in Visual Studio --&amp;gt; click on properties, on the top right click on Configuration manager and add a x64 configuration. Then go to project properties --&amp;gt; Build --&amp;gt; Select x64 as the target platform.&lt;br /&gt;&lt;br /&gt;Voila, that should all work now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-19645227871548058?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/19645227871548058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=19645227871548058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/19645227871548058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/19645227871548058'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2010/07/visual-studio-2010-cannot-find.html' title='Visual Studio 2010 cannot find SharePoint 2010 site'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3131878460504011754</id><published>2010-02-23T21:21:00.000-07:00</published><updated>2010-02-23T21:21:09.416-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>SharePoint 2010 Farm Databases</title><content type='html'>So I was just installing a new SharePoint 2010 Enterprise RC farm just recently and while I was waiting for the services page to finish creating the services, I took a quick peek at the DB server to figure what was going on in the backend. I have installed the SP 2010 beta version a couple of times before, but have to admit never looked in the database to see what was going on.&lt;br /&gt;&lt;br /&gt;It appears that all the services are not segregated in their own databases, instead of the SSP database managing the services as in the 2007 version. Here is a snapshot of the available databases. DBA's, be forewarned :).&lt;br /&gt;&lt;br /&gt;Here are the two screenshots. The first shows the Farm configuration wizard after the services have been configured. The second shows the databases that have been created.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/S4SoU6d-d9I/AAAAAAAAAGg/4QeD-48c1gE/s1600-h/sp2010services.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/S4SoU6d-d9I/AAAAAAAAAGg/4QeD-48c1gE/s640/sp2010services.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/S4So1QBc9nI/AAAAAAAAAGo/rPP-YZhjnwI/s1600-h/sp2010databases.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/S4So1QBc9nI/AAAAAAAAAGo/rPP-YZhjnwI/s640/sp2010databases.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3131878460504011754?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3131878460504011754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3131878460504011754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3131878460504011754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3131878460504011754'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2010/02/sharepoint-2010-farm-databases.html' title='SharePoint 2010 Farm Databases'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r8BZcH_g0j0/S4SoU6d-d9I/AAAAAAAAAGg/4QeD-48c1gE/s72-c/sp2010services.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5745220927242091531</id><published>2010-01-26T10:12:00.003-07:00</published><updated>2010-01-26T10:15:46.138-07:00</updated><title type='text'>Slashing Costs with SharePoint 2010</title><content type='html'>Just wanted to let you guys know that AIC is doing an event in Denver next week - called "Slashing Costs with SharePoint 2010 in the Real World".  Come attend to learn more about this very insightful presentation.&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Join Analysts International (AIC), SoftwareONE and AmeriTeach for a luncheon  with Anthony Lopez, Vice President, Information Technology at RE/MAX  International, Inc. Anthony will discuss how RE/MAX International partnered with  AIC to reduce their costs by 75% using Microsoft SharePoint.&lt;br /&gt;&lt;br /&gt;In conjunction with Anthony’s  presentation, there will be discussion of the features and functionalities of  SharePoint 2010 along with how these new features enable IT to continue to  deliver business solutions and reduce cost simultaneously. Additionally, the  team will highlight the various licensing options and will guide you through the  deployment and hosting options available. Lastly, we will discuss the options  available for assisting your upgrade or implementation of SharePoint through  training your team, as well as, how to leverage Software Assurance benefits to  do so effectively. &lt;br /&gt;&lt;br /&gt;Whether  you are currently running SharePoint or not, understand the power of SharePoint  2010 and engage with your peers who currently are experiencing the business  benefits that SharePoint has to offer, including;&lt;br /&gt;&lt;br /&gt;- Lower Administrative and Maintenance Costs&lt;br /&gt;- Platform Consolidation&lt;br /&gt;- Tool  Consolidation&lt;br /&gt;- Process Improvement&lt;br /&gt;- Collaboration Efficiencies&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Click &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=143932"&gt;here&lt;/a&gt; to sign up and attend. See you there!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5745220927242091531?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5745220927242091531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5745220927242091531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5745220927242091531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5745220927242091531'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2010/01/slashing-costs-with-sharepoint-2010.html' title='Slashing Costs with SharePoint 2010'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6427318383303298389</id><published>2009-10-01T12:27:00.003-06:00</published><updated>2009-10-01T12:33:21.439-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workflows'/><category scheme='http://www.blogger.com/atom/ns#' term='Infopath'/><title type='text'>Using InfoPath Task Forms in Visual Studio 2008 Workflows for SharePoint</title><content type='html'>I was recently creating a SharePoint workflow within Visual Studio 2008 and needed to use InfoPath forms as task forms instead of the default task forms that you get as default. Well, I found a great article explaining how to do this in great detail - which saved me quite a bit of time figuring this out myself. So for others looking to do the same, I would highly recommend this blog post by Fodi Dervidis &lt;a href="http://sharepointgear.wordpress.com/2009/03/22/simple-sharepoint-workflow-with-infopath-task-form/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6427318383303298389?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6427318383303298389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6427318383303298389' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6427318383303298389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6427318383303298389'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/10/using-infopath-task-forms-in-visual.html' title='Using InfoPath Task Forms in Visual Studio 2008 Workflows for SharePoint'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7196866954379471394</id><published>2009-10-01T12:04:00.003-06:00</published><updated>2009-10-01T12:07:56.854-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Certification'/><title type='text'>Passed the MOSS Configuration Exam 70-630</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); line-height: 20px; "&gt;I just passed the MOSS Configuration exam 70-630 yesterday. I had heard it was an easier exam than the 70-631 and I found out why. I didn't spend too much time studying for it and got a perfect score in most of the sections. Looking forward to SharePoint 2010 now.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7196866954379471394?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/7196866954379471394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=7196866954379471394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7196866954379471394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7196866954379471394'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/10/passed-moss-configuration-exam-70-630.html' title='Passed the MOSS Configuration Exam 70-630'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6547886450767179759</id><published>2009-09-17T14:03:00.002-06:00</published><updated>2009-09-17T14:11:04.651-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Administration'/><title type='text'>SharePoint Server Disable LoopbackCheck</title><content type='html'>This is a scenario I have come across a few times now, especially working on Windows Server 2008 boxes. It seems that this is a security fix that Microsoft introduced since Windows Server 2003 SP1. Basically what it fixes (breaks in SharePoint) is explained below.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. You create a Web application in SharePoint that uses a host header that you intend to make available to end users. Lets say http(s)://www.company.com.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. You can browse to this URL file from the other machines or over the Web.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. You remote into the server to make some changes - and you decide to open a browser and type http://www.company.com in the address. You usually get asked to login multiple times and after three tries it will usually show you a blank screen with a 401.1 access denied error. Note that this only happens when you are trying to access the website on the same server as you are logged into.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enter the DisableLoopBackCheck setting in the Registry. Spencer Harbar wrote up a great article about the same that I ran across as I was writing this post, so I will just pass you on to his splendid explanation and resolution of this problem &lt;a href="http://www.harbar.net/archive/2009/07/02/disableloopbackcheck-amp-sharepoint-what-every-admin-and-developer-should-know.aspx"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6547886450767179759?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6547886450767179759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6547886450767179759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6547886450767179759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6547886450767179759'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/09/sharepoint-server-disable-loopbackcheck.html' title='SharePoint Server Disable LoopbackCheck'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3510717524889738599</id><published>2009-09-15T09:57:00.003-06:00</published><updated>2009-09-15T09:59:52.938-06:00</updated><title type='text'>Setting the default Active Directory in SharePoint People Picker</title><content type='html'>If you need to specify a default Active Directory that a People Picker control should find users from - and not to use any other trusted domains in its search, here is a nifty stsadm command for the following.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p align="left"&gt;&lt;span style="font-family:LucidaGrande;font-size:85%;"&gt;"C:\Program Files\Common  Files\Microsoft Shared\Web Server Extensions\12\BIN\stsadm" -o  setsiteuseraccountdirectorypath -path "DC=www,DC=company,DC=com" -url  https://[your site url here]&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3510717524889738599?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3510717524889738599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3510717524889738599' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3510717524889738599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3510717524889738599'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/09/setting-default-active-directory-in.html' title='Setting the default Active Directory in SharePoint People Picker'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5112324695864352835</id><published>2009-09-15T09:38:00.003-06:00</published><updated>2009-09-15T09:55:43.982-06:00</updated><title type='text'>Exposing SharePoint List Data using Data View Web Part</title><content type='html'>Recently I had the need to create a new view when a user clicked on a list item. This view was formatted like a HTML page, and looked nothing like the default DispForm.aspx that SharePoint shows you by default. Well, I ended up implementing a nifty solution that my colleague at work had used before.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead of replacing or customizing DispForm.aspx for the list (which you need to be really careful about), I actually created a new WebPart page in a document library on that site. I cracked open SharePoint designer and threw a Data View/Form Web Part (or the Swiss Army knife as it is sometimes called) and added a URL Querystring parameter to provide me with the ID of the item I was showing. Then I customized the design of the page inside the XSL to show me the view that I wanted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The last part was to wire up the click event on the list to this new page. I browsed to DispForm.aspx and opened it up in edit mode. Some of you might wonder how is it possible to edit an administrative page? The answer lies in the querystring parameters you provide it in the URL. If you append a querystring &lt;span class="Apple-style-span" style="font-family: 'Segoe UI'; font-size: 13px; line-height: 17px; "&gt;?PageView=Shared&amp;amp;ToolPaneView=2 &lt;span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: normal; "&gt;to the page, then it will open it up in Edit view. From here on, I just hid the list view Web Part and added a content editor Web Part that contained some javascript to redirect to the page in my document library that had the Data View Web Part with the formatting I needed.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5112324695864352835?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5112324695864352835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5112324695864352835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5112324695864352835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5112324695864352835'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/09/exposing-sharepoint-list-data-using.html' title='Exposing SharePoint List Data using Data View Web Part'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8082929216708642313</id><published>2009-09-03T12:36:00.004-06:00</published><updated>2009-09-03T12:42:59.677-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Case Studies'/><title type='text'>Microsoft case study on RE/MAX Extranet</title><content type='html'>Please check out the recently released Microsoft case study on RE/MAX which is a project I was involved in from the beginning and worked on for a little less than a year. It was a great suceess and we used a lot of cool features in MOSS to build the extranet, meet the business needs and exceed expectations. &lt;a href="http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004961"&gt;Here&lt;/a&gt; is the case study.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8082929216708642313?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8082929216708642313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8082929216708642313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8082929216708642313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8082929216708642313'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/09/microsoft-case-study-on-remax-extranet.html' title='Microsoft case study on RE/MAX Extranet'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8363846888151887521</id><published>2009-09-03T12:26:00.002-06:00</published><updated>2009-09-03T12:36:46.466-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patterns and Practices'/><title type='text'>SharePoint Guidance v2 released</title><content type='html'>The second version of the SharePoint guidance was just released recently. Be sure to have a look and to incorporate the guidance and the architectural decisions that can help you in your SharePoint implementation projects. Here is the &lt;a href="http://msdn.microsoft.com/en-us/library/dd203468.aspx"&gt;MSDN&lt;/a&gt; site. Here is the project site on &lt;a href="http://www.codeplex.com/spg/"&gt;codeplex&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8363846888151887521?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8363846888151887521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8363846888151887521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8363846888151887521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8363846888151887521'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/09/sharepoint-guidance-v2-released.html' title='SharePoint Guidance v2 released'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1920591204382310329</id><published>2009-08-20T09:33:00.002-06:00</published><updated>2009-08-20T09:37:12.680-06:00</updated><title type='text'>Passed the Windows SharePoint Services Configuration 70-631 exam</title><content type='html'>So I just passed the Windows SharePoint Configuration exam 70-631 yesterday. There were a few tough questions about NLBs and ISA server, but overall I think it was a pretty easy exam, especially because the some of the multiple choices were way off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1920591204382310329?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1920591204382310329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1920591204382310329' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1920591204382310329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1920591204382310329'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/08/passed-windows-sharepoint-services.html' title='Passed the Windows SharePoint Services Configuration 70-631 exam'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-307874391893664389</id><published>2009-07-24T16:13:00.004-06:00</published><updated>2009-08-06T10:24:49.311-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>SharePoint User Group Presentation Slide Deck July 2009</title><content type='html'>I wanted to take the time to thank everyone who attended the User Group Presentation last week where we presented last week. Here is the slide deck as promised. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-307874391893664389?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/307874391893664389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=307874391893664389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/307874391893664389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/307874391893664389'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/07/sharepoint-user-group-presentation.html' title='SharePoint User Group Presentation Slide Deck July 2009'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8938634358252364409</id><published>2009-06-12T13:19:00.003-06:00</published><updated>2009-06-12T13:33:07.866-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VseWSS'/><title type='text'>Visual Studio Extensions: How to Change Base Type of Content Type</title><content type='html'>Recently I came across an interesting challenge. I needed to create some custom fields on my custom Page Layout for a client. I needed to add about 3 fields in addition to the fields in the existing page layouts (MetsKeywords, MetaDescription and a PageContent2 which were multi-line, multi-line and HTML fields respectively).&lt;br /&gt;&lt;br /&gt;I went ahead and tried to create a custom content type in the VSEWSS and it popped open the Base Type dialog box. I wanted the Article Page to be my base type, but I didn't find it in the dropdown. I figured it would be easy to change later and so I picked Item as my base. &lt;br /&gt;&lt;br /&gt;The first piece that was puzzling is that even though I picked a base as part of creating the content type, there was no reference to that base in the xml file. There is an attribute in the content type xml called BaseType which I figured I could set to the ctype ID of the actual base type I wanted (you can go to your SharePoint site, go to site settings, content types, and click on the content type you wish to inherit from - you will notice the ctype id in the URL. I copied and pasted it in the BaseType attribute and deployed and it still did not work.&lt;br /&gt;&lt;br /&gt;After some digging around, I realized that the BaseType does not define the parent type. The parent type ID has to be the first part of the ID of the current content type. What I do now is copy the parent ID into the ID of the content type - and add 0D after that to specify the association.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8938634358252364409?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8938634358252364409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8938634358252364409' title='109 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8938634358252364409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8938634358252364409'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/06/visual-studio-extensions-how-to-change.html' title='Visual Studio Extensions: How to Change Base Type of Content Type'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>109</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6221232942500177771</id><published>2009-05-08T10:14:00.005-06:00</published><updated>2009-05-13T13:39:55.423-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Upgrade'/><title type='text'>SharePoint SP2 is out</title><content type='html'>I don't know if any of you know this, but the SP2 for SharePoint was released on April 28.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following text is from the Microsoft blog post&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="color: rgb(51, 51, 51);   line-height: 15px; font-family:Verdana;font-size:12px;"&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;&lt;b&gt;Benefits&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Customers can be benefited from the following enhancements with Service Pack 2.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Performance and Availability Improvements&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Service Pack 2 includes many fixes and enhancements designed to improve performance, availability, and stability in your server farms, including:&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;New Timer job automatically rebuilds content database index to improve database performance.&lt;/li&gt;&lt;li&gt;When a content database is marked as read-only, the user interface will be modified so users cannot perform tasks that require writing to the database.&lt;/li&gt;&lt;li&gt;Performance enhancement across nearly all the components. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Improved Interoperability&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Service Pack 2 continues to improve SharePoint interoperability with other products and platforms.&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Broader support of browsers &lt;br /&gt;Internet Explorer 8 is added into Level 1 browser support. &lt;br /&gt;FireFox 3.0 is added into Level 2 browser support. (Firefox 2.0 is no longer supported by Mozilla)&lt;/li&gt;&lt;li&gt;Provide improved client integration user experience with Form Based Authentication. Now the client application can store user credentials instead of asking for them every time. For more technical details please refer to the updated articles on TechNet. &lt;br /&gt;Configure forms-based authentication (Office SharePoint Server &lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262201.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc262201.aspx" style="font-weight: bold; text-decoration: none; color: rgb(0, 107, 173); "&gt;http://technet.microsoft.com/en-us/library/cc262201.aspx&lt;/a&gt; &lt;br /&gt;Configure forms-based authentication (Windows SharePoint Services) &lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc288043.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc288043.aspx" style="font-weight: bold; text-decoration: none; color: rgb(0, 107, 173); "&gt;http://technet.microsoft.com/en-us/library/cc288043.aspx&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Getting Ready for SharePoint Server 2010&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;A new &lt;b&gt;preupgradecheck&lt;/b&gt; operation is added to stsadm tool. It can be used to scan your server farm to establish whether it is ready for upgrade to SharePoint Products and Technologies "14". It identifies issues that could present obstacles to the upgrade process. It checks for several SharePoint Products and Technologies "14" system requirements, including the presence of Microsoft® Windows Server® 2008 and a 64-bit hardware, and provides feedback and best practice recommendations for your current environment, together with information on how to resolve any issues that the tool discovers. &lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Along with all the improvements, the preupgrade check is going to be handy for analyzing the  upgrade path to Office 14. I actually went ahead and installed the Service Pack 2 on a SharePoint server which only had SP1 installed on there and no updates after that. The upgrade process went smoothly with no hiccups. The one thing to note is that SP2 is available as a separate download for both WSS and MOSS. The SharePoint Products and Technologies Configuration wizard will pop up as soon as you finish installing the WSS SP2. It will save time to exit out of that (if you have MOSS installed), then install the SP2 for MOSS and then run the wizard. This wizard modifies database schema, so it saves time to run it once for both. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SP2 can be installed on any build before before Fenruary 2009, which means that you could install it on a SharePoint server that has no service packs installed yet, just SP1, or the infrastructure update and builds after that but before February 2009.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This means that the newly released April "uber" package that Stefan talks about &lt;a href="http://blogs.technet.com/stefan_gossner/archive/2009/05/01/the-april-cumulative-update-for-wss-v3-and-moss-2007-has-been-released-yesterday.aspx"&gt;here&lt;/a&gt; is not included in SP2. The "uber" package will need to be installed after SP2.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just to be safe, please try installing SP2 on a test/stage environment before unleashing it on production to make sure it will work for you :).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Update:&lt;/span&gt; I installed the SP2 as mentioned above, but ran into an issue right after where I could not authenticate to SharePoint using IE7 or SP Designer. I tried getting all the latest updates but that did not help either. I tried authenticating with Firefox and it authenticated just fine. So in case any of you come across this authentication with IE issue, here is what I found after some looking around.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana;font-size:11px;"&gt;&lt;ol style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; list-style-type: none; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; margin-left: 3em; "&gt;&lt;li color="initial" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border- margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;Click &lt;strong class="uiterm"&gt;Start&lt;/strong&gt;, click &lt;strong class="uiterm"&gt;Run&lt;/strong&gt;, type &lt;span class="userInput"&gt;regedit&lt;/span&gt;, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;In Registry Editor, locate and then click the following registry key:&lt;div class="indent"&gt;&lt;strong class="uiterm"&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;Right-click &lt;strong class="uiterm"&gt;Lsa&lt;/strong&gt;, point to &lt;strong class="uiterm"&gt;New&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;DWORD Value&lt;/strong&gt;.&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;Type &lt;span class="userInput"&gt;DisableLoopbackCheck&lt;/span&gt;, and then press ENTER.&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;Right-click &lt;strong class="uiterm"&gt;DisableLoopbackCheck&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;Modify&lt;/strong&gt;.&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;In the &lt;strong class="uiterm"&gt;Value data&lt;/strong&gt; box, type &lt;span class="userInput"&gt;1&lt;/span&gt;, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; list-style-type: decimal; "&gt;Quit Registry Editor, and then restart your computer.&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tried this out and it worked wonderfully.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6221232942500177771?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6221232942500177771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6221232942500177771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6221232942500177771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6221232942500177771'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/05/moss-sp2-is-out.html' title='SharePoint SP2 is out'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6484325795148141834</id><published>2009-05-07T14:37:00.003-06:00</published><updated>2009-05-08T11:24:15.453-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User Profiles'/><title type='text'>Script to Create Profile Properties in SharePoint Profile Store</title><content type='html'>Recently I was working on a large enterprise project that made extensive use of the user profile store in SharePoint. To meet the business requirements we needed a lot of new properties to be created in the profile store. While that may initially look easy to just open up the profile section in the SSP and start creating properties by hand - you need to take into account different developer VPCs and the dev/test/stage/prod environments (and suddenly its not so easy). There was also a need to map these properties to either AD or the BDC connection. That is where the data was being pulled from.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here is a handy little script I wrote to create all the profile properties you need (its configurable via the application file) and also to map these properties to the appropriate connector (if you are pulling data from AD or BDC).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wrote this in a hurry and this is not production quality code, so take it as it is :).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using Microsoft.Office.Server;&lt;br /&gt;using Microsoft.Office.Server.Administration;&lt;br /&gt;using Microsoft.Office.Server.UserProfiles;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Specialized;&lt;br /&gt;using Microsoft.SharePoint.Portal;&lt;br /&gt;using Microsoft.SharePoint.Portal.Topology;&lt;br /&gt;using Microsoft.SharePoint.Administration;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace company.Mt.Utilities.ProfileProperties&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   static void Main(string[] args)&lt;br /&gt;   {&lt;br /&gt;       if (args.Length != 1)&lt;br /&gt;       {&lt;br /&gt;           Usage();&lt;br /&gt;           return;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       switch (args[0])&lt;br /&gt;       {&lt;br /&gt;           case "CreateProfileAttributes":&lt;br /&gt;               CreateProfileAttributes();&lt;br /&gt;               MapExistingAttributes();&lt;br /&gt;               break;&lt;br /&gt;&lt;br /&gt;           case "MapExistingAttributes":&lt;br /&gt;               //MapExistingAttributes();&lt;br /&gt;               break;&lt;br /&gt;&lt;br /&gt;           case "DeleteOtherAttributes":&lt;br /&gt;               DeleteOtherAttributes();&lt;br /&gt;               break;&lt;br /&gt;&lt;br /&gt;           //case "DeleteUserProfiles":&lt;br /&gt;             //  ProfileInstanceManagement.DeleteUserProfiles();&lt;br /&gt;             //  break;&lt;br /&gt;&lt;br /&gt;           default:&lt;br /&gt;               Usage();&lt;br /&gt;               break;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// Display user information&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   private static void Usage()&lt;br /&gt;   {&lt;br /&gt;       Console.WriteLine("Usage: Program [choice] where choice = CreateProfileAttributes or MapExistingAttributes or DeleteOtherAttributes");&lt;br /&gt;       Console.WriteLine("Example --&gt; Program CreateProfileAttributes");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// Delete other attributes&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   private static void DeleteOtherAttributes()&lt;br /&gt;   {&lt;br /&gt;       using (SPSite site = new SPSite(ConfigurationManager.AppSettings["server"])) //("http://localhost"))&lt;br /&gt;       {&lt;br /&gt;           ServerContext context = ServerContext.GetContext(site);&lt;br /&gt;           UserProfileManager profileManager = new UserProfileManager(context);&lt;br /&gt;           UserProfileConfigManager mgr = new UserProfileConfigManager(context);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           //Get the properties&lt;br /&gt;           PropertyCollection pc = profileManager.PropertiesWithSection;&lt;br /&gt;&lt;br /&gt;           //Property companySection = pc.GetPropertyByName(ConfigurationManager.AppSettings["CustomPropertySectionName"]);&lt;br /&gt;           //if (companySection == null)&lt;br /&gt;           //{&lt;br /&gt;           //    companySection = pc.Create(true);&lt;br /&gt;           //    companySection.Name = ConfigurationManager.AppSettings["CustomPropertySectionName"];&lt;br /&gt;           //    companySection.DisplayName = ConfigurationManager.AppSettings["CustomPropertySectionValue"];&lt;br /&gt;           //}&lt;br /&gt;&lt;br /&gt;           int order = 1;&lt;br /&gt;           NameValueCollection coll = (NameValueCollection)ConfigurationManager.GetSection("company/NewProfileProperties");&lt;br /&gt;&lt;br /&gt;           string keyValue = null;&lt;br /&gt;&lt;br /&gt;           foreach (String key in coll.AllKeys)&lt;br /&gt;           {&lt;br /&gt;               try&lt;br /&gt;               {&lt;br /&gt;                   pc.RemovePropertyByName(key);&lt;br /&gt;               }&lt;br /&gt;               catch (Exception ex)&lt;br /&gt;               {&lt;br /&gt;                   string s = ex.Message;&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       using (SPSite site = new SPSite(ConfigurationManager.AppSettings["server"])) //("http://localhost"))&lt;br /&gt;       {&lt;br /&gt;           ServerContext context = ServerContext.GetContext(site);&lt;br /&gt;           UserProfileManager profileManager = new UserProfileManager(context);&lt;br /&gt;           UserProfileConfigManager mgr = new UserProfileConfigManager(context);&lt;br /&gt;&lt;br /&gt;           PropertyCollection pc = profileManager.Properties;&lt;br /&gt;&lt;br /&gt;           NameValueCollection coll = (NameValueCollection)ConfigurationManager.GetSection("company/ExistingProfilePropertyUpdates");&lt;br /&gt;&lt;br /&gt;           string keyValue = null;&lt;br /&gt;&lt;br /&gt;           foreach (String key in coll.AllKeys)&lt;br /&gt;           {&lt;br /&gt;               try&lt;br /&gt;               {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                   keyValue = coll[key];&lt;br /&gt;                   String[] details = keyValue.Split(new char[] { ',' });&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                   Property property = pc.GetPropertyByName(key);&lt;br /&gt;                   property.DisplayName = details[0];&lt;br /&gt;&lt;br /&gt;                   DataSource ds = mgr.GetDataSource();&lt;br /&gt;                   PropertyMapCollection pmc = ds.PropertyMapping;&lt;br /&gt;&lt;br /&gt;                   string tomap = details[1].Trim();&lt;br /&gt;                   string connnection = details[2].Trim();&lt;br /&gt;&lt;br /&gt;                   try&lt;br /&gt;                   {&lt;br /&gt;                       pmc.Remove(key);&lt;br /&gt;                   }&lt;br /&gt;                   catch (Exception exe) { }&lt;br /&gt;&lt;br /&gt;                   ArrayList invmap = pmc.VerifyMapping(false);&lt;br /&gt;&lt;br /&gt;                   property.Commit();&lt;br /&gt;               }&lt;br /&gt;               catch (System.Exception e2)&lt;br /&gt;               {&lt;br /&gt;                   Console.WriteLine(e2.Message + " - " + key);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// Change mappings for existing attributes&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   private static void MapExistingAttributes()&lt;br /&gt;   {&lt;br /&gt;       using (SPSite site = new SPSite(ConfigurationManager.AppSettings["server"])) //("http://localhost"))&lt;br /&gt;       {&lt;br /&gt;           ServerContext context = ServerContext.GetContext(site);&lt;br /&gt;           UserProfileManager profileManager = new UserProfileManager(context);&lt;br /&gt;           UserProfileConfigManager mgr = new UserProfileConfigManager(context);&lt;br /&gt;&lt;br /&gt;           PropertyCollection pc = profileManager.Properties;&lt;br /&gt;&lt;br /&gt;           NameValueCollection coll = (NameValueCollection)ConfigurationManager.GetSection("company/ExistingProfilePropertyUpdates");&lt;br /&gt;&lt;br /&gt;           string keyValue = null;&lt;br /&gt;&lt;br /&gt;           foreach (String key in coll.AllKeys)&lt;br /&gt;           {&lt;br /&gt;               try&lt;br /&gt;               {&lt;br /&gt;                   keyValue = coll[key];&lt;br /&gt;                   String[] details = keyValue.Split(new char[] { ',' });&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                   Property property = pc.GetPropertyByName(key);&lt;br /&gt;                   property.DisplayName = details[0];&lt;br /&gt;&lt;br /&gt;                   DataSource ds = mgr.GetDataSource();&lt;br /&gt;                   PropertyMapCollection pmc = ds.PropertyMapping;&lt;br /&gt;&lt;br /&gt;                   string tomap = details[1].Trim();&lt;br /&gt;                   string connnection = details[2].Trim();&lt;br /&gt;&lt;br /&gt;                   try&lt;br /&gt;                   {&lt;br /&gt;                       pmc.Remove(key);&lt;br /&gt;                   }&lt;br /&gt;                   catch (Exception exe) { }&lt;br /&gt;&lt;br /&gt;                   if ((!string.IsNullOrEmpty(tomap)) &amp;amp;&amp;amp; (!(string.IsNullOrEmpty(connnection))))&lt;br /&gt;                       pmc.Add(key, tomap, connnection);&lt;br /&gt;&lt;br /&gt;                   //ArrayList invmap = pmc.VerifyMapping(false);&lt;br /&gt;&lt;br /&gt;                   property.Commit();&lt;br /&gt;               }&lt;br /&gt;               catch (System.Exception e2)&lt;br /&gt;               {&lt;br /&gt;                   Console.WriteLine(e2.Message + " - " + key);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// Create the profile attributes&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   private static void CreateProfileAttributes()&lt;br /&gt;   {&lt;br /&gt;&lt;br /&gt;       //&lt;br /&gt;       using (SPSite site = new SPSite(ConfigurationManager.AppSettings["server"])) //("http://localhost"))&lt;br /&gt;       {&lt;br /&gt;           ServerContext context = ServerContext.GetContext(site);&lt;br /&gt;           UserProfileManager profileManager = new UserProfileManager(context);&lt;br /&gt;           UserProfileConfigManager mgr = new UserProfileConfigManager(context);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           //Get the properties&lt;br /&gt;           PropertyCollection pc = profileManager.PropertiesWithSection;&lt;br /&gt;&lt;br /&gt;           //Property companySection = pc.GetPropertyByName(ConfigurationManager.AppSettings["CustomPropertySectionName"]);&lt;br /&gt;           //if (companySection == null)&lt;br /&gt;           //{&lt;br /&gt;           //    companySection = pc.Create(true);&lt;br /&gt;           //    companySection.Name = ConfigurationManager.AppSettings["CustomPropertySectionName"];&lt;br /&gt;           //    companySection.DisplayName = ConfigurationManager.AppSettings["CustomPropertySectionValue"];&lt;br /&gt;           //}&lt;br /&gt;&lt;br /&gt;           int order = 1;&lt;br /&gt;           NameValueCollection coll = (NameValueCollection)ConfigurationManager.GetSection("company/NewProfileProperties");&lt;br /&gt;&lt;br /&gt;           string keyValue = null;&lt;br /&gt;&lt;br /&gt;           foreach (String key in coll.AllKeys)&lt;br /&gt;           {&lt;br /&gt;               try&lt;br /&gt;               {&lt;br /&gt;                   keyValue = coll[key];&lt;br /&gt;                   String[] details = keyValue.Split(new char[] { ',' });&lt;br /&gt;&lt;br /&gt;                   Property p = pc.Create(false);&lt;br /&gt;                   p.Name = key;&lt;br /&gt;                   p.DisplayName = details[0].Trim();&lt;br /&gt;                   //p.Type = details[1].Trim().ToLower();&lt;br /&gt;&lt;br /&gt;                   //sample to get a property type "URL"&lt;br /&gt;                   PropertyDataTypeCollection pdtc = mgr.GetPropertyDataTypes();&lt;br /&gt;                   PropertyDataType ptype = null;&lt;br /&gt;                   IEnumerator enumType = pdtc.GetEnumerator();&lt;br /&gt;                   while (enumType.MoveNext())&lt;br /&gt;                   {&lt;br /&gt;                       ptype = (PropertyDataType)enumType.Current;&lt;br /&gt;                       if (ptype.Name.ToLower().Equals(details[1].Trim().ToLower())) break;&lt;br /&gt;                   }&lt;br /&gt;&lt;br /&gt;                   p.Type = ptype.Name;&lt;br /&gt;&lt;br /&gt;                   if (details[1].Trim().ToLower() == "string")&lt;br /&gt;                       p.Length = Convert.ToInt32(details[2].Trim());&lt;br /&gt;&lt;br /&gt;                   p.PrivacyPolicy = PrivacyPolicy.OptIn;&lt;br /&gt;                   p.DefaultPrivacy = Privacy.Public;&lt;br /&gt;                   if (details[3].Trim() == "true")&lt;br /&gt;                       p.IsSearchable = true;&lt;br /&gt;                   else&lt;br /&gt;                       p.IsSearchable = false;&lt;br /&gt;&lt;br /&gt;                   p.IsVisibleOnEditor = false;&lt;br /&gt;                   p.IsVisibleOnViewer = true;&lt;br /&gt;                   pc.Add(p);&lt;br /&gt;                   pc.SetDisplayOrderByPropertyName(p.Name, order++);&lt;br /&gt;                   pc.CommitDisplayOrder();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                   DataSource ds = mgr.GetDataSource();&lt;br /&gt;                   PropertyMapCollection pmc = ds.PropertyMapping;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                   string tomap = details[4].Trim();&lt;br /&gt;                   string connnection = details[5].Trim();&lt;br /&gt;&lt;br /&gt;                   if ((!string.IsNullOrEmpty(tomap)) &amp;amp;&amp;amp; (!(string.IsNullOrEmpty(connnection))))&lt;br /&gt;                       pmc.Add(key, tomap, connnection);&lt;br /&gt;&lt;br /&gt;                   //ArrayList invmap = pmc.VerifyMapping(false);&lt;br /&gt;               }&lt;br /&gt;               catch (DuplicateEntryException e)&lt;br /&gt;               {&lt;br /&gt;                   Console.WriteLine(e.Message + " - " + key);&lt;br /&gt;               }&lt;br /&gt;               catch (System.Exception e2)&lt;br /&gt;               {&lt;br /&gt;                   Console.WriteLine(e2.Message + " - " + key);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           //get arraylist of invalid mappings&lt;br /&gt;           //ArrayList invmap = pmc.VerifyMapping(false);&lt;br /&gt;           //remove current mapping if invalid&lt;br /&gt;           //foreach (PropertyMap pm in invmap)&lt;br /&gt;           //{&lt;br /&gt;           //    if (pm.PropName == p.Name)&lt;br /&gt;           //    {&lt;br /&gt;           //        pmc.Remove(pm.PropName);&lt;br /&gt;           //    }&lt;br /&gt;           //}&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Here are the corresponding entries from the web.config.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;configsections&amp;gt;&lt;br /&gt;&amp;lt;sectiongroup name="Company"&amp;gt;&lt;br /&gt;  &amp;lt;section name="NewProfileProperties" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"&amp;gt;&lt;br /&gt;  &amp;lt;section name="ExistingProfilePropertyUpdates" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"&amp;gt;&lt;br /&gt;&amp;lt;/section&amp;gt;&amp;lt;/section&amp;gt;&amp;lt;/sectiongroup&amp;gt;&lt;br /&gt;&amp;lt;/configsections&amp;gt;&lt;br /&gt;&amp;lt;company&amp;gt;&lt;br /&gt;&amp;lt;newprofileproperties&amp;gt;&lt;br /&gt;  &amp;lt;!-- key=name, value="Display name, type, length, true if indexed, mapping to AD/BDC"/&amp;gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;add key="NamePrefix" value="Name Prefix,String,20,false,NamePrefix,BDC_Connection_Name"&amp;gt;&amp;lt;/add&amp;gt;&lt;br /&gt;  &amp;lt;add key="NameTitle" value="Name Title,String,40,false,NameTitle,BDC_Connection_Name"&amp;gt;&amp;lt;/add&amp;gt;&lt;br /&gt;&amp;lt;add key="CompanyEmail" value="Company Email,Email,,true,userPrincipalName,ad_Connection_name"&amp;gt;&amp;lt;/add&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/newprofileproperties&amp;gt;&amp;lt;/company&amp;gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;......&lt;br /&gt;......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6484325795148141834?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6484325795148141834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6484325795148141834' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6484325795148141834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6484325795148141834'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/05/script-to-create-profile-properties-in.html' title='Script to Create Profile Properties in SharePoint Profile Store'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-216179040315046919</id><published>2009-05-07T13:31:00.004-06:00</published><updated>2009-05-08T11:23:39.761-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Custom navigation provider'/><title type='text'>MOSS custom navigation provider for left nav</title><content type='html'>As promised, here is the code for the custom left navigation provider in MOSS. It uses a similar concept as the custom top navigation provider I detailed in &lt;a href="http://faraz-khan.blogspot.com/2008/11/writing-custom-navigation-provider-for.html"&gt;this&lt;/a&gt; post, but there are some differences. Unlike a top or global navigation which is fairly consistent across your brand, the left navigation can change from site across site collections. It can even be different in different Webs. So based on that consideration, this solution handles those cases. Again, this navigation reads from a SharePoint list on a site. The navigation can read from a list in the root site of a site collection, the current site, or a site below the root site (this was a specific requirement) - all this is in a case statement so pretty easy to change.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Again, I have used this before successfully for a busy site. There are various settings in the Web.config that allow you to customize as per your needs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;This is demonstrated in the picture below. Only the Quick view is changeable on a site per site basis. The Quick Links section is consistent across the brand.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0Ed2QK3VEI/AAAAAAAAACA/Hz2oEOpy2vk/s1600-h/leftblue.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417868069753922" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0Ed2QK3VEI/AAAAAAAAACA/Hz2oEOpy2vk/s400/leftblue.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again, the navigation is being read from a list in SharePoint, such as this. This doesn't have the same data, but should get the point across anyway.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s1600-h/listview.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417052025967634" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s400/listview.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#region Code Comment Header&lt;br /&gt;/*******************************************************************************************&lt;br /&gt;* &lt;history&gt;&lt;br /&gt;*&lt;br /&gt;*      $History: CustomLeftNavProvider.cs $&lt;br /&gt;*&lt;br /&gt;* *****************************************************************************************/&lt;br /&gt;#endregion&lt;br /&gt;using System;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Caching;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.Security;&lt;br /&gt;using Microsoft.SharePoint.Publishing;&lt;br /&gt;using Microsoft.SharePoint.Publishing.Navigation;&lt;br /&gt;using Microsoft.SharePoint.Administration;&lt;br /&gt;using CompanyXXX.ExceptionManagement;&lt;br /&gt;using System.Security.Permissions;&lt;br /&gt;using System.Security;&lt;br /&gt;&lt;br /&gt;namespace CompanyXXX.Dept.MOSS.Utilities.Navigation.Providers&lt;br /&gt;{&lt;br /&gt;//Assign the neccessary security permissions&lt;br /&gt;[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]&lt;br /&gt;[SharePointPermissionAttribute(SecurityAction.LinkDemand, ObjectModel = true)]&lt;br /&gt;[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]&lt;br /&gt;[SharePointPermissionAttribute(SecurityAction.InheritanceDemand, ObjectModel = true)]&lt;br /&gt;public class CustomLeftNavProvider : PortalSiteMapProvider&lt;br /&gt;{&lt;br /&gt;    //Create the in memory objects for storage and fast retreival&lt;br /&gt;    protected SiteMapNodeCollection siteMapNodeColl;&lt;br /&gt;    protected ArrayList childParentRelationship;&lt;br /&gt;    protected ArrayList topLevelNodes;&lt;br /&gt;    //protected SPSite sourceListSite;&lt;br /&gt;    //protected SPWeb sourceListWeb;&lt;br /&gt;    //protected bool needDisposing = false;&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Override the initialize method of the superclass&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    ///&lt;br /&gt;    ///&lt;br /&gt;    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)&lt;br /&gt;    {&lt;br /&gt;        // Verify that config isn't null&lt;br /&gt;        if (config == null)&lt;br /&gt;            throw new ArgumentNullException("config is null");&lt;br /&gt;&lt;br /&gt;        // Assign the provider a default name if it doesn't have one&lt;br /&gt;        if (String.IsNullOrEmpty(name))&lt;br /&gt;            name = "CustomLeftNavProvider";&lt;br /&gt;&lt;br /&gt;        // Add a default "description" attribute to config if the&lt;br /&gt;        // attribute doesn’t exist or is empty&lt;br /&gt;        if (string.IsNullOrEmpty(config["description"]))&lt;br /&gt;        {&lt;br /&gt;            config.Remove("description");&lt;br /&gt;            config.Add("description", "CompanyXXX custom current left navigation provider");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        base.Initialize(name, config);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// This method will be called for all nodes and subnodes that can have children under them. For eg, NodeTypes.AuthoringLink type node&lt;br /&gt;    /// cannot have child nodes.&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    /// The node to find child nodes for&lt;br /&gt;    /// &lt;returns&gt;The SiteMapNodeCollection which contains the children of the child nodes&lt;/returns&gt;&lt;br /&gt;    public override SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode node)&lt;br /&gt;    {&lt;br /&gt;        return ComposeNodes(node);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Find the web and the list from where to read navigation&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    ///&lt;br /&gt;    public void FindWeb(ref SPWeb sourceListWeb, ref SPSite sourceListSite, ref bool needDisposing)&lt;br /&gt;    {&lt;br /&gt;        //string currentNavList = ConfigurationManager.AppSettings["CurrentLeftNavigationListName"];&lt;br /&gt;        //inheritNav = true;&lt;br /&gt;&lt;br /&gt;        string navListWeb = String.Empty;&lt;br /&gt;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            //Get the web where the current list is created&lt;br /&gt;            navListWeb = ConfigurationManager.AppSettings["LeftNavigationListWeb"];&lt;br /&gt;&lt;br /&gt;            //if the list is at the root site of the collection, the current web or even a different&lt;br /&gt;            //site - this is specified in the config file&lt;br /&gt;            switch (navListWeb) {&lt;br /&gt;                case "ROOT":&lt;br /&gt;                    sourceListWeb = SPContext.Current.Site.RootWeb;&lt;br /&gt;                    //leftNavList = sourceListWeb.Lists[currentNavList];&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;                case ".":&lt;br /&gt;                    sourceListWeb = SPContext.Current.Web;&lt;br /&gt;                    //leftNavList = sourceListWeb.Lists[currentNavList];&lt;br /&gt;                    //inheritNav = false;&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;                case "LEVEL2":&lt;br /&gt;                    //The list will be located one level below the top level&lt;br /&gt;                    SPWeb cmsweb = SPContext.Current.Web;&lt;br /&gt;                    SPWeb holder = null;&lt;br /&gt;                    SPWeb rootWeb = SPContext.Current.Site.RootWeb;&lt;br /&gt;                &lt;br /&gt;                    //if current web is at second level or at root, pick the respective lists from there&lt;br /&gt;                    if (cmsweb.ID == rootWeb.ID || cmsweb.ParentWeb.ID == rootWeb.ID)&lt;br /&gt;                        sourceListWeb = cmsweb;&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        //else traverse up to the second level&lt;br /&gt;                        while (cmsweb.ID != rootWeb.ID)&lt;br /&gt;                        {&lt;br /&gt;                            holder = cmsweb;&lt;br /&gt;                            cmsweb = cmsweb.ParentWeb;&lt;br /&gt;                        }&lt;br /&gt;                        sourceListWeb = holder;&lt;br /&gt;                    }&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;                default:&lt;br /&gt;                    //instantiate sites and lists.&lt;br /&gt;                    sourceListSite = new SPSite(navListWeb);&lt;br /&gt;                    sourceListWeb = sourceListSite.OpenWeb();&lt;br /&gt;                    //leftNavList = sourceListWeb.Lists[currentNavList];&lt;br /&gt;                    //inheritNav = false;&lt;br /&gt;                    needDisposing = true;&lt;br /&gt;                    break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (Exception ex)&lt;br /&gt;        {&lt;br /&gt;            System.Collections.Specialized.NameValueCollection exc =&lt;br /&gt;                new System.Collections.Specialized.NameValueCollection();&lt;br /&gt;&lt;br /&gt;            exc.Add("Method", "FindWeb");&lt;br /&gt;&lt;br /&gt;            if (!String.IsNullOrEmpty(navListWeb))&lt;br /&gt;                exc.Add("navListWebFromAppSetting", navListWeb);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("navListWebFromAppSetting", "null");&lt;br /&gt;            if (sourceListSite != null)&lt;br /&gt;                exc.Add("sourceListSite", sourceListSite.Url);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("sourceListSite", "null");&lt;br /&gt;            if (sourceListWeb != null)&lt;br /&gt;                exc.Add("sourceListWeb", sourceListWeb.Url);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("sourceListWeb", "null");&lt;br /&gt;&lt;br /&gt;            throw ex;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Compose nodes when the method is called. At a minimum, this method gets called with the root node of every&lt;br /&gt;    /// site collection. We must attach the top level nodes to the root node for this method to get called for those&lt;br /&gt;    /// nodes as well.&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    ///&lt;br /&gt;    /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;    public virtual SiteMapNodeCollection ComposeNodes(System.Web.SiteMapNode node)&lt;br /&gt;    {&lt;br /&gt;        //Create the SiteCollection to return&lt;br /&gt;        SiteMapNodeCollection children = new SiteMapNodeCollection();&lt;br /&gt;        SortedList orderedNodes = new SortedList();&lt;br /&gt;&lt;br /&gt;        SPWeb sourceListWeb = null;&lt;br /&gt;        SPSite sourceListSite = null;&lt;br /&gt;        SPList leftNavList = null;&lt;br /&gt;        bool cacheLeftNav = false;&lt;br /&gt;        bool needDisposing = false;&lt;br /&gt;        string currentNavList = String.Empty;&lt;br /&gt;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            FindWeb(ref sourceListWeb, ref sourceListSite, ref needDisposing);&lt;br /&gt;&lt;br /&gt;            string cacheNav = ConfigurationManager.AppSettings["CacheLeftNavigation"];&lt;br /&gt;            if (String.Compare(cacheNav, "true", true) == 1)&lt;br /&gt;                cacheLeftNav = true;&lt;br /&gt;&lt;br /&gt;            //Account for the PortalWebSiteMapNode&lt;br /&gt;            PortalWebSiteMapNode prtlWebSiteMapNode = null;&lt;br /&gt;            int counter = 100;&lt;br /&gt;&lt;br /&gt;            currentNavList = ConfigurationManager.AppSettings["CurrentLeftNavigationListName"];&lt;br /&gt;&lt;br /&gt;            //If a rootnode, then add the top level children which are the same for every site collection&lt;br /&gt;            if (node == node.RootNode)&lt;br /&gt;            {&lt;br /&gt;                //Serve it from cache if possible&lt;br /&gt;                if (cacheLeftNav)&lt;br /&gt;                {&lt;br /&gt;                    object topNodes = HttpRuntime.Cache["LeftNavTopNodes" + sourceListWeb.ID.ToString()];&lt;br /&gt;                    if (topNodes != null &amp;amp;&amp;amp; topNodes is SiteMapNodeCollection)&lt;br /&gt;                        return ((SiteMapNodeCollection)topNodes);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                //else find the list&lt;br /&gt;                leftNavList = sourceListWeb.Lists[currentNavList];&lt;br /&gt;&lt;br /&gt;                //Create the query to browse the list&lt;br /&gt;                SPQuery qry = new SPQuery();&lt;br /&gt;&lt;br /&gt;                SPFolder startFolder = null;&lt;br /&gt;&lt;br /&gt;                //Get the folder to start from&lt;br /&gt;                startFolder = leftNavList.RootFolder.SubFolders[ConfigurationManager.AppSettings["NavigationListStartFolderName"]];&lt;br /&gt;&lt;br /&gt;                //Get the query for this folder&lt;br /&gt;                qry.Folder = startFolder;&lt;br /&gt;&lt;br /&gt;                //Get all the items under the start folder using the query&lt;br /&gt;                SPListItemCollection ic = sourceListWeb.Lists[startFolder.ParentListId].GetItems(qry);&lt;br /&gt;&lt;br /&gt;                //Get the PortalWebSiteMapNode&lt;br /&gt;                if (node != null &amp;amp;&amp;amp; node is PortalWebSiteMapNode)&lt;br /&gt;                {&lt;br /&gt;                    prtlWebSiteMapNode = node as PortalWebSiteMapNode;&lt;br /&gt;&lt;br /&gt;                    //Construct the nodes&lt;br /&gt;                    foreach (SPListItem subitem in ic)&lt;br /&gt;                    {&lt;br /&gt;                        //Change the nodeTypes to Authored link for leaf nodes so that the GetChildNodes method is not called for those nodes.&lt;br /&gt;                        NodeTypes ntypes = NodeTypes.Default;&lt;br /&gt;                        if (subitem.Folder == null)&lt;br /&gt;                            ntypes = NodeTypes.AuthoredLink;&lt;br /&gt;&lt;br /&gt;                        //Create a PortalSiteMapNode&lt;br /&gt;                        PortalSiteMapNode psmn = new PortalSiteMapNode(prtlWebSiteMapNode, subitem.ID.ToString(), ntypes,&lt;br /&gt;                            subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlLink"]), subitem.Title,&lt;br /&gt;                            subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlDescription"]));&lt;br /&gt;&lt;br /&gt;                        //Order the nodes&lt;br /&gt;                        try&lt;br /&gt;                        {&lt;br /&gt;                            int order = Convert.ToInt32(subitem.GetFormattedValue(ConfigurationManager.AppSettings["ItemOrder"]));&lt;br /&gt;                            orderedNodes.Add(order, psmn);&lt;br /&gt;                        }&lt;br /&gt;                        catch (Exception ex)&lt;br /&gt;                        {&lt;br /&gt;                            orderedNodes.Add(counter++, psmn);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    //Copy nodes in the right order&lt;br /&gt;                    foreach (object portalSiteMapNode in orderedNodes.Values)&lt;br /&gt;                    {&lt;br /&gt;                        children.Add(portalSiteMapNode as PortalSiteMapNode);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    //Add them to the cache&lt;br /&gt;                    if (cacheLeftNav)&lt;br /&gt;                        HttpRuntime.Cache["LeftNavTopNodes" + sourceListWeb.ID.ToString()] = children;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            //Else this is a subnode, get only the children of that subnode&lt;br /&gt;            {&lt;br /&gt;                string nodeKey = node.Key;&lt;br /&gt;&lt;br /&gt;                if (cacheLeftNav)&lt;br /&gt;                {&lt;br /&gt;                    //Get the children for this nodeKey from cache if they exist there&lt;br /&gt;                    object subNodes = HttpRuntime.Cache["LeftNavChildNodes" + sourceListWeb.ID.ToString() + nodeKey];&lt;br /&gt;                    if (subNodes != null &amp;amp;&amp;amp; subNodes is SiteMapNodeCollection)&lt;br /&gt;                        return ((SiteMapNodeCollection)subNodes);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                leftNavList = sourceListWeb.Lists[currentNavList];&lt;br /&gt;&lt;br /&gt;                //Create the query to browse the list&lt;br /&gt;                SPQuery qry = new SPQuery();&lt;br /&gt;&lt;br /&gt;                //Convert the nodeKey into an integer&lt;br /&gt;                int ID = Convert.ToInt32(nodeKey);&lt;br /&gt;&lt;br /&gt;                //Find the current item&lt;br /&gt;                SPListItem item = leftNavList.GetItemById(ID);&lt;br /&gt;&lt;br /&gt;                //Find the item that and get its subitems&lt;br /&gt;                if (item != null &amp;amp;&amp;amp; item.Folder != null)&lt;br /&gt;                {&lt;br /&gt;                    SPFolder curFolder = item.Folder;&lt;br /&gt;&lt;br /&gt;                    qry.Folder = curFolder;&lt;br /&gt;&lt;br /&gt;                    //Get all the items in the current folder using the query&lt;br /&gt;                    SPListItemCollection ic = sourceListWeb.Lists[curFolder.ParentListId].GetItems(qry);&lt;br /&gt;&lt;br /&gt;                    //To get the PortalWebSiteMapNode, ask the root node&lt;br /&gt;                    if (node.RootNode != null &amp;amp;&amp;amp; node.RootNode is PortalWebSiteMapNode)&lt;br /&gt;                    {&lt;br /&gt;                        //Cast node to PortalWebSiteMapNode&lt;br /&gt;                        prtlWebSiteMapNode = node.RootNode as PortalWebSiteMapNode;&lt;br /&gt;&lt;br /&gt;                        foreach (SPListItem subitem in ic)&lt;br /&gt;                        {&lt;br /&gt;                            //Change the nodeTypes to Authored link for leaf nodes so that the GetChildNodes method is not called&lt;br /&gt;                            //for those nodes.&lt;br /&gt;                            NodeTypes ntypes = NodeTypes.AuthoredLink;&lt;br /&gt;                            if (subitem.Folder != null)&lt;br /&gt;                                ntypes = NodeTypes.Default;&lt;br /&gt;&lt;br /&gt;                            //Create a PortalSiteMapNode&lt;br /&gt;                            PortalSiteMapNode psmn = new PortalSiteMapNode(prtlWebSiteMapNode, subitem.ID.ToString(),&lt;br /&gt;                                ntypes, subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlLink"]), subitem.Title,&lt;br /&gt;                                subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlDescription"]));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                            //Order the nodes&lt;br /&gt;                            try&lt;br /&gt;                            {&lt;br /&gt;                                int order = Convert.ToInt32(subitem.GetFormattedValue(ConfigurationManager.AppSettings["ItemOrder"]));&lt;br /&gt;                                orderedNodes.Add(order, psmn);&lt;br /&gt;                            }&lt;br /&gt;                            catch (Exception ex)&lt;br /&gt;                            {&lt;br /&gt;                                orderedNodes.Add(counter++, psmn);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        //Copy nodes in the right order&lt;br /&gt;                        foreach (object portalSiteMapNode in orderedNodes.Values)&lt;br /&gt;                        {&lt;br /&gt;                            children.Add(portalSiteMapNode as PortalSiteMapNode);&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        //Add them to the cache&lt;br /&gt;                        if (cacheLeftNav)&lt;br /&gt;                        {&lt;br /&gt;                            HttpRuntime.Cache["LeftNavChildNodes" + sourceListWeb.ID.ToString() + nodeKey] = children;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (Exception ex)&lt;br /&gt;        {&lt;br /&gt;            System.Collections.Specialized.NameValueCollection exc =&lt;br /&gt;                new System.Collections.Specialized.NameValueCollection();&lt;br /&gt;&lt;br /&gt;            exc.Add("Method", "ComposeNodes");&lt;br /&gt;&lt;br /&gt;            if (!String.IsNullOrEmpty(currentNavList))&lt;br /&gt;                exc.Add("CurrentLeftNavigationListNameFromAppSettings", currentNavList);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("CurrentLeftNavigationListNameFromAppSettings", "null");&lt;br /&gt;&lt;br /&gt;            if (sourceListSite != null)&lt;br /&gt;                exc.Add("sourceListSite", sourceListSite.Url);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("sourceListSite", "null");&lt;br /&gt;&lt;br /&gt;            if (sourceListWeb != null)&lt;br /&gt;                exc.Add("sourceListWeb", sourceListWeb.Url);&lt;br /&gt;            else&lt;br /&gt;                exc.Add("sourceListWeb", "null");&lt;br /&gt;&lt;br /&gt;            ExceptionManager.Publish(ex, exc);&lt;br /&gt;&lt;br /&gt;            //Do not dispose of the web or site referenced from SPContext&lt;br /&gt;&lt;br /&gt;            //Test that finally does get called even though a return statement is executed here&lt;br /&gt;            //Return empty collection&lt;br /&gt;            return new SiteMapNodeCollection();&lt;br /&gt;        }&lt;br /&gt;        finally&lt;br /&gt;        {&lt;br /&gt;            if (needDisposing)&lt;br /&gt;            {&lt;br /&gt;                if (sourceListWeb != null)&lt;br /&gt;                    sourceListWeb = null;&lt;br /&gt;                if (sourceListSite != null)&lt;br /&gt;                    sourceListSite = null;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return children;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/history&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-216179040315046919?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/216179040315046919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=216179040315046919' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/216179040315046919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/216179040315046919'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/05/moss-custom-navigation-provider-for.html' title='MOSS custom navigation provider for left nav'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r8BZcH_g0j0/R0Ed2QK3VEI/AAAAAAAAACA/Hz2oEOpy2vk/s72-c/leftblue.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7776866614008454795</id><published>2009-04-10T16:48:00.011-06:00</published><updated>2009-05-08T11:24:33.667-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User Profiles'/><title type='text'>Import user profiles using Active Directory / Business Data Catalog</title><content type='html'>It has been a while since I blogged, I was on a large enterprise project and was pretty busy until recently. I concluded the project at a client where we had a lot of user information in a legacy system that used SQL Server as the backend. We were building the new site on MOSS 2007 and the user profiles were needed in the SharePoint application - for searching and surfacing these user profiles for over 120,000 users. We were also implementing Active Directory as part of this release so we needed to bring all the user information into AD for authentication to the new MOSS site.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To implement this complex requirement, we broke the challenge into 3 tasks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;1. Moving the user accounts from the legacy database to AD to enable user authentication against AD.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then we had to pull the same information into the SharePoint profile store. Here is how we broke this up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;2. We moved the user account information from AD to the SharePoint profiles using the built in SharePoint connector to AD. Though the user profile in the legacy system had a lot of fields, we only brought over a handful of fields to AD to minimize the impact to the Active Directory. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SharePoint 2007 profiles have a concept of master and non-master connections. AD or a LDAP source is a master connection. BDC on the contrary, is a non-master connection. What this means that the BDC cannot be used to create a new profile record in the profile store. Only AD or a LDAP connection can do that. BDC can only supplement user information in the SharePoint profile store.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;3. We supplemented the rest of the information from the custom legacy store to the SharePoint profile store using the Business Data Catalog in SharePoint. This allowed us to bring 50-60 additional fields over directly into the SharePoint profile store without needing to move them all to AD and bring them from there.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/Sd_cvJ4eN7I/AAAAAAAAAGM/7TVR5Hw1nqE/s1600-h/ADSPFlow.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/Sd_cvJ4eN7I/AAAAAAAAAGM/7TVR5Hw1nqE/s400/ADSPFlow.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5323215987239958450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was getting ready to write many more pages about the details of this solution, but I just noticed that my friend Todd Baginski also concluded a similar project a few weeks ago, so I am going to point you his way for all the details. You can view his post &lt;a href="http://www.toddbaginski.com/blog/archive/2009/03/08/45.aspx"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way my solution differed from Todd's is that we did not use this information in the MySites. In fact, we did not even enable MySite. The reason being that we were pulling a 120,000 users or so - and that would be nearing the 150,000 site collections per Web application upper limit recommendation on technet. We did contemplate splitting up the MySites in a couple of Web Apps, but the requirements for that user interface were also very different than what comes OOB in SharePoint so a custom page served us much better, instead of the overhead of having 120,000 site collections. Also we did not want to give users control of editing on the site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other notables to this piece were &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;1. A handy script I wrote to create 70 profile attributes in the user profile store in SharePoint and also map those attributes to either the master connection on the BDC connection depending on the application file settings.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;2. A wholly custom search implementation that used the SharePoint Enterprise Full Text search to search the user profiles and display each individual profile on the custom page that we developed and deployed to SharePoint.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will document both these pieces shortly. Stay tuned!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7776866614008454795?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/7776866614008454795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=7776866614008454795' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7776866614008454795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7776866614008454795'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2009/04/import-user-profiles-using-active.html' title='Import user profiles using Active Directory / Business Data Catalog'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r8BZcH_g0j0/Sd_cvJ4eN7I/AAAAAAAAAGM/7TVR5Hw1nqE/s72-c/ADSPFlow.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2688918326606539629</id><published>2008-11-20T18:16:00.013-07:00</published><updated>2009-05-07T14:32:17.254-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Custom navigation provider'/><title type='text'>Writing a Custom Navigation Provider for MOSS</title><content type='html'>&lt;span style="color:#006600;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;Update: Also explained the concept and put up the code for the left navigation provider &lt;/span&gt;&lt;a href="http://faraz-khan.blogspot.com/2009/05/moss-custom-navigation-provider-for.html"&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;Update: Added the Web.config entries at the bottom.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By popular demand here is the writeup for the Custom Navigation Provider for SharePoint 2007 I wrote last year. Be sure to check it our and send me feedback.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So here is the use case. You would like to create a consistent navigation heirarchy in your SharePoint environment. The OOB navigation is not going to work for you because your site has probably grown to many site collections and having a consistent navigation is a need. You do not want to change your navigation on every site collection when it needs to be changed. The appropriate users want to change the top navigation as needed without having full access the site.&lt;br /&gt;&lt;br /&gt;I was faced with these challenges last year and so came up with the idea to write a custom navigation provider that can read from a list. The list can have folder heirarchies and those determine the levels and the dropdowns.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The list images and the changes that need to be made in the master page and web.config file are shown below for this to work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We created custom site columns, custom content types and then a custom list that used these content types to allow users to easily build hierarchies that the navigation provider could read and deduce the navigation levels. Here is an example of the custom list for the top navigation content. The actual URLs below in the Url Link column have erased, but this should get the point across.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s1600-h/listview.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417052025967634" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s400/listview.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(51,51,51)"&gt;This is a view of the global navigation shared across all site collections. It includes one level of dropdowns, but those can be added by adding the list heirarchies and also tweaking the levels to show in the AspMenu in the SharePoint master page.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(51,51,51)"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0EcsQK3VAI/AAAAAAAAABg/DOfsvx7UZOw/s1600-h/topnav.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134416596759434242" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 417px; CURSOR: hand; HEIGHT: 26px; TEXT-ALIGN: center" height="24" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0EcsQK3VAI/AAAAAAAAABg/DOfsvx7UZOw/s400/topnav.JPG" width="417" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here are the changes that had to be made in the master page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="FONT-STYLE: italic"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(153,51,0)"&gt;&amp;lt;sharepoint:aspmenu id="GlobalNav" runat="server" datasourceid="&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(0,102,0)"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;topSiteMap&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(153,51,0)"&gt;" accesskey=""&amp;gt;"&amp;gt;&lt;br /&gt;Orientation="Horizontal"&lt;br /&gt;StaticDisplayLevels="1"&lt;br /&gt;MaximumDynamicDisplayLevels="2"&lt;br /&gt;StaticEnableDefaultPopOutImage="false" ItemWrap="true"&lt;br /&gt;DynamicHorizontalOffset="-1" DynamicVerticalOffset="-7"&lt;br /&gt;SkipLinkText=""&lt;br /&gt;StaticSubMenuIndent="0" CssClass="ms-topNavContainerCustom"&amp;gt;&lt;br /&gt;&amp;lt;staticmenuitemstyle cssclass="topNavItemCustom" itemspacing="0"&amp;gt;&lt;br /&gt;&amp;lt;staticselectedstyle cssclass="topNavSelectedCustom" itemspacing="0"&amp;gt;&lt;br /&gt;&amp;lt;statichoverstyle cssclass="topNavHoverCustom"&amp;gt;&lt;br /&gt;&amp;lt;dynamicmenustyle cssclass="topNavFlyOutsCustom"&amp;gt;&lt;br /&gt;&amp;lt;dynamicmenuitemstyle cssclass="topNavFlyOutsItemCustom"&amp;gt;&lt;br /&gt;&amp;lt;dynamichoverstyle cssclass="topNavFlyOutsHoverCustom"&amp;gt;&lt;br /&gt;&amp;lt;/dynamichoverstyle&amp;gt;&amp;lt;/dynamicmenuitemstyle&amp;gt;&amp;lt;/dynamicmenustyle&amp;gt;&amp;lt;/statichoverstyle&amp;gt;&amp;lt;/staticselectedstyle&amp;gt;&amp;lt;/staticmenuitemstyle&amp;gt;&amp;lt;/sharepoint:aspmenu&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;publishingnavigation:portalsitemapdatasource id="topSiteMap" runat="server" sitemapprovider="&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(0,102,0)"&gt;CustomTopNavProvider&lt;/span&gt;&lt;/span&gt;" enableviewstate="true" startfromcurrentnode="true" startingnodeoffset="0" showstartingnode="false" treatstartingnodeascurrent="false"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The code below is pre-SP1. Some things may have slightly changed since then.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="COLOR: rgb(153,51,0)"&gt;#region Code Comment Header&lt;br /&gt;/*******************************************************************************************&lt;br /&gt;* &amp;lt;History&amp;gt;&lt;br /&gt;*&lt;br /&gt;* $History: CustomTopNavProvider.cs $&lt;br /&gt;*&lt;br /&gt;* *****************************************************************************************/&lt;br /&gt;#endregion&lt;br /&gt;using System;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Caching;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.Security;&lt;br /&gt;using Microsoft.SharePoint.Publishing;&lt;br /&gt;using Microsoft.SharePoint.Publishing.Navigation;&lt;br /&gt;using Microsoft.SharePoint.Administration;&lt;br /&gt;using CompanyXX.ExceptionManagement;&lt;br /&gt;using System.Security.Permissions;&lt;br /&gt;using System.Security;&lt;br /&gt;&lt;br /&gt;namespace CompanyXX.MOSS.Utilities.Navigation.Providers&lt;br /&gt;{&lt;br /&gt;//Assign the neccessary security permissions. TODO - Check the permissions required.&lt;br /&gt;[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]&lt;br /&gt;[SharePointPermissionAttribute(SecurityAction.LinkDemand, ObjectModel = true)]&lt;br /&gt;[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]&lt;br /&gt;[SharePointPermissionAttribute(SecurityAction.InheritanceDemand, ObjectModel = true)]&lt;br /&gt;//This inherits from the PortalSiteMapProvider class in MOSS, just because it provides some of the functions I need.&lt;br /&gt;//You could just as easily write one for WSS.&lt;br /&gt;public class CustomTopNavProvider : PortalSiteMapProvider&lt;br /&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Create the in memory objects for storage and fast retreival&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;protected SiteMapNodeCollection siteMapNodeColl;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;protected ArrayList childParentRelationship;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//These are only the top level nodes that will show in the top nav&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;protected ArrayList topLevelNodes;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;private PortalSiteMapNode rootNode = null;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// Override the initialize method of the superclass. You must override the Initialize method to write&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// a custom provider.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// &amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;/// &amp;lt;param name="config"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;public override void Initialize(string name, &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;System.Collections.Specialized.NameValueCollection config)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;// Verify that config isn't null&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (config == null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;throw new ArgumentNullException("config is null");&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;// Assign the provider a default name if it doesn't have one&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (String.IsNullOrEmpty(name))&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;name = "CustomTopNavProvider";&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;// Add a default "description" attribute to config if the&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;// attribute doesn’t exist or is empty&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (string.IsNullOrEmpty(config["description"]))&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;config.Remove("description");&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;config.Add("description", "CompanyXX Custom top navigation provider");&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;base.Initialize(name, config);&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;childParentRelationship = new ArrayList();&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;topLevelNodes = new ArrayList();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Build the site map in memory&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;LoadTopNavigationFromList();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Load the top navigation into memory on the first call.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;protected virtual void LoadTopNavigationFromList()&lt;br /&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Make sure to build the structure in memory only once&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;lock (this)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (rootNode != null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;return;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;else&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Initialiaze for the first time&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPSite rootSite = null;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPWeb rootWeb = null;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPList topnavList = null;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;try&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Clear the top level nodes and the relationships&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;topLevelNodes.Clear();&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;childParentRelationship.Clear();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//instantiate sites and lists for now. This setting assumes that the list being&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//read from for the global top navigation is in the root web of the site collection listed in &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;web.config.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootSite = new SPSite(ConfigurationManager.AppSettings["CompanyXXRootSite"]);&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootWeb = rootSite.RootWeb;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;topnavList = &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootWeb.Lists[ConfigurationManager.AppSettings["TopNavigationListName"]];&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Build the root node&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Note: Any top level site of any site collection is assigned to be the rootNode here, not &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;neccessarily the&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//top level site of the main site collection&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootNode = (PortalSiteMapNode)this.RootNode;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//We need to pass the PortalSiteMapNode constructor a PortalWebSiteMapNode object, so here it is&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Note: This is the root node of 1 site collection, but the navigation will be shown in all site collections.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;PortalWebSiteMapNode pwsmn = rootNode as PortalWebSiteMapNode;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (pwsmn != null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Get the current folder to start. The navigation heirarchy can start at that folder.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPFolder currentFolder = &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;topnavList.RootFolder.SubFolders[ConfigurationManager.AppSettings["NavigationListStartFolderName"]];&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Build the nodes&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;BuildListNodes(rootWeb, currentFolder, pwsmn, null, true);&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;catch (Exception ex)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//There was a problem opening the site or the list.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;ExceptionManager.Publish(ex);&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;finally&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Dispose of the objects&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (rootWeb != null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootWeb.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (rootSite != null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;rootSite.Dispose();&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Go through the list and build and save the PortalSiteMapNode nodes into memory based on the list heirarchy.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="folder"&amp;gt;this is the current folder to look for items&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="prtlWebSiteMapNode"&amp;gt;the parent PortalWeb&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="parentSiteMapNode"&amp;gt;the parent node&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="rootLevel"&amp;gt;true if this is the first level, false if its a rootnode&amp;lt;/param&amp;gt;&lt;br /&gt;protected virtual void BuildListNodes(SPWeb currentWeb, SPFolder folder, PortalWebSiteMapNode prtlWebSiteMapNode, PortalSiteMapNode parentSiteMapNode, bool rootLevel)&lt;br /&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;// Get the collection of items from this folder&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPQuery qry = new SPQuery();&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;qry.Folder = folder;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SortedList orderedNodes = new SortedList();&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;int counter = 100; //for sorting items&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;try&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Browse through the items in the folder and create PortalSiteMapNodes&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;SPListItemCollection ic = currentWeb.Lists[folder.ParentListId].GetItems(qry);&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;foreach (SPListItem subitem in ic)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//A SiteMapNode does not have target or audience information&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//SiteMapNode smn = new SiteMapNode(this, subitem.ID.ToString(), &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.GetFormattedValue("UrlText"), subitem.Title, &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.GetFormattedValue("UrlText"));&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Change the nodeTypes to Authored link for leaf nodes so that the GetChildNodes method &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;is not called for those nodes.&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;NodeTypes ntypes = NodeTypes.AuthoredLink;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;if (subitem.Folder != null)&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;ntypes = NodeTypes.Default;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Create a PortalSiteMapNode&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;PortalSiteMapNode psmn = new PortalSiteMapNode(prtlWebSiteMapNode, &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.ID.ToString(), ntypes,&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlLink"]), &lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.Title,&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;subitem.GetFormattedValue(ConfigurationManager.AppSettings["UrlDescription"]));&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Error, cannot assign audience and target - read only?? This is bad!!&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//psmn.Audience = subitem.GetFormattedValue("Audience");&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//psmn.Target = "_blank";&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;//Order the nodes&lt;br /&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt;&lt;/span&gt;try&lt;br /&gt;{&lt;br /&gt;int order = Convert.ToInt32(subitem.GetFormattedValue(ConfigurationManager.AppSettings["ItemOrder"]));&lt;br /&gt;orderedNodes.Add(order, psmn);&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;//This will happen if 2 items are assigned the same order. Push one item to the last order.&lt;br /&gt;orderedNodes.Add(counter++, psmn);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//if this is a folder, fetch and build the heirarchy under this folder&lt;br /&gt;if (subitem.Folder != null)&lt;br /&gt;BuildListNodes(currentWeb, subitem.Folder, prtlWebSiteMapNode, psmn, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Copy nodes in the right order&lt;br /&gt;foreach (object portalSiteMapNode in orderedNodes.Values)&lt;br /&gt;{&lt;br /&gt;//Add the node to the different collections&lt;br /&gt;if (rootLevel)&lt;br /&gt;topLevelNodes.Add(portalSiteMapNode);&lt;br /&gt;&lt;br /&gt;//If the parent node is not null, add the parent and the child relationship&lt;br /&gt;if (parentSiteMapNode != null)&lt;br /&gt;childParentRelationship.Add(new DictionaryEntry(parentSiteMapNode.Key, portalSiteMapNode));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;ExceptionManager.Publish(ex);&lt;br /&gt;throw;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// This method will be called for all nodes and subnodes that can have children under them. For eg, NodeTypes.AuthoringLink type node&lt;br /&gt;/// cannot have child nodes.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="node"&amp;gt;The node to find child nodes for&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;The SiteMapNodeCollection which contains the children of the child nodes&amp;lt;/returns&amp;gt;&lt;br /&gt;public override SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode node)&lt;br /&gt;{&lt;br /&gt;return ComposeNodes(node);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Compose nodes when the method is called. At a minimum, this method gets called with the root node of every&lt;br /&gt;/// site collection. We must attach the top level nodes to the root node for this method to get called for those&lt;br /&gt;/// nodes as well.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="node"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;public virtual SiteMapNodeCollection ComposeNodes(System.Web.SiteMapNode node)&lt;br /&gt;{&lt;br /&gt;//The SiteMapNodeCollection which represents the children of this node&lt;br /&gt;SiteMapNodeCollection children = new SiteMapNodeCollection();&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;//If an absolute rootnode, then add the top level children which are the same for every site collection&lt;br /&gt;if (node == node.RootNode)&lt;br /&gt;{&lt;br /&gt;//Serve it from cache if possible.&lt;br /&gt;//TODO: See if better way to do caching&lt;br /&gt;object topNodes = HttpRuntime.Cache["TopNavRootNodes"];&lt;br /&gt;if (topNodes != null &amp;amp;&amp;amp; topNodes is SiteMapNodeCollection)&lt;br /&gt;return ((SiteMapNodeCollection)topNodes);&lt;br /&gt;&lt;br /&gt;lock (this)&lt;br /&gt;{&lt;br /&gt;//TODO: Check cache again. Threads may have been waiting at the lock.&lt;br /&gt;&lt;br /&gt;//Two options available here.&lt;br /&gt;//1. Reload from the list when cache expires in case that is needed&lt;br /&gt;if (String.Compare(ConfigurationManager.AppSettings["ReloadTopNavOnCacheExpiry"], "true", true) == 1)&lt;br /&gt;{&lt;br /&gt;rootNode = null;&lt;br /&gt;LoadTopNavigationFromList();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Else generate the top level nodes from memory. This must be done regardless of option 1 above&lt;br /&gt;for (int i = 0; i &amp;lt; topLevelNodes.Count; i++)&lt;br /&gt;{&lt;br /&gt;children.Add(topLevelNodes[i] as PortalSiteMapNode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Add them to the cache&lt;br /&gt;HttpRuntime.Cache["TopNavRootNodes"] = children;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;//Else this is a subnode, get only the children of that subnode&lt;br /&gt;{&lt;br /&gt;string nodeKey = node.Key;&lt;br /&gt;&lt;br /&gt;//Get the children for this nodeKey from cache if they exist there&lt;br /&gt;object subNodes = HttpRuntime.Cache["TopNavRootNodes" + nodeKey];&lt;br /&gt;if (subNodes != null &amp;amp;&amp;amp; subNodes is SiteMapNodeCollection)&lt;br /&gt;return ((SiteMapNodeCollection)subNodes);&lt;br /&gt;&lt;br /&gt;lock (this)&lt;br /&gt;{&lt;br /&gt;//Two options available here.&lt;br /&gt;//1. Reload from the list when cache expires in case that is needed&lt;br /&gt;//Commenting out because the top node should decide if we are going to get the tree from cache, not subnodes&lt;br /&gt;//if (String.Compare(ConfigurationManager.AppSettings["ReloadTopNavOnCacheExpiry"], "true", true) == 1)&lt;br /&gt;//{&lt;br /&gt;// rootNode = null;&lt;br /&gt;// LoadTopNavigationFromList();&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;//Else iterate through the nodes and find the children of this node&lt;br /&gt;for (int i = 0; i &amp;lt; childParentRelationship.Count; i++)&lt;br /&gt;{&lt;br /&gt;string nKey = ((DictionaryEntry)childParentRelationship[i]).Key as string;&lt;br /&gt;&lt;br /&gt;//if this is a child&lt;br /&gt;if (nodeKey == nKey)&lt;br /&gt;{&lt;br /&gt;//Get the child from the arraylist&lt;br /&gt;PortalSiteMapNode child = (PortalSiteMapNode)(((DictionaryEntry)childParentRelationship[i]).Value);&lt;br /&gt;&lt;br /&gt;if (child != null)&lt;br /&gt;{&lt;br /&gt;children.Add(child as PortalSiteMapNode);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;throw new Exception("ArrayLists not in sync.");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//Add the children to the cache&lt;br /&gt;HttpRuntime.Cache["TopNavRootNodes" + nodeKey] = children;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;ExceptionManager.Publish(ex);&lt;br /&gt;&lt;br /&gt;//return empty site node collection&lt;br /&gt;return new SiteMapNodeCollection();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return children;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are the settings in the Web.config file for the Web Application.&lt;br /&gt;&lt;br /&gt;1. This goes in the providers section.&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;&amp;lt;add name="CustomTopNavProvider" description="Custom provider for top navigation in Portal Usage pages" type="CompanyXX.MOSS.Branding.CustomProviders.Navigation.CustomTopNavProvider, CompanyXX.MOSS.Branding.CustomProviders, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a5d522bbe3d8f31c" NavigationType="Combined" EncodeOutput="true" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. In the appSettings section, add the following entries.&lt;br /&gt;&lt;span style="color:#006600;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;add key="CompanyXXRootSite" value="http://www.yoursite.com/" /&amp;gt;&lt;br /&gt;&amp;lt;add key="TopNavigationListName" value="TopNavList" /&amp;gt;&lt;br /&gt;&amp;lt;add key="CurrentLeftNavigationListName" value="CurrentLeftNavList" /&amp;gt;&lt;br /&gt;&amp;lt;add key="StaticLeftNavigationListName" value="StaticLeftNavList" /&amp;gt;&lt;br /&gt;&amp;lt;add key="NavigationListStartFolderName" value="Group1" /&amp;gt;&lt;br /&gt;&amp;lt;add key="UrlLink" value="Url Link" /&amp;gt;&lt;br /&gt;&amp;lt;add key="UrlDescription" value="Url Description" /&amp;gt;&lt;br /&gt;&amp;lt;add key="NewWindow" value="Open New Window" /&amp;gt;&lt;br /&gt;&amp;lt;add key="UrlAudience" value="Url Audience" /&amp;gt;&lt;br /&gt;&amp;lt;add key="ItemOrder" value="Item Order" /&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have used this TopNavProvider to build the navigation for a MOSS intranet with ~4000 users, as well as an MOSS internet facing site with ~1.5 million visitors a month. Enjoy!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I also created another custom navigation provider that reads the current navigation for every site from a similar list on that site and displays that somewhere else on that page (left or right navigation).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2688918326606539629?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2688918326606539629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2688918326606539629' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2688918326606539629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2688918326606539629'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/11/writing-custom-navigation-provider-for.html' title='Writing a Custom Navigation Provider for MOSS'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s72-c/listview.JPG' height='72' width='72'/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6552340602490831603</id><published>2008-11-20T18:05:00.002-07:00</published><updated>2008-11-20T18:16:08.980-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stsadm'/><title type='text'>Stsadm access denied on Windows Server 2008</title><content type='html'>I recently ran into a situation where I encountered Access Denied errors when attempting to run stsadm on a dev Windows Server 2008 Web Edition. I checked to see if the user account I was using was a local administrator on the server and it was.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I looked around some more and I was not sure what was causing the problem. Then my friend suggested that we look into the User Account Control settings and those were enabled to help "protect" the server. Turning those off allowed me to run stsadm from the command line.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The User Account Control (UAC) is found under Control Panel --&gt; User Accounts --&gt; Turn User Account Control on or off.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6552340602490831603?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6552340602490831603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6552340602490831603' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6552340602490831603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6552340602490831603'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/11/stsadm-access-denied-on-windows-server.html' title='Stsadm access denied on Windows Server 2008'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3523857560438310994</id><published>2008-11-20T13:39:00.003-07:00</published><updated>2008-11-20T13:52:50.329-07:00</updated><title type='text'>Rocky Mountain User Group Presentation</title><content type='html'>As promised, here are the files from my presentation on the new release of the SharePoint PNP guidance on Tuesday night. Thank you all for coming, all the references should be in these files. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have any questions, please give me a shout.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://cid-e676339795c14e30.skydrive.live.com/self.aspx/RM%20SP%20User%20Group%20Files/RMSPUG%20P|_P%20Presentation.pptx"&gt;SharePoint PNP Guidance Presentation&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3523857560438310994?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3523857560438310994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3523857560438310994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3523857560438310994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3523857560438310994'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/11/rocky-mountain-user-group-presentation.html' title='Rocky Mountain User Group Presentation'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-773572971245295178</id><published>2008-11-11T08:12:00.002-07:00</published><updated>2008-11-11T08:23:36.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PnP'/><title type='text'>SharePoint PNP Guidance is Live</title><content type='html'>The SharePoint guidance which focuses on WSS went live last week. This guidance provides architects and developers best practices on how to:&lt;br /&gt;&lt;br /&gt;-- Make architectural decisions about feature factoring, packaging, and the appropriate usage of design patterns.&lt;br /&gt;-- Determine design tradeoffs for common decisions many developers encounter, such as when to use SharePoint lists or a database to store information.&lt;br /&gt;-- Design for testability, create &lt;a class="class" href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx?SelectedNavItem=Posts&amp;amp;sectionid=7887&amp;amp;postid=8935888" mce_href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx?SelectedNavItem=Posts&amp;amp;sectionid=7887&amp;amp;postid=8935888"&gt;unit tests&lt;/a&gt;, and run continuous integration.&lt;br /&gt;-- Set up different environments including the development, build, test, staging, and production environments.&lt;br /&gt;-- Manage the application life cycle through development, test, deployment, and upgrading.&lt;br /&gt;&lt;br /&gt;This is really useful and I have been using it on a recent SharePoint extranet project I am doing. Be sure to take a look. You can find more information about it on Blaine's blog post &lt;a href="http://blogs.msdn.com/blaine/archive/2008/11/05/sharepoint-guidance-is-live.aspx"&gt;here&lt;/a&gt;. You can also check out the content on MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/dd203468.aspx"&gt;here&lt;/a&gt;. I will be presenting a session on this at the Rocky Mountain user group next week with John Daniels who was very involved in this project, so anyone in the area please plan on attending to get more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-773572971245295178?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/773572971245295178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=773572971245295178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/773572971245295178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/773572971245295178'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/11/sharepoint-pnp-guidance-is-live.html' title='SharePoint PNP Guidance is Live'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2922149588770109238</id><published>2008-10-15T16:21:00.003-06:00</published><updated>2008-10-15T16:30:28.373-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VPC 2007'/><title type='text'>Install OS on new Virtual Machine in VPC 2007</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Issue&lt;/span&gt;: Attaching an OS to a new Virtual Machine in VPC 2007&lt;br /&gt;&lt;br /&gt;Sometimes you come across an issue when you are building a new Virtual Machine in VPC 2007 where you go to the CD tab to attach an ISO image for an OS and the VPC console just sits there waiting and does not start the install.&lt;br /&gt;&lt;br /&gt;The way to get around that is to get into the BIOS as the VPC is starting up by hitting the [Del] key, then go in and change the boot order to load from a CD-ROM first.&lt;br /&gt;&lt;br /&gt;This will start the OS install as soon as you attach an iso image to the VPC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2922149588770109238?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2922149588770109238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2922149588770109238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2922149588770109238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2922149588770109238'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/10/install-os-on-new-virtual-machine-in.html' title='Install OS on new Virtual Machine in VPC 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5574188175154263242</id><published>2008-10-06T18:00:00.019-06:00</published><updated>2008-11-24T21:05:20.795-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>MOSS Creating Custom News Page Layouts</title><content type='html'>Update: Corrected the HTML markup in the article.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recently I did a CMS 2002 to MOSS migration. The project had enough challenges to be a good learning experience. I will be posting snippets of that knowledge here for others to use. This article is posted by my guest writer and friend Mike Dockery.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This article refers to the need to create custom News page layouts in SharePoint 2007 and surface the news articles (or any other kind of information from a list using CBQ).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Create custom content types to attach new page layouts to be used for creating news articles on a Publishing site that will be served up with unique styles in the Content Query web part. For reference, see http://blogs.msdn.com/markarend/archive/2006/07/25/678445.aspx&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;1. Custom Content Type&lt;/span&gt;&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;From the site collection level site settings, click Site content types.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Browse the gallery and check that no custom content types happen to already be created under Page Layout Content Types.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Click Create for this New Site Content Type.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For Name, call it Vanguard QTC News Article&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For Description, enter a variation of: This is a Content Type to create news articles for Quote to Cash that will be rolled up into Vanguard news aggregators.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For its parent type select Article Page.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Select parent content type from the Page Layout Content Types&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Put this into the IHS Content group. If this is the first member of the group, then you will have to make a New group with this name.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Click OK.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Recreate the different content types as needed.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;2. Custom Page Layouts&lt;/span&gt;&lt;br /&gt;Using SharePoint Designer, open the site collection, then open the MasterPageGallery (in the _catalogs folder). Copy one or more layout files and rename the copies as in the following sample:&lt;br /&gt;&lt;br /&gt;Existing layout file Copied layout file&lt;br /&gt;ArticleLeft.aspx IHSArticle.aspx&lt;br /&gt;&lt;br /&gt;Associate with Custom Content Type&lt;br /&gt;After copying the custom layouts, associate the custom content type with each one. From the top-level Site Settings, click Master Page and Page Layout link under Galleries, and you should see the new custom layouts that were added. Edit the properties of each one to set the associated content type; select the custom type that you created.&lt;br /&gt;&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Content Type should be set to Page Layout&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Name will be the filename as copied in the previous step.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;The Title property is the string that will appear on the page layout when a user edits the page to create or modify news. For example: IHS news article page with optional image at left.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;The Description property is the string that appears when people are choosing the format for their news article. For example: This is an approved layout for IHS news articles.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;The Associated Content Type property should be set to the custom content type that you created which will allow the news aggregator (CQWP) to find this article quickly: IHS Content&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For Content Type Name, select the new site content type: IHS News Article&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Click OK.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Check in and publish a major version.&lt;br /&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Approve the page.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;3. Customize the Page Layout&lt;/span&gt;&lt;br /&gt;At this point, you don’t have to do any further customization in order for the news aggregation scenario to work. But ...&lt;br /&gt;&lt;br /&gt;Add a Description Control&lt;br /&gt;The Content Query web part that is used as a news aggregator has several different viewing formats available. Several of these show the Description property of the news article page. Unfortunately, there is not a control to enter the description on the page layout; to modify this out-of-box you have to edit the properties from the page library view. But we can easily add a control to the page layout to provide an input field for the description property, and this makes it much more useful for people writing news articles to show an abstract for the article.&lt;br /&gt;&lt;br /&gt;The new ASPX page should still be checked out. Open the file in SharePoint Designer. Edit each of the copied layout files (if more than one) and add two items in Code view: a NoteField control for the Description field, and an EditModePanel to show instructions for the Description field.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Locate &lt;[Start div tag] class="pageContent"&gt;. Just above this before the &lt;[End table tag]&gt;, insert these controls into a new row in the table containing the date and byline. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td align="right" valign="middle"&amp;gt;&lt;br /&gt;&amp;lt;PublishingWebControls:editmodepanel runat="server" id="editmodepanel2"&amp;gt;&lt;br /&gt;&amp;lt;div class="editModePanel" width=40% align="right"&amp;gt;&lt;br /&gt;&amp;lt;!-- Should be description text in resource string --&amp;gt;&lt;br /&gt;Description--›&amp;lt;BR/&amp;gt;is shown by news aggregators (Content Query Web Parts)&lt;br /&gt;with this abstract.&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/PublishingWebControls:editmodepanel&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width="100%" class="byLine"&amp;gt;&lt;br /&gt;&amp;lt;SharePointWebControls:NoteField FieldName="Description" runat="server"/&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Save the custom article page. Close SPD. Back through the interface, check the file in.&lt;/div&gt;&lt;div&gt;At this point, you are ready to create new pages with this layout.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Create a new page with this layout&lt;/div&gt;&lt;div&gt;This step is an example, it is not necessary to create the masters. Go to a site in the hierarchy of the portal that has the Publishing feature activated. By default, the Corporate Intranet Site and the Team Publishing Site have this feature, but it is easy to activate for other sites as well. Through Site Settings &gt; Site features &gt; Office SharePoint Server Publishing, then click Activate.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Under Site Actions, click Create Page.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Enter the Title of the article.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Leave Description blank for now. &lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For URL Name, the system will automatically populate it with the article title. Change it and shorten it depending on the actual title. Remove special characters.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Select the new custom layout: IHS News Article&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For Page Layout, you must choose one of the following Content Types depending on the article and where you want it displayed in the roll up web parts:&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;IHS Colleague Announcements&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;IHS Engineering News&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;IHS Leadership Team Messages&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;IHS News Article&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Click Create.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;The new article will be in edit mode. &lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;The Description section is important because this is what will be the short abstract shown within the Content Query Web Part. Insert meaningful text that summarizes the article. This must not exceed 255 characters.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Enter the Article Date and Byline.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;In the Page Content section -- the primary content -- click Edit Content or the "Click here to add new content" link. Insert the text or else use the rich text editor to format the article.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Rollup Image will output in the Content Query Web Part as a little 50 pixel square image next to the description/abstract. Ensure the image is small and legible.&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Click Publish to make the article available. If you need to edit the existing article, open the article, click Edit Page. Click Publish when finished.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;4. CQWP Style Output Examples&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;IHSwwitTwoColumn&lt;/div&gt;&lt;div&gt;Title linked in blue and 'read more' in orange.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq2wu66iYI/AAAAAAAAAE4/DehJr8NE5A0/s1600-h/image001.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254212863626217858" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq2wu66iYI/AAAAAAAAAE4/DehJr8NE5A0/s400/image001.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;IHScomSingleCreated&lt;/div&gt;&lt;div&gt;Full date, Title and 'more' linked in blue&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOq2w1h8NsI/AAAAAAAAAFA/blneacZ_RXU/s1600-h/image003.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254212865400518338" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOq2w1h8NsI/AAAAAAAAAFA/blneacZ_RXU/s400/image003.png" border="0" /&gt;&lt;/a&gt; &lt;div&gt;IHSNewsTwoColumn&lt;/div&gt;&lt;div&gt;Date, Title linked in black, arrows linked in blue, and right line between 2 articles.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3AU-3SqI/AAAAAAAAAFI/t1H2yA2NmFU/s1600-h/image005.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254213131541367458" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3AU-3SqI/AAAAAAAAAFI/t1H2yA2NmFU/s400/image005.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;NewsTwoColumnOrange &lt;/div&gt;&lt;div&gt;Full date in small text, Title linked in blue, 'more' linked in orange, and right line between 2 articles.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3BBi08RI/AAAAAAAAAFQ/Wq76Tco0reE/s1600-h/image008.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254213143503368466" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3BBi08RI/AAAAAAAAAFQ/Wq76Tco0reE/s400/image008.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;5. Customizing the ItemStyle.xsl for CQWP&lt;/span&gt;&lt;br /&gt;From the top site of the site collection, browse All Site Content or Content and Structure. Open the Style Library. Get into the XSL Styles Sheets folder.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3BbWLG5I/AAAAAAAAAFY/JW1vAElWwSI/s1600-h/image009.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254213150429617042" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq3BbWLG5I/AAAAAAAAAFY/JW1vAElWwSI/s400/image009.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Click the context menu for ItemStyle to Send To and choose Download a copy and save it to your desktop. Please make a backup of the file right away! Versioning is on by default in the Style Library but it’s sometimes easier to quickly upload the original file if things go awry in the XSL editing (don’t worry, you’ll error out at some point!).&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;A great reference is found in “Customizing the Content Query Web Part XSL” (http://www.microsoft.com/belux/msdn/nl/community/columns/stevenvandecraen/contentquerywebpart.mspx) on MSDN.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;1.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Open ItemStyle.xsl in any text editor or SPD. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;2.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;At the top alongside the other attributes, add the ddwrt namespace which will handle using dates. &lt;/div&gt;&lt;div&gt;xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;3.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Scroll down in the file and copy any existing &lt;?xml:namespace prefix = xsl /&gt;&lt;xsl:template&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;4.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Begin to edit the copied template by first changing the name and match attributes to be unique. The name will be selectable in the Item Style section when editing the CQWP.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:template name="MyCustomArticle" mode="itemstyle" match="Row[@Style='MyCustomArticle']"&gt;&lt;/xsl:template&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;5.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Add a Created variable that will display that date in the web part for each article. This is using the internal column name. How do find out how to get the internal column names? See Heather Solomon’s blog (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx) and this MSDN Forum (http://forums.msdn.microsoft.com/en-US/sharepointcustomization/thread/6328a12c-6c15-4c98-a997-e5e7104706c3/) for further details. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:variable name="Created"&gt;&lt;/xsl:variable&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:value-of select="ddwrt:FormatDateTime(string(@Created),1033,'MM/dd/yyyy')"&gt;&lt;/xsl:value-of&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;1033 refers to English. (1031 German, 1036 French,1040 Italian, 1034 Spanish, 1049 Russian, 1043 Dutch)&lt;/div&gt;&lt;div&gt;•&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;MM/dd/yyyy is an example of the output of the date format. Some options:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;MMM dd, yyyy -- Oct 11, 2008&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;MMMM dd, yyyy -- October 11, 2008&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;MM/dd/yyyy -- 10/11/2008.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;dd/MM/yyyy -- 11/10/2008&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;6.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;In our example, we will output the Date above the Title. The title will be linked to the published article page. There will be a brief article synopsis that pulls from the article's Description. Finally, a "more" link that also links to the full article.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;The actual output will be contained within the &lt;div class="”link-item”"&gt;near the bottom of your copied template. Make your edits within this Div.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;7.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Wrap the Created variable in its own Div right after the being Div for "link-item". This will be the article date. (Leave the CallPresenceStatusIconTemplate).&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="link-item"&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"&gt;&lt;/xsl:call-template&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="MARGIN: 15px 0px 0px; FONT: 12px helvetica,arial,tahoma,sans-serif; COLOR: #003399"&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:value-of select="$Created"&gt;&lt;/xsl:value-of&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Adjust the font styles, colors, alignment and other CSS attributes using HTML tags. Be careful in this section and test after small changes to be sure you don’t crash the page. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;8.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;For the DisplayTitle variable, surround it with the link tag and add in the style attribute to color it any way you choose:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a title="{@LinkToolTip}" style="FONT: bold 12px helvetica,arial,tahoma,sans-serif; COLOR: #003399" href="http://www.blogger.com/%7B$SafeLinkUrl%7D"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a title="{@LinkToolTip}" style="FONT: bold 12px helvetica,arial,tahoma,sans-serif; COLOR: #003399" href="http://www.blogger.com/%7B$SafeLinkUrl%7D"&gt;&lt;div&gt;&lt;xsl:value-of select="$DisplayTitle"&gt;&lt;/xsl:value-of&gt;&lt;/div&gt;&lt;/a&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;9.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;The Description will display on a new line, followed by the "more" link and lastly, the end Div tag for the "link-item" class.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="description" style="FONT: 12px helvetica,arial,tahoma,sans-serif; COLOR: #000000"&gt;&lt;/div&gt;&lt;div&gt;&lt;xsl:value-of select="@Description"&gt;&lt;/xsl:value-of&gt;&lt;/div&gt;&lt;div&gt;&lt;a title="{@LinkToolTip}" style="PADDING-LEFT: 5px; FONT: 12px helvetica,arial,tahoma,sans-serif; COLOR: #003399" href="http://www.blogger.com/%7B$SafeLinkUrl%7D"&gt;... more&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;10.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;To output the "more" link in different languages, simply get the translation for the word(s) you need, be it "read more", "full article" or whatever. If the translation has special characters you will need to use the ASCII representation. The easiest method is to paste in the translated text into Microsoft Word, save the page as an HTML page then open up that page in a text editor to get the ASCII code. For "more", the translations are listed below in the following snippets as they should appear in the XSL file:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;German&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... mehr&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;French&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... plus&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Italian&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... più&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Spanish&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... más&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Russian&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... подробнее&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Dutch&lt;/div&gt;&lt;div&gt;sans-serif;color:#003399;"&gt;... meer&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;11.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Save the file and upload it back to the Style Library, add in comments and check in the file.&lt;/div&gt;&lt;div&gt;12.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Open up the site where you placed the imported Content Query Web Part. &lt;/div&gt;&lt;div&gt;13.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;From the Site Actions menu, click Edit Page.&lt;/div&gt;&lt;div&gt;14.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Modify the CQWP and expand Presentation. &lt;/div&gt;&lt;div&gt;15.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;In the Styles section, leave the Group style as Default and for Item style select your new template name from the XSL file.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r8BZcH_g0j0/SOqrXR4cnJI/AAAAAAAAAEo/AVVuZUTFwD0/s1600-h/image012.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254200331706604690" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/SOqrXR4cnJI/AAAAAAAAAEo/AVVuZUTFwD0/s400/image012.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;16.&lt;span class="Apple-tab-span" style="WHITE-SPACE: pre"&gt; &lt;/span&gt;Exit Edit mode and view the final result:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOunByjY9pI/AAAAAAAAAFg/IZUOfNKs-gw/s1600-h/NewsSamples.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254477039449732754" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOunByjY9pI/AAAAAAAAAFg/IZUOfNKs-gw/s400/NewsSamples.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are all the styles used for this blog post.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;&amp;lt;xsl:template name="IHSwwitTwoColumn" match="Row[@Style='IHSwwitTwoColumn']" mode="itemstyle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="Created"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="ddwrt:FormatDateTime(string(@Created), 1033, 'MMMM dd, yyyy')" /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeImageUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeStaticUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'ImageUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeLinkUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeLink"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="DisplayTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="Title" select="@Title"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="LinkTarget"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="@OpenInNewWindow = 'True'" &amp;gt;_blank&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;div id="linkitem" class="item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="string-length($SafeImageUrl) != 0"&amp;gt;&lt;br /&gt;&amp;lt;div class="image-area-left"&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;img border="0" width="50" src="{$SafeImageUrl}" alt="{@ImageUrlAltText}"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;div class="link-item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="font:bold 12px arial,helvetica,tahoma,sans-serif;color:#003399;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$DisplayTitle"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;div class="description" style="font:normal 12px arial,helvetica,tahoma,sans-serif;color:#000000;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="@Description"/&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="padding-left:5px;font:normal 12px arial,helvetica,tahoma,sans-serif;color:#D27C26;"&amp;gt;... read more&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:template name="IHScomSingleCreated" match="Row[@Style='IHScomSingleCreated']" mode="itemstyle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="Created"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="ddwrt:FormatDateTime(string(@Created), 1033, 'MMMM dd, yyyy')" /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeImageUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeStaticUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'ImageUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeLinkUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeLink"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="DisplayTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="Title" select="@Title"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="LinkTarget"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="@OpenInNewWindow = 'True'" &amp;gt;_blank&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;div id="linkitem" class="item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="string-length($SafeImageUrl) != 0"&amp;gt;&lt;br /&gt;&amp;lt;div class="image-area-left"&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;img class="image-fixed-width" src="{$SafeImageUrl}" alt="{@ImageUrlAltText}"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;div class="link-item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/&amp;gt;&lt;br /&gt;&amp;lt;div style="margin:15px 0 0 0;font:normal 12px helvetica,arial,tahoma,sans-serif;color:#003399;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$Created"/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="font:bold 12px helvetica,arial,tahoma,sans-serif;color:#003399;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$DisplayTitle"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;div class="description" style="font:normal 12px helvetica,arial,tahoma,sans-serif;color:#000000;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="@Description"/&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="padding-left:5px;font:normal 12px helvetica,arial,tahoma,sans-serif;color:#003399;"&amp;gt;... more&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:template name="IHSNewsTwoColumn" match="Row[@Style='IHSNewsTwoColumn']" mode="itemstyle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:param name="CurPos" /&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="Created"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="ddwrt:FormatDateTime(string(@Created) ,1033 ,'MM.dd.yyyy')" /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeLinkUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeLink"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeImageUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeStaticUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'ImageUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="DisplayTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="Title" select="@Title"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="LinkTarget"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="@OpenInNewWindow = 'True'" &amp;gt;_blank&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;div style="padding:0 10px 3px 20px;width:100%;border-left:1px solid #ffffff !important;border-left:1px solid #cccccc;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="$CurPos mod 2 &amp;amp;gt; 0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:attribute name="style"&amp;gt;&lt;br /&gt;float:left;padding:0 10px 3px 3px;width:50%;&lt;br /&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:if test="string-length($SafeImageUrl) != 0"&amp;gt;&lt;br /&gt;&amp;lt;div class="image-area-left"&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;img class="image" src="{$SafeImageUrl}" alt="{@ImageUrlAltText}" /&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div class="link-item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/&amp;gt;&lt;br /&gt;&amp;lt;span style="font:bold 12px arial,helvetica,tahoma,verdana,sans-serif;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$Created"/&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank" title="{@LinkToolTip}" style="font:bold 12px arial,helvetica,tahoma,verdana,sans-serif;color:#000000;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$DisplayTitle"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;div class="description" style="font:normal 12px arial,helvetica;color:#000000;padding-right:45px !important;padding-right:0;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="substring(@Description, 0, 235)" /&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank" title="{@LinkToolTip}" style="padding-left:5px;font:normal 14px arial,helvetica,tahoma,verdana,sans-serif;color:#3190D0;"&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:template name="NewsTwoColumnOrange" match="Row[@Style='NewsTwoColumnOrange']" mode="itemstyle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:param name="CurPos" /&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="Created"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="ddwrt:FormatDateTime(string(@Created), 1033, 'MMMM dd, yyyy')" /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeLinkUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeLink"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="SafeImageUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetSafeStaticUrl"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'ImageUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="DisplayTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.GetTitle"&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="Title" select="@Title"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:with-param name="UrlColumnName" select="'LinkUrl'"/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="LinkTarget"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="@OpenInNewWindow = 'True'" &amp;gt;_blank&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;lt;div style="padding:0 10px 3px 20px;width:100%;border-left:1px solid #ffffff !important;border-left:1px solid #cccccc;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:if test="$CurPos mod 2 &amp;amp;gt; 0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:attribute name="style"&amp;gt;&lt;br /&gt;float:left;padding:0 10px 3px 3px;width:50%;&lt;br /&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:if test="string-length($SafeImageUrl) != 0"&amp;gt;&lt;br /&gt;&amp;lt;div class="image-area-left"&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;img class="image" src="{$SafeImageUrl}" alt="{@ImageUrlAltText}" /&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div class="link-item"&amp;gt;&lt;br /&gt;&amp;lt;xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/&amp;gt;&lt;br /&gt;&amp;lt;div style="margin:15px 0 0 0;font:normal 12px helvetica,arial,tahoma,sans-serif;color:#555;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$Created"/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="font:bold 12px helvetica,arial,tahoma,sans-serif;color:#003399;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$DisplayTitle"/&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;div class="description" style="font:normal 12px arial,helvetica;color:#000000;padding-right:45px !important;padding-right:0;"&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="@Description"/&amp;gt;&lt;br /&gt;&amp;lt;a href="{$SafeLinkUrl}" title="{@LinkToolTip}" style="padding-left:5px;font:normal 12px helvetica,arial,tahoma,sans-serif;color:#D27C26;"&amp;gt;... more&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/xsl:template&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5574188175154263242?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5574188175154263242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5574188175154263242' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5574188175154263242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5574188175154263242'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/10/moss-creating-custom-news-page-layouts.html' title='MOSS Creating Custom News Page Layouts'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_r8BZcH_g0j0/SOq2wu66iYI/AAAAAAAAAE4/DehJr8NE5A0/s72-c/image001.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1323000425166525449</id><published>2008-10-06T17:54:00.005-06:00</published><updated>2008-10-06T21:16:22.572-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Branding'/><title type='text'>Branding SharePoint</title><content type='html'>Hello All, &lt;div&gt;I just wanted to reinforce with something I recently worked on - how easy it is to rebrand SharePoint site collections or even just individual sites themselves.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a picture of the new IT site of the intranet as part of a communication initiative I was leading in April/May at my last job. The styles were done through an override css, but another thing to notice is that paying attention on the actual page content helps as well.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Update: Anybody interested in branding, please make sure to check out my original &lt;a href="http://faraz-khan.blogspot.com/2007/11/branding-intranets-with-sharepoint-moss.html"&gt;post&lt;/a&gt; where I explain the details around this branding.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOqmRaKGgcI/AAAAAAAAADw/2GFZVdwsQ2I/s1600-h/ITPublic.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254194733290783170" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOqmRaKGgcI/AAAAAAAAADw/2GFZVdwsQ2I/s400/ITPublic.png" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1323000425166525449?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1323000425166525449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1323000425166525449' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1323000425166525449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1323000425166525449'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/10/branding-sharepoint.html' title='Branding SharePoint'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r8BZcH_g0j0/SOqmRaKGgcI/AAAAAAAAADw/2GFZVdwsQ2I/s72-c/ITPublic.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1422848784398435228</id><published>2008-09-28T17:54:00.011-06:00</published><updated>2008-09-28T18:23:20.407-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Search'/><title type='text'>Creating SharePoint 2007 Search Dashboard</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;PURPOSE:&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;A few months ago, we were given the task of determining the success our users were having when trying to find documents and web pages through our intranet implementation of Microsoft Office SharePoint Services (MOSS) 2007.&lt;span style="mso-spacerun:yes"&gt;  We&lt;/span&gt; first looked at built-in solutions offered by MOSS; but, all of their analytics followed the ‘what-you-see-is-what-you-get’ paradigm, and none gave a straight-forward answer to the questions we needed answers to.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;This led us to pursue a custom analytics solution, and after much data probing and testing we ended up leveraging SQL Server Analysis Services (SSAS), ProClarity and ProClarity Dashboard to achieve our goal.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;METHOD:&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Step 1: Finding the Data&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt; &lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;MOSS stores data all over the place in a variety of different formats, so sorting out where the information is that we want to use can take quite a bit of time.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Luckily our solution requires no file-parsing and no 3&lt;sup&gt;rd&lt;/sup&gt; party applications; the entire search data is stored in two separate MOSS databases.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The databases should be your shared service provider (SSP) content database and your MOSS content database.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Our setup used the following two databases, as pictured below:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAbeqU78EI/AAAAAAAAADA/0KqZHPYqzNU/s1600-h/image001.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAbeqU78EI/AAAAAAAAADA/0KqZHPYqzNU/s400/image001.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5251227379086127170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;The database names might differ, but you’re looking for the tables highlighted above. Once you’ve found those, you’re set.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Step 2: Establishing the Data Source View&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;How MOSS actually uses these tables in any manner other than how I did is a mystery to me, (although some of you more fluent in database design might understand them) but after a couple days of table analysis, I determined how the tables are linked with one another well enough to retrieve the information I desired.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;All of the search information is inside the tables marked with the prefix ‘MSSQLog,’ so if you wish to examine the data on your own, that’s where you’ll find it.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Creating an OLAP cube for use in ProClarity is a powerful analysis technique; so, I structured the data into a typical data warehouse fact-dimension relationship, pictured below:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r8BZcH_g0j0/SOAcVhIVqVI/AAAAAAAAADI/N3IughDQFq4/s1600-h/image002.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/SOAcVhIVqVI/AAAAAAAAADI/N3IughDQFq4/s400/image002.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5251228321510173010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;The table joins above are pretty straightforward (id to id) except for the join between the contextual scope table and the MSSQLog fact table. &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;This join is more complicated is due to the fact that we’re using the Webs table, and by now you might be wondering why we’re even using the Webs table in the first place.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The Webs table provides a listing of every site in your MOSS site hierarchy, providing for each site: a reference to its parent site, the site name, and the URL where it is located on your server.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;This is extremely useful because all of your search statistics for each site would be consolidated into one all-encompassing ‘main site’, leaving out individual site statistics.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If you are looking for that overall consolidation, OLAP cubes allow you to aggregate all the sites together anyway. So really we’re just gaining extra functionality by adding this table in.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The join to the fact table isn’t exactly straightforward because the Webs table actually resides in a different database (as you should know from step 1).&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Therefore, it’s not going to have any key columns or really anything in common with the fact table except for one column, URL.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The URL listed in the fact table is the URL where the search was performed (not what link the person clicked on, although that information is stored in another table), and since the URL listed in the Webs table is the URL of the site, the two should match up.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;A little bit of string parsing needed to be done on the URL field in the fact table as it had the “http://” prefix (ex. http://MOSSsite.com/engineering/softwareDev/) where as the URL field in the Webs table was just the folder hierarchy (ex. engineering/softwareDev/).&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Step 3: Building the Cube&lt;/span&gt;&lt;/i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;With the data source view created, the next step is to create the OLAP cube to browse data quickly.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;It’s a fairly basic cube. The only thing I really changed from the default options was that I added in a pre-built time dimension. I thought it would make sense to see data even for days when there weren’t any searches (otherwise if there weren’t any searches for a weekend, for example, the graphical representation of the data would just skip over it and not show zero for the number of searches for those days). &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;Also, in the Site Dimension, I had to add a parent-child recursive hierarchy built on the ‘Parent Web Id’ attribute (as pictured below).&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You’ll need to add that in to build your site hierarchy, otherwise the dimension will just be a flat list of every site in your MOSS implementation. &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;Other than those two minor changes here are the measures, attributes, and dimensions I ended up with in my cube (your implementation may vary).&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAczwuOUyI/AAAAAAAAADQ/IwlADtUd4NE/s1600-h/image004.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAczwuOUyI/AAAAAAAAADQ/IwlADtUd4NE/s400/image004.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5251228841091683106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;To give a few examples of what we can do with all this data: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul style="margin-top:0in" type="disc"&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;The      number of queries that have occurred&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;What      was queried&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;What      site the search happened at &lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;How      long it took before the user clicked on a result&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;Whether      it was a best bet that was clicked&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;The      average time to click for a given site&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;The      number of results the search returned&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list .5in"&gt;The      time frame on a given search.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now all of this data is available in the SSAS cube browser, but unless your end user is familiar with how pivot tables and OLAP cubes work, you’ll probably want to wrap it in a more visually friendly interface, which brings us to ProClarity.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Step 4: ProClarity Integration&lt;/span&gt;&lt;/i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The next step is to publish your cube to your SSAS server and find it in ProClarity Professional.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Now that we have all this search information, how do we answer that initial question, search success?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The actual term, ‘search success’ is kind of up to the interpretation of whomever is designing the tool, but I decided that in order to show search success you’d need more than one graph.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;In fact, I ended up designing about 18 graphs in ProClarity, although not all were used:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOAdTlQkMSI/AAAAAAAAADY/FopV4e7KjOo/s1600-h/image005.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/SOAdTlQkMSI/AAAAAAAAADY/FopV4e7KjOo/s400/image005.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5251229387770310946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;You can see that you can get some pretty useful information, such as top 10 queries without best bets. Perhaps even more useful might be the top 10 queries with worst results that don’t have best bets.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;After you’re done playing around with your graphs you could stop there and just point your users to the ProClarity graphs (presumably using ProClarity Standard), but for this solution we wanted to surface the graphs through MOSS.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;We also wanted multiple graphs to show up on a single page as viewing 18 graphs individually might become tedious, so ProClarity Dashboard became the platform to view all this data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Step 5: ProClarity Dashboard and MOSS Integration&lt;/span&gt;&lt;/i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Creating a dashboard is pretty straightforward, and it’s very much up to you how you want to organize your information.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;For our solution, we organized the dashboard into four separate tabs: Site Search Analysis (for each individual site), Search Analysis (general statistics), Best Bet Analysis (for improving search efficiency), and Summary (general consolidation of the other three tabs).&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You can see the end result looks very visually appealing:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAd47Oad_I/AAAAAAAAADg/iRrFTy7_flk/s1600-h/image006.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAd47Oad_I/AAAAAAAAADg/iRrFTy7_flk/s400/image006.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5251230029322024946" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;Dashboard makes the search analytics data easy to understand and very easy to use&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The last step is to integrate this into MOSS.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Because dashboard is just a simple webpage, we can use a page viewer webpart, and just refer to the dashboard URL.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The end result will end up looking similar to this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_r8BZcH_g0j0/SOAeIY3vsII/AAAAAAAAADo/wfkmpvGKRw4/s1600-h/image007.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_r8BZcH_g0j0/SOAeIY3vsII/AAAAAAAAADo/wfkmpvGKRw4/s400/image007.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5251230294978048130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;Hopefully this has served as a good, general outline to how you can create your own custom MOSS search analytics solution using SSAS, ProClarity and ProClarity Dashboard!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1422848784398435228?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1422848784398435228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1422848784398435228' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1422848784398435228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1422848784398435228'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/09/creating-sharepoint-2007-search.html' title='Creating SharePoint 2007 Search Dashboard'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r8BZcH_g0j0/SOAbeqU78EI/AAAAAAAAADA/0KqZHPYqzNU/s72-c/image001.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3884647752302246204</id><published>2008-09-28T17:41:00.005-06:00</published><updated>2008-09-28T17:46:38.132-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Branding'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>MOSS Intranet - TheSource Wins Awards</title><content type='html'>&lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;The MOSS intranet that I helped create last year and that is documented in &lt;a href="http://faraz-khan.blogspot.com/2007/11/branding-intranets-with-sharepoint-moss.html"&gt;this&lt;/a&gt; blog post won awards recently. Woo-Hoo.&lt;/p&gt;&lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;b&gt;&lt;i&gt;TheSource&lt;/i&gt;&lt;/b&gt;&lt;i&gt; was honored by the &lt;st1:state st="on"&gt;Colorado&lt;/st1:state&gt; Chapter of the International Association of Business Communicators (IABC) on June 12 at the annual Bronze Quill Awards banquet in &lt;st1:city st="on"&gt;&lt;st1:place st="on"&gt;Denver&lt;/st1:place&gt;&lt;/st1:city&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;i&gt;&lt;span&gt;IABC is a professional association that provides ongoing learning, resources and research to a professional network of more than 15,000 business communication professionals in over 60 countries.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;i&gt;&lt;span&gt;Based on criteria that evaluated the program objectives and the results of implementing the strategy, &lt;b&gt;TheSource&lt;/b&gt; was awarded an Award of Excellence in the Company Intranet category.  The entries were judged by communications professionals in &lt;st1:city st="on"&gt;Seattle&lt;/st1:city&gt; and &lt;st1:city st="on"&gt;&lt;st1:place st="on"&gt;Minneapolis&lt;/st1:place&gt;&lt;/st1:city&gt;. &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;i&gt;&lt;span&gt;The big win of the night came when &lt;b&gt;TheSource&lt;/b&gt; was also awarded the coveted Best in Show award.  The Best in Show is chosen from the top entries in each of the categories. &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;i&gt;&lt;span&gt;The judges praised &lt;b&gt;TheSource&lt;/b&gt; for being a “robust, content-rich communications tool,” and they appreciated the team approach that was used to identify need and strategy and decide on objectives.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"&gt;&lt;i&gt;&lt;span&gt;Congratulations to everyone on the team who helped create the award-winning &lt;b&gt;TheSource&lt;/b&gt;! &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3884647752302246204?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3884647752302246204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3884647752302246204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3884647752302246204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3884647752302246204'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/09/moss-intranet-thesource-wins-awards.html' title='MOSS Intranet - TheSource Wins Awards'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-534633413462017838</id><published>2008-09-28T17:20:00.002-06:00</published><updated>2008-09-28T17:33:11.425-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>MOSS Error: The path specified cannot be used at this time</title><content type='html'>Sometimes when doing application management tasks, you run into an error where the page stops creating your Web Application or other management task and instead throws this error:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Error: The path specified cannot be used at this time.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Upon digging a little deeper to ascertain the cause of the problem, I noticed that these 3 errors were being thrown on a consistent basis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Event ID: 6398.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Event ID: 7076.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Event ID: 6482.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I found &lt;a href="http://code.msdn.microsoft.com/KB923028"&gt;this&lt;/a&gt; KB that related to this error, but I didn't want to install it on the server directly. So here are the things I did to resolve this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Installed the latest critical updates from Windows Update on the servers.&lt;/div&gt;&lt;div&gt;2. Re-started the servers in the farm for those to take effect.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This fixed the problem temporarily. It came back a couple of days later so I restarted the SharePoint timer service. Since then, the error has not come back.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-534633413462017838?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/534633413462017838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=534633413462017838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/534633413462017838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/534633413462017838'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/09/moss-error-path-specified-cannot-be.html' title='MOSS Error: The path specified cannot be used at this time'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6757435069072978222</id><published>2008-05-12T14:32:00.000-06:00</published><updated>2008-05-12T14:33:16.033-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS URL Rewriting'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS to MOSS migration'/><title type='text'>A Comprehensive Guide to MOSS URL Rewriting</title><content type='html'>&lt;span style="color:#006600;"&gt;&lt;strong&gt;Challenge&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Here is the scenario. MOSS is a great platform to work on but there are some things that are not ideal from a customer facing .com site. I will compare and contrast 2 features in CMS with those in MOSS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) The first example would be the term 'Pages' in the URL. Since pages in a publishing site are stored in the 'Pages' library by default, that term appears as part of the external URL. To some eBusiness users, that is not acceptable because 1) the term doesnt mean anything relevant to a spider and 2) it probably hinders the URL rank.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) CMS 2002 allowed subdomain mapping to top level channels. That means you could have as many subdomains as you wanted on one IIS website which is a best practice for both CMS and MOSS from a performance standpoint (less websites on server = GOOD). However in MOSS 2007 there is no such direct mapping. So the options are a) have separate MOSS web apps for all the subdomains (OOPS) or b) do some fancy URL rewriting. Needless to say, we went with the URL rewriting because we had over 25 subdomains that could increase with time and we did not want to go with that many MOSS web apps for the performance implications that might have.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So as part of the CMS to MOSS migration, we brought over all the subdomains (~20) into one site collection. The reason for this is that the subdomains are very closely tied together and the amount of data was not too large (15 GB). From a maintenance perspective, we can separate these subdomains into different site collections in the future should we decide to. We are also not using the variations feature in MOSS because we dont have exact content mirrors in all of our subdomains. We are also using content deployment to push content from the authoring to the production farm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So we had 2 significant challenges to overcome. One was to map many subdomains to second level sites in a site collection. The second one was to allow for .htm extensions and get rid of 'Pages' in the URL - for reasons explained below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#006600;"&gt;Solution&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;At this stage, we could go with ISA server/firewall mechanism to meet our URL rewriting needs. The one problem was that we didnt have enough time to test and implement an ISA server solution, not considering the cost of the ISA server itself. The other solution is to use a URL rewriting mechanism along the lines of Apache mod-rewrite for IIS to translate our URLs on the fly. We went with one such third party IIS rewrite solution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The IIS rewrite rules were setup on a honeypot empty IIS website which contains host header entries for all the sudomains we serve - the IIS redirect acts on them and instead does a reverse proxy to the real MOSS Web application and displays the data. There are additional rules to map the .js, .css, and other files that are loaded on every request. For eg, a request to &lt;a href="http://www.company.com/xyz.htm"&gt;www.company.com/xyz.htm&lt;/a&gt; gets translated internally to ext.company.com/www.company_com/xyz.htm and the content is served back without the link changing in the address bar of the browser - which is a function of the reverse proxy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The other need was that all our pages were surfaced as .htm in CMS and moving them to .aspx in MOSS would break hundreds of thousands of links, along with including 'Pages' as part of the URL. The EBusiness team also sincerely believed that having 'Pages' in the URL does nothing to help our SEO and probably hinders it. So this was deemed as a showstopper and we had to devise a solution for this challenge. The solution was to use the friendly URL feature offered by 'Rapid For SharePoint' - which is basically a HTTP module. This module takes out the pages/pagename.aspx and instead replaces it with pagename.htm (we can configure the extensions). So a request for auto.company.com/support/pages/default.aspx would instead be translated to auto.company.com/support/default.htm, which is acceptable to the&lt;br /&gt;eBusiness team and does not break the links. This module also changes links within the page content to point to filename.htm instead of pages/filename.aspx. We also used their XHTML filter which basically does a regular expression on a pattern and replace it with other text to change relative links to absolute ones in the html fields.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In MOSS, all requests to a site get translated to /pages/default.aspx as that is the default page in the pages library. For example, a request for auto.company.com/support will get translated to auto.company.com/support/pages/default.aspx. MOSS returns a 302 redirect along with the new link to the browser which stops the reverse proxy mechanism and instead changes the url in the browser address. For this I put in a rule in our IIS redirect to translate all requests to sites and subsites by adding the default page name to the request before the request ever reaches the MOSS Web application. This obviates the 302 redirect problem. So a request to &lt;a href="http://www.company.com/"&gt;http://www.company.com/&lt;/a&gt; is translated to &lt;a href="http://www.company.com/default.htm"&gt;www.company.com/default.htm&lt;/a&gt; and is then proxied to the MOSS Website.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There was also a requirement to serve MOSS page links containing .jsp extensions since CMS didn't really care about the extensions (you could request a page with .htm, .jsp or no extensions and it would be served) so there were some .jsp links that had to be served. I achieved this using an IIS mod rewrite rule.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#006600;"&gt;Considerations&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;1. Site page redirects in MOSS all respond with a HTTP 302 which will throw the reverse proxy mechanism off. Hence all the redirect pages will need to specify the final external (SEO friendly) link.&lt;br /&gt;&lt;br /&gt;2. All sites need an index page called index.htm, because all requests to sites will be translated to site/index.htm to avoid MOSS sending back a HTTP 302 (the name index is arbitrary, you could use default.htm or any other name). The index page can then be a redirect page to the destined page (with a fully qualified external link redirect link) if need be.&lt;br /&gt;&lt;br /&gt;3. XHTML filter needs (working for changing all relative links to complete. For eg. Changing "/auto.company.com to "&lt;a href="http://auto.company.com/"&gt;http://auto.company.com/&lt;/a&gt;). This was added for all subdomains.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;&lt;strong&gt;Long Term Strategy&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;The long term strategy should be to use ISA server to do the address translation to reduce the load on the MOSS Web Front End servers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6757435069072978222?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6757435069072978222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6757435069072978222' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6757435069072978222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6757435069072978222'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/05/comprehensive-guide-to-moss-url.html' title='A Comprehensive Guide to MOSS URL Rewriting'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3019312794715490002</id><published>2008-03-22T20:31:00.003-06:00</published><updated>2008-03-23T18:28:55.773-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DST and SP1'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS to MOSS migration'/><title type='text'>MOSS SP1 and Daylight Savings Time Patch Experiences</title><content type='html'>Recently during our CMS to MOSS upgrade we were having issues with the timer jobs not running on time because of the DST problems (we did not have the DST hotfixes or SP1 applied yet). Some of the problems it caused were:&lt;br /&gt;&lt;br /&gt;Content deployment jobs (even on the same server) were timing out - basically they would wait for an hour to run and then time out anyway.&lt;br /&gt;&lt;br /&gt;If you go ahead and create new web applications, it takes about an hour to actually provision these Web apps.&lt;br /&gt;&lt;br /&gt;Other timer jobs are affected too.&lt;br /&gt;&lt;br /&gt;There is a way to fool the timer job by changing the time on your server back one hour so it would actually think that it was time to run. However, the timer job would run in some cases and still not run in others (such as content deployment). We found a way to actually force these timer jobs to run by using the following command.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o execAdmSvcJobs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This command needs to be run on all Web servers in the farm.&lt;br /&gt;&lt;br /&gt;We could have now installed the DST patch or go down the SP1 route. We did not go the (WSS and MOSS) SP1 route because that hosed our test environment. Also WSS SP1 threw an error and did not install successfully on our staging environment, though the MOSS SP1 installed successfully in staging. This constituted a significant risk in our mind so we decided not to move forward with the SP1 install on production (Needless to say, we had to rebuild our stage and test farms because you cannot just roll back from the SP1 upgrade).&lt;br /&gt;&lt;br /&gt;So we decided to move forward with just the patch (for now) for fixing the timer jobs problem. This worked fine for our test and staging environments, which had minimal data because we had to rebuild them and did not have time to reattach all the content databases from production yet. On production however, the patch threw an error and about 5% of the content was missing - though the Web apps loaded fine. Interestingly enough, we migrated from SharePoint 2003 to MOSS 2007 last year and all the migrated content appeared to be there. The new sites that we had created on MOSS were missing however.&lt;br /&gt;&lt;br /&gt;So we decided to attach the backed up databases from the night before thinking that MOSS probably stored all the configuration for the patch in the DB - and going back one night would bring us back to the night before we applied the patch. Unfortunately upon attaching those databases the apps did not work and we got this error in the event log,&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;The schema version (3.0.149.0) of the database SharePoint_AdminContent_711c9d8b-17ed-404c-987a-708e0e059b12 on DBSERVERNAME is not consistent with the expected database schema version (3.0.151.0) on WEBSERVERNAME. Connections to this database from this server have been blocked to avoid data loss. Upgrade the web front end or the content database to ensure that these versions match.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At this point we had two options, since the server appeared to be hosed - we could rebuild the production server or restore the image backup of the entire server (bare metal restore) as defined in the SLA with our backup provider. Both alternatives were not rosy so we decided to tinker a little bit. So we looked around and found a blog that talked about this problem. Thanks to Adlai Maschiach's &lt;a href="http://blogs.microsoft.co.il/blogs/adlaim/archive/2007/10/26/the-schema-version-3-0-149-0-of-the-database-sps-content-db-on-moss.aspx"&gt;blog&lt;/a&gt; that helped us get past this glitch.&lt;br /&gt;&lt;br /&gt;TODO: Now ee will go back to the drawing board and find a way to upgrade the production farm again. I will post those experiences here shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3019312794715490002?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3019312794715490002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3019312794715490002' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3019312794715490002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3019312794715490002'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/03/moss-sp1-and-daylight-patch-experiences.html' title='MOSS SP1 and Daylight Savings Time Patch Experiences'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1787741830271947792</id><published>2008-02-09T16:21:00.000-07:00</published><updated>2008-02-09T16:30:28.596-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Accessing document hits'/><title type='text'>How to find your document hits on SharePoint 2007</title><content type='html'>We recently had a need to find out how documents were being accessed on our SharePoint 2007 intranet. This need was again tied back to the original intent of&lt;br /&gt;minimizing user clicks to important imformation. Hence we had to figure out the hit counts of all documents on our intranet and then organize the more accessed documents corporate wide on a page that would organize this information based on our classification and thus provide quick access to employees. &lt;br /&gt;&lt;br /&gt;SharePoint OOB does not provide you with these level of reports across all your site collections. My friend Travis wrote up a nifty little SQL script that would do the trick. Enjoy!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DECLARE @table TABLE(DocName varchar(4000), HitCount bigint)&lt;br /&gt;&lt;br /&gt;DECLARE @doc varchar(4000)&lt;br /&gt;DECLARE @hits bigint&lt;br /&gt;&lt;br /&gt;DECLARE c_docs CURSOR FOR&lt;br /&gt;  SELECT DISTINCT DocName &lt;br /&gt;  FROM [MOSS_SSP_DB_Name_Here].[dbo].[ANLSiteResourceHits]&lt;br /&gt;  WHERE ([DocName] NOT LIKE '%.aspx') and ([DocName] NOT LIKE '%.html') &lt;br /&gt;    and ([DocName] NOT LIKE '%.asp') and ([DocName] NOT LIKE '%.htm')&lt;br /&gt;    and ([DocName] NOT LIKE '%.xml') and ([DocName] NOT LIKE '%.xsd')&lt;br /&gt;    and ([DocName] NOT LIKE '%.one') and ([DocName] NOT LIKE '%.xsn')&lt;br /&gt;&lt;br /&gt;OPEN c_docs&lt;br /&gt;FETCH NEXT FROM c_docs INTO @doc &lt;br /&gt;&lt;br /&gt;WHILE (@@FETCH_STATUS = 0) &lt;br /&gt;BEGIN&lt;br /&gt;  SET @hits = (SELECT SUM([HitCount])&lt;br /&gt;    FROM [MOSS_SSP_DB_Name_Here].[dbo].[ANLSiteResourceHits]&lt;br /&gt;    WHERE ([DocName] = @doc))&lt;br /&gt;&lt;br /&gt;INSERT INTO @table VALUES (@doc, @hits)&lt;br /&gt;&lt;br /&gt;  Next_Row:&lt;br /&gt;    FETCH NEXT FROM c_docs INTO @doc&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM @table&lt;br /&gt;ORDER BY [HitCount] DESC&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1787741830271947792?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1787741830271947792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1787741830271947792' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1787741830271947792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1787741830271947792'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/02/how-to-find-your-document-hits-on.html' title='How to find your document hits on SharePoint 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8001735348440799544</id><published>2008-01-08T18:38:00.000-07:00</published><updated>2008-01-15T23:17:32.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Branding'/><title type='text'>SharePoint 2007 CSS friendly control adapters</title><content type='html'>ASP.NET 2.0 and MOSS 2007 provide great navigation controls, but the html that is emitted when those navigation controls are rendered is not the cleanest (for example, view the source of a MOSS page containing a menu and a treeview and you will see what I am talking about). The menu and treeview controls emit a bunch of &lt;strong&gt;table&lt;/strong&gt; tags, which is not a best practice. There is a desire to control the output of these controls to make your pages more css based. It would be a shame to have to write your own menu control to control its HTML output.&lt;br /&gt;&lt;br /&gt;ASP.NET's control adapters come to the rescue. When these are configured correctly, they can convert the table tags emitted by these controls to &lt;strong&gt;ul&lt;/strong&gt; and &lt;strong&gt;li&lt;/strong&gt; tags. I recently tried this out for making our menu control more css based and it worked wonderfully. The caveat is that this will change your css styles for the menu totally. Try it out, this works great and making your pages more css based is definitely a best practice.&lt;br /&gt;&lt;br /&gt;Here are a couple of good resources to get you started down this path:&lt;br /&gt;1. &lt;a href="http://www.asp.net/CSSAdapters/WhitePaper.aspx"&gt;CSS adapters white paper.&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.sharepointblogs.com/mossman/archive/2007/03/08/css-friendly-control-adapters-in-sharepoint-2007-a-walk-through.aspx"&gt;A nice walk through by John Ross.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8001735348440799544?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8001735348440799544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8001735348440799544' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8001735348440799544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8001735348440799544'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/01/sharepoint-2007-css-friendly-control.html' title='SharePoint 2007 CSS friendly control adapters'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2450762013013588763</id><published>2008-01-08T16:55:00.000-07:00</published><updated>2008-01-08T17:29:44.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Content deployment'/><title type='text'>Musings on MOSS 2007 Content Deployment</title><content type='html'>So a few days ago I started playing with and testing the MOSS content deployment feature. From my previous readings, it seemed easy enough. My approach was to go at it from scratch so that I could understand what works and what doesn't. I got quite a few errors along the way, I wanted to publish those here so that you could learn from my mistakes. As I mentioned in my previous post, we will use a 3 stage topology for content deployment. I still have some other questions around this whole process, but I will update this post as I learn more.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first scenario I tried was moving from one site collection to another in the same Web application. That did not work out so well. I got errors along the lines of "Unable to import the folder _catalogs/masterpage/Forms/Page Layout. There is already an object with the Id 853c8232-ae6d-4626-9cae-682xxxxxx in the database from another site collection." The other error I got was "Unable to import the folder WorkflowTasks/Office SharePoint Server Workflow Task. There is already an object with the Id 3d27c6ef-cc9c-4de5-b671-xxxxxxxxxxxx in the database from another site collection.". Supposedly this error occurs when the site collections share the database and an object already exists in the database due to the first site collection that the content is being exported from. The way I got rid of this error was to create a new Web application and move content between site collections that are in different Web applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Moving between site collections in different Web Applications did not work initially either because the destination site collection was based on a template other than the blank template. It is imperative that the destination site collection be based on the blank template for content deployment to work. The error I got was "Content deployment job 'Remote import job for job with sourceID = e94ecf30-33d2-498d-ae5c-xxxxxxxxxxxx' failed.The exception thrown was 'Microsoft.SharePoint.SPException' : 'Cannot import site. The exported site is based on the template XYZ but the destination site is based on the template ABC. You can import sites only into sites that are based on same template as the exported site.'". By the way, the error was confusing because it did not mention that the destination site needs to be a blank site.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The other task I had to complete was to disable all the features on the target site collection. For some reason that was causing a problem. More on this later, but keep in mind that you will have to probably deactivate the features on your destination site collection.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After these corrections, the content deployment between site collections in different Web applications worked. The next test was to move the content between farms in different domains :).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Initially this did not work and failed with the following error:&lt;br /&gt;"Content deployment job '[jobname]' failed. The remote upload Web request failed.". The DNS was setup correctly (using the HOSTS file) and I could browse to the destination site from a browser on the source server. I looked in the event log for an explanation of the error and found the following.&lt;br /&gt;"Failed to communicate with destination server for Content Deployment job '[jobname]'. Exception was: 'System.Net.WebException: Unable to connect to the remote server ---&gt; System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it".&lt;br /&gt;This didn't make a lot of sense right away but then I realized the problem. In the target farm, we had one app server, 2 WFEs and 1 DB server. The account that was being used to authenticate against the central administration of the target server in "Content Deployment Settings" from the source did not have permissions in the destination site collection. I gave that account permissions to the site collection and voila..it worked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2450762013013588763?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2450762013013588763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2450762013013588763' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2450762013013588763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2450762013013588763'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/01/musings-on-moss-2007-content-deployment.html' title='Musings on MOSS 2007 Content Deployment'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-4625556093523362540</id><published>2008-01-04T11:16:00.000-07:00</published><updated>2008-01-04T13:55:48.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Content deployment'/><title type='text'>MOSS 2007 Content Deployment Topologies</title><content type='html'>As you all may know, content deployment is a powerful feature in MOSS 2007 (this concept has been brought over from CMS 2002). With almost any site, you need authors to actually create and edit the content that the target users will see. If the site is internet accessible, then there are a host of security concerns associated with the content/application etc. So for an external facing site, it is best to have at least 2 separate farms - an internal farm where authors can create, modify and approve content as well as an external farm where the content will be pushed out to for external user viewing. There can also be three farms (authoring, staging and production) where the content follows the authoring --&gt; staging --&gt; production chain. The staging farm can be used to "stage" the content so that it can be reviewed one final time before it is pushed to production.&lt;br /&gt;&lt;br /&gt;We recently reviewed the different farm topologies and decided to go with the 3 stage approach (authoring, stage, production). I will list the advantages and disadvantages of 2 vs. 3 stage topology as they applied to us. Keep in mind that your situation might be different as you might have different constraints.&lt;br /&gt;&lt;br /&gt;Two Stage topology:&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;1)      Simple content deployment strategy. Users approve pages in authoring farm and that content is pushed to the production farm.&lt;br /&gt;&lt;br /&gt;Cons:&lt;br /&gt;1)      Stage does not exactly mirror production in terms of content.&lt;br /&gt;2)      If business users need to view content, they must view it on the authoring server which might not have the same links or the same look and feel as production. (the master pages might be slightly different for an optimized experience etc.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Three stage topology:&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;1)      Stage is always a complete replica of production, in terms of content and applications. This will be imperative for testing a production-like environment, which may not be feasible on the internal farm.&lt;br /&gt;2)      In case of a disaster on production, you can simply change the external DNS entries to point to stage while you bring back production.&lt;br /&gt;3)      Authors and business users will get another chance to preview content on stage before it is pushed to production.&lt;br /&gt;&lt;br /&gt;Cons:&lt;br /&gt;1)      More complicated deployment strategy.&lt;br /&gt;2)      We will need to ensure that stage is used to review content or it becomes a redundant deployment hop.&lt;br /&gt;&lt;br /&gt;Thus the 3 stage topology makes more sense for our business case. A recommendation I would make is to make sure you design your infrastructure correctly - ensure that you allocate budget for a dev, test, stage and production farms. This is the right way to do things and can make your life easier over the long term.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-4625556093523362540?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/4625556093523362540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=4625556093523362540' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/4625556093523362540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/4625556093523362540'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/01/moss-2007-content-deployment-topologies.html' title='MOSS 2007 Content Deployment Topologies'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-993733737336083778</id><published>2008-01-04T11:14:00.000-07:00</published><updated>2008-01-04T11:16:34.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS to MOSS migration'/><title type='text'>Migrating CMS 2002 to MOSS 2007</title><content type='html'>Recently I have been working on a project to migrate a CMS 2002 site to MOSS 2007 internet facing application. I will start posting those experiences here shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-993733737336083778?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/993733737336083778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=993733737336083778' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/993733737336083778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/993733737336083778'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2008/01/migrating-cms-2002-to-moss-2007.html' title='Migrating CMS 2002 to MOSS 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2107379190580179821</id><published>2007-12-17T17:05:00.001-07:00</published><updated>2007-12-17T17:12:20.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>VS 2008 and SharePoint 2007 service packs released</title><content type='html'>Most of you will already know this, but VS 2008 has been released. Experience all the new functionality by downloading it from &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;WSS 3.0 and MOSS 2007 service pack 1 has also been released. You can view the details &lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/12/11/announcing-the-release-of-wss-3-0-sp1-and-office-sharepoint-server-2007-sp1.aspx"&gt;here&lt;/a&gt;. Just a word of advice, unless you have a critical need that is addressed by this release - wait to hear other people's upgrade experiences before jumping the gun on this one, especially in a production environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2107379190580179821?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2107379190580179821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2107379190580179821' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2107379190580179821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2107379190580179821'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/12/vs-2008-and-sharepoint-2007-service.html' title='VS 2008 and SharePoint 2007 service packs released'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6552010445796639795</id><published>2007-11-18T22:12:00.002-07:00</published><updated>2009-05-19T16:20:59.771-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Branding'/><title type='text'>Branding Intranets with SharePoint (MOSS) 2007</title><content type='html'>Now let’s cover how we subsequently rebranded our intranet and increased employee self service to drive user adoption.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The strategic goals (from a company perspective) of the MOSS branding project were as follows:&lt;br /&gt;1. Brand intranet.&lt;br /&gt;2. Role/Persona approach versus functional. We developed a persona based approach to content delivery. Identified roles in the company and organized content so that these roles would have most of their daily needs served in one place. (We conducted a company-wide survey in which we asked people to organize information into buckets based on their roles and factored those results into our solution).&lt;br /&gt;3. Minimize clicks / navigation to critical information. This is aligned with the above goal. We wanted to allow colleagues to get to information as fast as possible.&lt;br /&gt;4. Page based delivery. We wanted to surface information in terms of pages which colleagues could easily read instead of abstract documents in a document library where a guess was usually required to find the needed information.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We identified two distinct project tasks in line with the above goals:&lt;br /&gt;1. Develop the company brand.&lt;br /&gt;2. Create the content to support the strategic goals. This was an important step because the content had been created in terms of documents in libraries. We had to pull out this information into user-friendly pages to enable employee self service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The distinct pieces are explained below:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Develop the company brand&lt;/strong&gt;&lt;br /&gt;We engaged a design company to create the brand for us. Here is what the original provided design looked like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_r8BZcH_g0j0/R0EcYgK3U_I/AAAAAAAAABY/Smo_91z6K5c/s1600-h/design.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134416257457017842" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/R0EcYgK3U_I/AAAAAAAAABY/Smo_91z6K5c/s400/design.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We modified the design slightly to make the best use of SharePoint features. We then signed off on the design and got to work on implementing it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;User Interface&lt;br /&gt;&lt;/strong&gt;The various elements of the user interface are master pages, page layouts, site definitions, Web Parts, navigation controls and xsl transforms for placement of content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Master pages&lt;/strong&gt;&lt;br /&gt;There are three ways we could have chosen to build the custom master pages.&lt;br /&gt;1. From scratch - not recommended as SharePoint 2007 needs a few placeholders to be present in the master page or else the pages will not work.&lt;br /&gt;2. From minimal.master - not recommended for a collaboration intranet, serves a .com site much better. The reason is that in a collaborative environment, you want to use OOB features and controls that SharePoint provides and a lot of these are declared in default.master.&lt;br /&gt;3. From default.master - recommended as this allows you to use most of the collaborative controls already present on the master page. This master page does have a learning curve though.&lt;br /&gt;&lt;br /&gt;We chose #3 and developed the master page for global branding. We took out what we did not need but retained a lot of the collaboration functionality declared in default.master. The master pages were developed using SharePoint Designer along with the style sheets that are discussed below.&lt;br /&gt;&lt;br /&gt;These master pages were deployed as features to the target server. A note worthy of mention is that Microsoft recommends that we do not change application.master so we left it as is. That did cause a little confusion but we covered it pretty well in training. Only the site admins and the content authors saw this difference anyway, the majority of users did not.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Page Layouts&lt;br /&gt;&lt;/strong&gt;We worked with the design company to come up with page layouts that would enable us to serve content in line with the corporate strategy. This meant modifying the 9 predefined page templates to provide the desired content layouts. This was done for both the SMARTPGS templates as well as the BLANKPGS template.&lt;br /&gt;&lt;br /&gt;We used SharePoint designer to modify the page templates. We took off the override for the left navigation placeholder to allow the site left navigation to show up from the master page. We also changed the percentage widths of the table columns to better suit our business requirements. This provided all our pages with consistent branding so as to reduce user confusion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Site Definitions&lt;/strong&gt;&lt;br /&gt;The business requirement was that when new sites are created, a predefined set of Web Parts should appear on the default page for ease to the content author as well as from a governance perspective. The other requirement was that the brand should be applied to the site upon creation.&lt;br /&gt;&lt;br /&gt;We developed 5 new site definitions that would serve 95% of the typical needs. We modified these site definitions and created/modified the WEBTEMP.xxx.xml and the ONET.xml files to place the selected web parts on the page. The recommendation here is to copy from the existing sts site definition and then rename and modify that to create a new site definition. We also wrote a custom provisioning provider that would intercept the site creation request and assign the correct site template and master page to it to meet the business requirement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Navigation&lt;/strong&gt;&lt;br /&gt;We needed consistent global navigation across many site collections to ensure consistency and enforce the brand. We also needed current navigation that could be maintained at a site level. After some investigation we decided to develop list based custom navigation providers that would meet the needs of global and current navigation. This was also a very user friendly solution in that it allowed the appropriate users to set up and easily change global and current navigation in a custom list, with no IT involvement. To improve performance, we cached the global navigation tree so it would not need to be assembled for every site.&lt;br /&gt;&lt;br /&gt;This is a view of the global navigation shared across all site collections. It includes one level of dropdowns.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0EcsQK3VAI/AAAAAAAAABg/DOfsvx7UZOw/s1600-h/topnav.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134416596759434242" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 417px; CURSOR: hand; HEIGHT: 26px; TEXT-ALIGN: center" height="24" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0EcsQK3VAI/AAAAAAAAABg/DOfsvx7UZOw/s400/topnav.JPG" width="417" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a view of the current navigation which is specific to every site:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0Ed2QK3VEI/AAAAAAAAACA/Hz2oEOpy2vk/s1600-h/leftblue.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417868069753922" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_r8BZcH_g0j0/R0Ed2QK3VEI/AAAAAAAAACA/Hz2oEOpy2vk/s400/leftblue.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;We created custom site columns, custom content types and then a custom list that used these content types to allow users to easily build hierarchies that the navigation provider could read and deduce the navigation levels. Here is an example of the custom list for the top navigation content. The actual URLs below in the Url Link column have erased, but this should get the point across.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s1600-h/listview.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417052025967634" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdGwK3VBI/AAAAAAAAABo/fUqytUxN1-k/s400/listview.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Building custom navigation providers means that we did not have to build special navigation user controls, we made minimal changes to the master page to switch to our navigation provider for navigation content. One tip here is to start debugging your provider early and often. For folks developing custom providers for the first time, it would be prudent to develop them in ASP.NET first to get a good understanding of how they work, only then proceed to build them in SharePoint. We used Visual Studio 2005 to develop and debug the custom navigation providers.&lt;br /&gt;&lt;br /&gt;We would like to point out that not only did we reuse SharePoint to hold the data, but we are also using the SharePoint security permissions to secure who is able to get access to and change the data in the list, and ultimately the navigation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;br /&gt;We used CSS styles to achieve our design goals. Core.css defines most of the standard SharePoint CSS classes. Every site and application page is linked to core.css. We left core.css intact (as is recommended by Microsoft) but 1) changed the direct references to core in default.master to point to a custom style sheet and 2) overrode some of the other indirectly referenced core styles by defining a few styles in the master page itself. We also developed secondary style sheets that would enable us to change the color theme on sub sites easily and used the AlternateCSS setting to attach the secondary style sheets. The effect is shown below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdTwK3VCI/AAAAAAAAABw/8K51BbFJryQ/s1600-h/leftnavgreen.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417275364267042" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdTwK3VCI/AAAAAAAAABw/8K51BbFJryQ/s400/leftnavgreen.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Web Parts&lt;br /&gt;&lt;/strong&gt;We purchased a few third party Web Parts that served the business needs really well. These included a stock ticker Web Part, weather Web Part and an image rotator Web Part that gave us quick bang for the buck. We also used XSL transforms to place information in a desirable manner using the Content By Query Web Part.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The final design looked like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdfwK3VDI/AAAAAAAAAB4/duvHbol9ZzQ/s1600-h/thesource.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5134417481522697266" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/R0EdfwK3VDI/AAAAAAAAAB4/duvHbol9ZzQ/s400/thesource.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Content Creation&lt;/strong&gt;&lt;br /&gt;As discussed earlier, most of the content was previously stored as documents in libraries. From a company strategic perspective, we decided that in order for the more relevant content to be of greatest use to colleagues, it would need to be pulled out from documents and surfaced on pages along with action items that users might consider after reading the information. In our mind, this strategy would go a long way in driving user adoption and employee self service. We assembled a content creation team that encompassed content authors from all departments who would then be responsible for the relevant content for that department.&lt;br /&gt;&lt;br /&gt;This strategy did indeed pay off and user adoption increased many fold.&lt;br /&gt;&lt;br /&gt;This entire branding project was fast paced and was completed in 6-7 weeks from the inception date. The newly branded site went live on October 1, 2007 with only 4 support calls the entire first week. There have also been no issues reported since that time, so the project team is proud of the work we have done.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(153, 51, 0);"&gt;Update on Persona based approach&lt;/span&gt;: Persona based approach basically means (to us) as understanding the user types (personas) that will be visiting the intranet. Once we divided people into categories (such as general workers, managers, executives) we went ahead and developed persona based sites so that these classes of people could get all or most of their day to day needs served in one place (as opposed to trying to find this information and wasting time). Examples of day to day needs include employee benefits information, travel guides, travel expense forms, career center, information for new colleagues to get started, rewards information, recognition information, performance mangement tools for managers, learning center links, ethics and compliance links. This simplifies the dissemination of information, updates, as well as keeps the single source of information intact.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is a snapshot of the Departments and Teams page. This is just a listing of where to find more information, most of our departments were in different site collections.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r8BZcH_g0j0/ShMv9PVPy4I/AAAAAAAAAGU/d1gkeIJeEl8/s1600-h/depts.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 211px;" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/ShMv9PVPy4I/AAAAAAAAAGU/d1gkeIJeEl8/s400/depts.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5337662712498342786" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6552010445796639795?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6552010445796639795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6552010445796639795' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6552010445796639795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6552010445796639795'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/11/branding-intranets-with-sharepoint-moss.html' title='Branding Intranets with SharePoint (MOSS) 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_r8BZcH_g0j0/R0EcYgK3U_I/AAAAAAAAABY/Smo_91z6K5c/s72-c/design.JPG' height='72' width='72'/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3854003889194150562</id><published>2007-11-16T00:03:00.000-07:00</published><updated>2008-12-08T15:33:13.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint migration'/><title type='text'>Migrating SharePoint 2003 to SharePoint (MOSS) 2007</title><content type='html'>&lt;strong&gt;Overview&lt;/strong&gt;&lt;br /&gt;Approximately 3 years ago, we successfully completed a project to migrate the corporate intranet to SharePoint 2003. The project was primarily driven by IT, wherein we analyzed and selected a product which would meet the needs of the business; hence the business would thank us for finding a great product and adopt it. We selected the right people to be site admins and delivered training to these individuals with the mandate that they would drive adoption in their respective business units. However this did not turn out to be the case. We noticed that initially the user adoption increased but then started tapering off as users started finding little quirks in the product. Some of the notables were that search did not always get the most relevant results, it was cumbersome to navigate from one site to another or to get a feel for where you are in the site hierarchy, navigation links were not security trimmed leading to frustration etc. to name a few. We only branded the main areas of SharePoint 2003 but not the sites which led to an inconsistent look and feel. Finally, there was no governance committee to oversee the intranet and hence company colleagues were free to do what they liked. This amounted to information being stored in the form of documents in document libraries, which was hard to find without explicit instructions.&lt;br /&gt;&lt;br /&gt;Below is an example image of how the SPS 2003 intranet looked earlier this year.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_r8BZcH_g0j0/Rz2-uwK3U8I/AAAAAAAAAA0/0cu10_TBXBw/s1600-h/insight.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5133468860685964226" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://2.bp.blogspot.com/_r8BZcH_g0j0/Rz2-uwK3U8I/AAAAAAAAAA0/0cu10_TBXBw/s400/insight.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The MOSS 2007 opportunity&lt;/strong&gt;&lt;br /&gt;MOSS 2007 provided an enhanced feature functionality set. We performed an initial assessment against the pain points and determined that the MOSS enhancements/OOB features met IHS strategic goals. We went over the features and placed them into two buckets based on priority, ones that we need now vs. others that could wait. This helped us decide the licensing model for MOSS. We devised the hardware architecture and evaluated the different migration approaches/risks. At the end of this phase, we decided to go with the Content DB migration option. The reasons for this are follows:&lt;br /&gt;1. IT initiative to consolidate to a single hosting center with leading practice hosting services and monitoring. Our intranet was hosted on 32 bit architecture and we  preferred to move to 64 bit  to utilize the performance benefits that it offers. Another motivator was that the cost difference between the two was minimal.&lt;br /&gt;2. We had over 100 GB of data, but the majority of data was stored in WSS site collections, not in SPS areas. We only had a few areas and we were willing to lose those, as they did not contain any required information, they were just hooks into the appropriate WSS sites. We also had a few custom site definitions - but we were only interested in upgrading a couple of them.&lt;br /&gt;3. We tried a couple of trial runs of the migration using the content database approach - and things migrated over pretty well for the most part.&lt;br /&gt;4. Microsoft does not recommend the in-place upgrade because if something went wrong during the migration, it’s difficult to restore.&lt;br /&gt;5. We did not want to go with the gradual migration approach as well because there was risk in our mind. This included installing both MOSS and SharePoint 2003 on one production server, performance issues this may have caused, disk space issues we may have run into given that we were running out of disk space on that server.&lt;br /&gt;6. We also evaluated four 3rd party tools that we felt could assist us in the migration but turned them down because they did not meet our needs completely, or that significant post migration cleanup would be involved.&lt;br /&gt;&lt;br /&gt;Finally, the intranet goals for IHS were:&lt;br /&gt;1. Strategy / Governance&lt;br /&gt;Define intranet as critical component to corporate communication strategy&lt;br /&gt;Solidify our intranet strategy, usage and measures&lt;br /&gt;Form an internal governance council and supporting processes&lt;br /&gt;2. Content Migration / Foundation Upgrade&lt;br /&gt;Coordinate migration with business to minimize user impact/downtime&lt;br /&gt;Support customizations and integration points&lt;br /&gt;3. Branding &amp;amp; Content Re-organization&lt;br /&gt;Take a role/persona approach versus functional&lt;br /&gt;Minimize user clicks / navigation to critical information&lt;br /&gt;Implement a page based delivery&lt;br /&gt;After finalizing the migration approach (which was our single biggest X factor), we went back to planning the migration and worked on the documenting the four phases that any SharePoint migration consists of: Planning, Preparation, Migration and Clean Up. A big misconception in people's minds is that the planning and preparation phases are very small and the actual migration and clean up phase is what matters. Nothing could be further from the truth. To the contrary, the planning and preparation phases are critical to the migration and should be allotted ample time. To underscore how important the planning phase is, here are some of the tasks we completed in the planning phase: understanding the big picture and defining future state, understanding the current deployment and usage, assessing SharePoint 2007 features, licensing, planning and validating architecture, getting buy in from all business units and executive sponsorship, choosing a migration option and running test migrations, planning customizations, creating a networking and domain name plan, creating a communication plan, creating a testing plan and training users on moss etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;IHS Project Approach&lt;/strong&gt;&lt;br /&gt;Here we will provide a high level overview of the approach we took with the SPS 2003 to MOSS 2007 migration.&lt;br /&gt;1. We used standard software lifecycle methodology (Design, Develop/Test, Deploy).&lt;br /&gt;2. Solicited executive sponsorship and created a governance team. We also formed a collaborative project team (IT &amp;amp; Business). This gave us a big boost as the corporate communications and key business stakeholders "owned" the intranet migration and therefore took it upon themselves to push for governance and adoption. IT was no longer a driver, but a facilitator.&lt;br /&gt;3. Gathered necessary requirements for design.&lt;br /&gt;4. Defined scope – business approval. We effectively split the project into 2 phases: the as-is content migration to MOSS and then subsequent creation of the company brand. We separated these goals into 2 different projects to tackle each one individually and ensure nothing fell through the cracks juggling two sets of tasks.&lt;br /&gt;5. Used content DB migration. The reasons for this decision are explained above.&lt;br /&gt;6. Did not upgrade 2 out of 4 custom site definitions as we felt that MOSS would address these needs OOB. We wrote custom site definition and upgrade files so that the remaining site definitions would upgrade successfully.&lt;br /&gt;7. Did not migrate MySites as the user adoption was very low and we discovered through communication that the users would not mind losing their SPS 2003 MySites.&lt;br /&gt;8. Did not migrate any 3rd party Web Parts as these had to do with navigation. MOSS 2007 provided this functionality OOB.&lt;br /&gt;9. Did 4 trial migrations to ensure that content migrated and the development team was comfortable with the result. This also allowed us to tweak our steps in the migration phases.&lt;br /&gt;10. Established Training and Communication plans for end users and delivered worldwide training.&lt;br /&gt;11. Created a testing plan and performed testing to ensure that the hardware would be able to serve our users and that there would be no performance concerns after go-live.&lt;br /&gt;12. “Froze” SPS 2003 for 3 days as we moved the 100 GB database over and completed the migration, clean up and final testing for MOSS. This means that SPS 2003 was in a read-only state.&lt;br /&gt;13. The DNS change was transparent as we just changed the entries to point to the new servers. The users entered the same URL and they were taken to the MOSS 2007 intranet instead. We still maintained the old intranet as a different URL if users wanted to compare or felt they had missed something. Fortunately the number of such requests was less than 5.&lt;br /&gt;14. Performed migration in off hours and over the weekend. This limited the downtime as a small minority of users use our intranet over the weekend.&lt;br /&gt;15. Re-architecting SharePoint content in terms of pages. As mentioned previously, without active governance our SPS 2003 had become more of a document repository than we were comfortable with. So the governance team took it upon themselves to engage colleagues from various business units who would build informational pages and links to next steps. This is an ongoing operation and will be discussed in part 2 of this series.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are the high level upgrade experiences&lt;br /&gt;1. The upgrade took 4 hours. We migrated 800 sites and 100 GB of data.&lt;br /&gt;2. All the WSS site content migrated with the same structure as SPS 2003.&lt;br /&gt;3. Search scopes, keywords, best bets, audiences were recreated as these did not migrate.&lt;br /&gt;4. We needed 2 days of post migration cleanup and tasks – links, web parts that were not migrated, scripts, integrations with other applications.&lt;br /&gt;5. Communication had to be repeated as some users did not read that the intranet would be read-only.&lt;br /&gt;&lt;br /&gt;To learn other migration Do's/Don’t's and if you need further information about the tasks we completed in each migration phase, please see the slides (from my September blog post) from a recent presentation at the Rocky Mountain SharePoint user group where we spoke about our migration experience.&lt;br /&gt;After the migration, here is what our SharePoint intranet looked like. We added the Under Construction image to indicate that this was a temporary look before the final branding.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_r8BZcH_g0j0/Rz2_ggK3U9I/AAAAAAAAAA8/SSLuUT4GncA/s1600-h/migrated_insight.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5133469715384456146" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://1.bp.blogspot.com/_r8BZcH_g0j0/Rz2_ggK3U9I/AAAAAAAAAA8/SSLuUT4GncA/s400/migrated_insight.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In part 2 of this series, I will talk about how we branded SharePoint 2007 for our intranet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3854003889194150562?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3854003889194150562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3854003889194150562' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3854003889194150562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3854003889194150562'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/11/migrating-sharepoint-2003-to-moss-2007_16.html' title='Migrating SharePoint 2003 to SharePoint (MOSS) 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r8BZcH_g0j0/Rz2-uwK3U8I/AAAAAAAAAA0/0cu10_TBXBw/s72-c/insight.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7030535139600505562</id><published>2007-11-08T17:45:00.000-07:00</published><updated>2007-11-12T11:35:12.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Change MOSS site URL'/><title type='text'>How to Change SharePoint Site URL</title><content type='html'>Sometimes you will have a requirement to rebrand your site with a new domain name for various business reasons. We had a business case a little over a month ago wherein we had to change the brand for our intranet. The requirement was that users visiting the old site would get redirected to the new site automatically. History: We had migrated our SharePoint 2003 intranet to MOSS 2007 and we now wanted to give it a new brand to drive excitement and adoption.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a slick way that I devised to achieve this switch easily. This worked like a charm so if you have a similar business case, test this to decide if this will meet your needs. The URLs and Website names are made up, but they serve to demonstrate how this is done.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We had 2 Web applications for the intranet (one for the main portal and one for MySites). The DNS names were oldintranet.ihs.com and mysite.oldintranet.ihs.com, as an example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The new DNS names we decided to go with were newintranet.ihs.com and mysite.newintranet.ihs.com.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are the steps:&lt;br /&gt;&lt;br /&gt;1) On the target server, assign 2 new IP addresses. This is because you can only have one SSL Website enabled on one IP. Create 2 new Web applications (a collaboration portal for newintranet.ihs.com and a MySite for mysite.newintranet.ihs.com) on these 2 new IPs.&lt;br /&gt;&lt;br /&gt;2) Procure and attach the appropriate certificates to these Web applications (if using SSL). Create the relevant site collections for these Web applications. Make sure that the new web applications work correctly when you browse to them.&lt;br /&gt;&lt;br /&gt;3) Make sure to save the certificates as text files on the C: or D: drive for all the 4 Web applications involved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--- So now we have a total of 4 IIS Websites. Lets assume these are called MOSS_IHS_Intranet_Old and MOSS_IHS_Intranet_Old_Mysite and MOSS_IHS_Intranet_New and MOSS_IHS_Intranet_New_Mysite. ---&lt;br /&gt;&lt;br /&gt;--- Here is where you will have a few minutes of downtime, so do this during a maintenance window ---&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4) Go to central administration and change alternate access mappings for newintranet.ihs.com to newintranet2.ihs.com. Similarly change alternate access mappings for mysite.newintranet.ihs.com to mysite.newintranet2.ihs.com. (We change these to arbitrary names so that some other Web application can claim the names that we are changing).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5) Now change alternate access mappings for oldintranet.ihs.com to newintranet.ihs.com and mysite.oldintranet.ihs.com to mysite.newintranet.ihs.com. (Now we change the old headers to the new ones so that the new headers serve content for the old Web application - which is where the content lives anyway. MOSS will do the heavy lifting of changing all the links served on pages to the new URLs we just applied. An exception to this is hard coded links in the Content Query and/or the Links Web Parts).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6) Similarly, now change alternate access mappings for newintranet2.ihs.com to oldintranet.ihs.com and mysite.newintranet2.ihs.com to mysite.oldintranet.ihs.com. (Now we claim those old headers for the new sites so that the old url effectively points to the new Web applications - which have little to no content. We will use these old host headers to merely redirect users to the new URLs).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- So far we have only done half the work --&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7) Go to IIS, right click on the old Website MOSS_IHS_Intranet_Old, click on the Web Site tab and click on Advanced. Here change the host header value from oldintranet.ihs.com to newintranet.ihs.com. This is to match in IIS what we did with alternate access mappings so everything is in sync. Do this for all 4 IIS Websites in question.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8) Change the certificates in IIS. As the host headers were mismatched, so are the certificates. Right click on Website, click Properties and browse to the Directory Security tab. Click on Server Certificate --&gt; click next --&gt; Remove the current certificate. Then attach the certificate that matches the newly changed host header from your hard drive (these were saved in step 3). Do this for all 4 IIS Websites.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9) Swap IPs between the corresponding Web applications. In IIS, right click on Website --&gt; Properties --&gt; Web Site tab --&gt; Advanced --&gt; change IP for both the "Multiple identities for this Web site" as well as "Multiple SSL identities for this Web site". For example, swap IPs between MOSS_IHS_Intranet_Old and MOSS_IHS_Intranet_New as well as between the MOSS_IHS_Intranet_Old_Mysite and MOSS_IHS_Intranet_New_Mysite. This is done to preserve the original IP mappings that we had after step 2. This also helps in keeping the same IP address for the old site and the new site. The new DNS names could then be pre-advertised so that after you are done with this step the old content is being surfaced using the new host header. No funny DNS entry changes required at the last minute.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now you are done.&lt;br /&gt;10) Now finally add a redirection to the old host headers (newly created Websites) so that they exist merely to redirect all requests to the new host headers (attached to the old Websites where the old content will be surfaced). Go to IIS --&gt; right click on newly created Websites --&gt; Properties --&gt; Web Site tab --&gt; "The content for this resource should come from: --&gt; Select "A redirection to a URL" and specify the URL to be the corresponding new host header. (Do this for both the new Websites.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You are done. This method may sound complicated, but its not - if you understand what is going on. What we have effectively done is switched which host headers are responding to which content. So now when you browse to the old url, you are automatically redirected to the new url which is serving the old content - the links are automatically changed.&lt;br /&gt;&lt;br /&gt;This also helps in house keeping. Once the new url has been sufficiently advertised, you are free to delete the Web applications that are serving the old url, because they point to the new content - which is meaningless for your purpose anyway.&lt;br /&gt;&lt;br /&gt;Realize that there are other methods of achieving this goal, but this works pretty well and has the advantages listed above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7030535139600505562?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/7030535139600505562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=7030535139600505562' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7030535139600505562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7030535139600505562'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/11/how-to-change-sharepoint-site-url.html' title='How to Change SharePoint Site URL'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-9016418425687394156</id><published>2007-11-08T17:42:00.000-07:00</published><updated>2007-11-08T17:45:12.468-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vacation'/><title type='text'>Missing In Action</title><content type='html'>So I haven't been able to blog for the past month and a half coz I have been busy travelling to a lot of places. I visited Bombay, Dubai and London for vacation and it was pretty awesome to say the least. I'll post some interesting pictures of the trip on here soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-9016418425687394156?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/9016418425687394156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=9016418425687394156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/9016418425687394156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/9016418425687394156'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/11/missing-in-action.html' title='Missing In Action'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2888488365368056185</id><published>2007-09-20T23:09:00.000-06:00</published><updated>2007-09-20T23:22:38.580-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uploading site templates'/><title type='text'>Uploading a site template in MOSS</title><content type='html'>&lt;div class="snap_preview"&gt;&lt;p&gt;Here is how to correctly upload a site template (.stp) into MOSS.&lt;br /&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Uploading a site template in MOSS&lt;/span&gt;&lt;br /&gt;&lt;p&gt;1. If the site template file is an exe, download it and unzip the file on your computer.&lt;/p&gt;&lt;p&gt;2. Log on to SharePoint (as an administrator) to the site collection where you want to upload this template. Make sure to browse to the top level site of the site collection.&lt;/p&gt;&lt;p&gt;3. Go to Site Actions --&gt; Site Settings --&gt;Manage All Site Settings --&gt; look for the Galleries section and select Site templates.&lt;/p&gt;&lt;p&gt;4. Select Upload --&gt; 'Upload document' or 'Upload multiple documents' depending on how many site templates you wish to upload.&lt;/p&gt;&lt;p&gt;5. Browse to the &lt;site_template&gt;.stp file and upload it.&lt;/site_template&gt;&lt;/p&gt;&lt;p&gt;6. The site template should now be ready to go.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Applying the new Site Template to new sites:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. &lt;/strong&gt;Log on to SharePoint (as an administrator) to the site under which you want to create a site based on the newly uploaded template.&lt;/p&gt;&lt;p&gt;2. Go to Site Actions --&gt; Site Settings --&gt; Manage all Site Settings --&gt; 'Create' or 'Create Site'.&lt;/p&gt;&lt;p&gt;3. Enter a title, URL and pick the new template from the 'Select a template' section.&lt;/p&gt;&lt;p&gt;4. Click Create. A site based on the new template should now be created.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2888488365368056185?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2888488365368056185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2888488365368056185' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2888488365368056185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2888488365368056185'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/09/uploading-site-template-in-moss.html' title='Uploading a site template in MOSS'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5230773465861474496</id><published>2007-09-19T08:59:00.000-06:00</published><updated>2007-09-19T09:57:06.730-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><title type='text'>Powerpoint Presentations from user group</title><content type='html'>As promised, here are the powerpoint files from last night's presentations. Thank you to all those that attended. A special thanks to all those who stayed till the end, even though we were way over time. Hope you all learned something. Please feel free to email me if you have any questions. I will be posting shortly about the migration and branding experiences here as well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rockymountainsharepoint.org/Documents/IHS%20SPS%202003%20to%20MOSS%202007.ppt"&gt;SharePoint 2003 to SharePoint 2007 migration&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rockymountainsharepoint.org/Documents/MOSS_Branding.ppt"&gt;Branding SharePoint 2007 intranets&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5230773465861474496?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5230773465861474496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5230773465861474496' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5230773465861474496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5230773465861474496'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/09/powerpoint-presentations-from-user.html' title='Powerpoint Presentations from user group'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7504744501630496019</id><published>2007-09-17T15:53:00.000-06:00</published><updated>2007-09-17T16:01:16.796-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint migration'/><title type='text'>Presenting at RM SharePoint User Group</title><content type='html'>So tomorrow I am presenting at the Rocky Mountain SharePoint user group with my team. We will we talking about our experiences migrating from SharePoint 2003 to MOSS 2007, lessons learned, Do's and Dont's etc.&lt;br /&gt;&lt;br /&gt;Right after that presentation, I will also present our learnings and experiences with branding MOSS 2007. This will include using custom navigation providers with list based navigation, building the master pages, style sheets and application of style sheets, changing web part pages to include left navigation, creating custom site templates which display our chosen web parts on the home page, customizing styles in the Content By Query Web Part using XSLT etc. It should be pretty interesting.&lt;br /&gt;&lt;br /&gt;Matt Passannante (RM user group president) also asked me to run the user group tomorrow since he will be unable to make it. Talk about screen time!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7504744501630496019?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/7504744501630496019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=7504744501630496019' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7504744501630496019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7504744501630496019'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/09/presenting-at-rm-sharepoint-user-group.html' title='Presenting at RM SharePoint User Group'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6077957429089907660</id><published>2007-09-10T17:19:00.000-06:00</published><updated>2007-09-20T23:30:51.360-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Part page template'/><title type='text'>Create custom Web Part page template in MOSS</title><content type='html'>I recently developed a crafty list based custom navigation provider in MOSS that shows custom nav for the global navigation and the current site navigation. We are also working on SharePoint governance in our company and are encouraging users to create meaningful landing pages to surface links to documents instead of just creating sites and going straight to document libraries.&lt;br /&gt;&lt;br /&gt;The requirement is that the current navigation also be available on Web Part pages, since it does not appear on there by default because the default Web Part page is meant to really hold more content and not so much navigation. So I had to create a custom page from spcf.aspx file and rename it Customspcf.aspx. I added my custom link in create.aspx to call Customspcf.aspx for creating new Web Part pages. Then I browsed to the \12\TEMPLATE\1033\STS\DOCTEMP\SMARTPGS folder and tried to add my new custom page there. I reset IIS and my new Web Part custom page did not show up in the Customspcf.aspx page (it only showed the default 8 page layouts).&lt;br /&gt;&lt;br /&gt;I played around with it a little bit and here is my conclusion. Unless I understand this wrong, MOSS does not allow you to add custom Web Part page layouts to the 8 already pre-configured layouts. In order to add one, you must replace one of the existing layouts with yours. Bummer!!&lt;br /&gt;&lt;br /&gt;So I did exactly this to the spstd1.aspx layout. I also went ahead and removed this line &amp;lt;asp:content runat="server" contentplaceholderid="PlaceHolderLeftNavBar"&amp;gt;&amp;lt;/asp:content&amp;gt;, which basically overrides the left nav placeholder content from the master page with nothing. The left navigation then showed up on the custom Web Part page!!!!&lt;br /&gt;&lt;br /&gt;I also went ahead and removed the footer Web Part zone from the spstd1.aspx file as well as  changed the width of the left zone to be 70% of the available area. This gives us more space to insert Content Editor Web Part and make the Web Part pages behave more like traditional pages with navigation on the left, content in the center and some links on the right.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Try not to change create.aspx using SharePoint Designer. You will most likely get an error 'The file '/_layouts/_layouts/application.master' does not exist.   at System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) .....'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6077957429089907660?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6077957429089907660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6077957429089907660'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/09/create-custom-web-part-page-template-in.html' title='Create custom Web Part page template in MOSS'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1926310434544813297</id><published>2007-09-04T22:21:00.000-06:00</published><updated>2007-09-04T23:38:09.713-06:00</updated><title type='text'>New WSS 3.0 and MOSS SDK released</title><content type='html'>Microsoft recently released the new WSS 3.0 and MOSS SDKs. Be sure to have a look at them.&lt;br /&gt;&lt;br /&gt;Here are the links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms441339.aspx"&gt;Windows SharePoint Services 3.0 SDK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms441339.aspx"&gt;Microsoft Office SharePoint Server 2007 SDK&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1926310434544813297?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1926310434544813297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1926310434544813297'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/09/new-wss-30-and-moss-sdk-released.html' title='New WSS 3.0 and MOSS SDK released'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7924307684138614035</id><published>2007-08-27T23:01:00.000-06:00</published><updated>2007-08-27T23:19:01.650-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debugging code in MOSS - SharePoint 2007'/><title type='text'>Debugging custom navigation providers in MOSS</title><content type='html'>Microsoft has done quite a bit to ease pain of navigation in MOSS, but there are plenty of scenarios when you would want to have a custom navigation scheme. I am currently building a custom navigation provider for MOSS 2007, which does not need to depend on the site heirarchy and can go many levels deep if need be. I was having trouble debugging this navigation provider (which was created in Visual Studio 2005 as a class in a class library project).&lt;br /&gt;&lt;br /&gt;I created and compiled the dll, strong named it and deployed it to the GAC using gacutil. I also added the entry in the providers section. After some cajoling, the custom navigation started showing up in MOSS (not exactly how I wanted it yet, but doing one thing at a time helps ). Now, of course I wanted to debug it :). This is where I came across interesting scenarios. I removed the dll from the GAC and changed the VS output to go straight to the bin directory of the web application. I then got the expected error 'The assembly does not allow partially trusted callers'. Then I added the AllowPartiallyTrustedCallers attribute to the assembly - and guess what (it still didnt work). I then added a safe controls entry and an assembly entry for my assembly and raised the trust level of the web.config to WSS_Medium and it STILL complained about the same error. At this time I raised the trust level to full and that is when things started working.&lt;br /&gt;&lt;br /&gt;I think I know why I had to do this but Ill run it by some MCS folks and see if I am right and then update this.  Ill also write up an article explaining the design and architecture of the custom navigation provider soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7924307684138614035?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7924307684138614035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7924307684138614035'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/08/debugging-custom-navigation-providers.html' title='Debugging custom navigation providers in MOSS'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-503965671126115649</id><published>2007-08-22T21:21:00.000-06:00</published><updated>2007-08-22T21:35:30.216-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Traversing list heirarchies'/><title type='text'>Traversing lists in MOSS 2007</title><content type='html'>As you all might or might not know, WSS 3.0 and MOSS 2007 support folders in lists. This is honestly a really cool feature/enhancement to the list functionality. This opens the door to a lot more possibilities.&lt;br /&gt;&lt;br /&gt;However, you need to be a little careful with traversing lists that you create folder heirarchies in. Traversing a list is not as obvious as you think. I was a little surprised that the solution was not intuitive.&lt;br /&gt;&lt;br /&gt;Here are some of the caveats that I discovered:&lt;br /&gt;1. A call to list.Items will not bring forth your folders. Instead, it will bring forth ALL the regular items, regardless of the folder heirarchy they live in. So it doesnt matter if an item is at the root level or 4 levels deep - it will show up in the call to list.Items.&lt;br /&gt;&lt;br /&gt;2.  We have another property available for the folders :). However, a call to list.Folders will bring forth all the folders regardless of their heirarchy in the list.&lt;br /&gt;&lt;br /&gt;Keith Ritchie has a solution that works and he has done good homework around this problem. Be sure to have a look at his post &lt;a href="http://blog.krichie.com/2007/01/30/traversing-sharepoint-list-folder-hierarchies/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-503965671126115649?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/503965671126115649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/503965671126115649'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/08/traversing-lists-in-moss-2007.html' title='Traversing lists in MOSS 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3363918688153451974</id><published>2007-08-01T18:55:00.000-06:00</published><updated>2007-08-13T19:15:25.257-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007 navigation treeeview'/><title type='text'>MOSS 2007 - Enable treeviews on all sites programatically</title><content type='html'>I just added a MOSS utility (to my growing list of MOSS utilities) that would allow me to enable treeviews on all sites programmatically, rather than going into each site doing it manually. This is significant time savings when you are doing a migration - because there are potentially hundreds of sites that already exist and treeview is not enabled on them.&lt;br /&gt;&lt;p&gt;Here is the code. This assumes that you run a stsadm -o enumsites on the server so that you can get the list of the site collections on your server. This also assumes that you are reading that list from a config file (because you might want to run this for a subset of your site collections).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public static void EnableTreeView() { &lt;/p&gt;&lt;p&gt;Console.WriteLine("Enabling treeviews"); &lt;/p&gt;&lt;p&gt;try { &lt;/p&gt;&lt;p&gt;NameValueCollection coll = (NameValueCollection)ConfigurationManager.GetSection("FarmSettings/SiteCollections"); &lt;/p&gt;&lt;p&gt;string[] sitecolls = coll.AllKeys; &lt;/p&gt;&lt;p&gt;foreach (string sitecollstr in sitecolls) { &lt;/p&gt;&lt;p&gt;SPSite sitecoll = new SPSite(sitecollstr); &lt;/p&gt;&lt;p&gt;SPWebCollection webcols = sitecoll.AllWebs; &lt;/p&gt;&lt;p&gt;foreach (SPWeb web in webcols) { &lt;/p&gt;&lt;p&gt;Console.WriteLine("Enabling treeview for site: " + web.Url); &lt;/p&gt;&lt;p&gt;web.TreeViewEnabled = true;&lt;br /&gt;web.Update(); &lt;/p&gt;&lt;p&gt;web.Dispose(); &lt;/p&gt;&lt;p&gt;} &lt;/p&gt;&lt;p&gt;} &lt;/p&gt;&lt;p&gt;} &lt;/p&gt;&lt;p&gt;catch (Exception ex) &lt;/p&gt;&lt;p&gt;{ &lt;/p&gt;&lt;p&gt;Console.WriteLine(ex.Message); &lt;/p&gt;&lt;p&gt;} &lt;/p&gt;&lt;p&gt;}&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you have too many sites, you can pipe the output to a file for readibility.&lt;/p&gt;&lt;p&gt;[consoleapp.exe] &gt; C:/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;treeviewSites&lt;/span&gt;&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3363918688153451974?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3363918688153451974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3363918688153451974' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3363918688153451974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3363918688153451974'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/08/moss-2007-enable-treeviews-on-all-sites.html' title='MOSS 2007 - Enable treeviews on all sites programatically'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8850204450421598379</id><published>2007-08-01T18:29:00.000-06:00</published><updated>2007-08-01T18:54:56.589-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Document Importer'/><title type='text'>Windows service to publish files programmatically to MOSS 2007</title><content type='html'>I recently wrote, tested and deployed a .NET 2.0 Windows service to import files into MOSS 2007 sites and document libraries. This service watches a file share (using the FileSystemWatcher class) on another server and moves the file into a MOSS 2007 document library. Here are the salient features:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Watches the file share and all folders under that share. Picks up the files as they are created/changed on this share and imports them into MOSS 2007. Deletes the files from the file system after the import. The users are responsible for ensuring that the&lt;br /&gt;&lt;br /&gt;2. Accounts for the long copy operations, when the file may not have finished copying when the service goes to pick it up. The way to do that is to open the file in FileShare.None mode and catch the appropriate exception. Wait for a given period of time (few seconds) and retry. Do this the appropriate number of times based on the requirements.&lt;br /&gt;&lt;br /&gt;3. Does a clean sweep of the system everytime the service starts to account for the files that it might have missed since the last time it was stopped.&lt;br /&gt;&lt;br /&gt;4. Logs the files published/errors to the event log. This helps to track the health of the service - understand what is going right/wrong.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A few things to keep in mind:&lt;br /&gt;&lt;br /&gt;1. In the installer class, do not hardcode the password of the account under which the service will run. Do not even read the credentials from a config file. I asked our production environment admins to run the service under a moss service account with enough privileges.&lt;br /&gt;&lt;br /&gt;2. Do not do an infinite loop on the number of retries when you cannot get exclusive access to the file. If somebody opens the file and goes home for the day, your service is going to be spinning its wheels trying to get access to that file all night.&lt;br /&gt;&lt;br /&gt;3. Review the business case for this requirement. If all that is required is to index these files, you could use MOSS Search to index file shares pretty easily. Also review the business users understand the capabilities of your service, so they dont tax it by creating bogus directories and putting thousands of files in them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All in all, this service really helps the business because they can automatically import thousands of files into MOSS just by copying them into a file share. I cannot publish the code because the company "owns" that, but hit me up if you need help/advice on how to do this and Ill be glad to guide you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8850204450421598379?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8850204450421598379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8850204450421598379' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8850204450421598379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8850204450421598379'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/08/windows-service-to-publish-files.html' title='Windows service to publish files programmatically to MOSS 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-2631673910052464826</id><published>2007-07-17T21:32:00.000-06:00</published><updated>2007-11-16T16:29:32.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint migration'/><title type='text'>ALWAYS ALWAYS Run PRESCAN before migrating Sharepoint 2003 to MOSS</title><content type='html'>I just got bit by this recenty. ALWAYS run prescan.exe on your SharePoint 2003 environment before you migrate to MOSS 2007. Prescan prepares the database for upgrade. In particular, it parses and saves list definitions with the associated lists, as well as reports any errors that will cause the upgrade to fail. I have already done 2 SharePoint 2003 to MOSS 2007 migrations in a test environment and things moved over pretty well (I did this to document the post migration steps required for our environment - VERY GOOD PRACTICE). Finally when we were migrating to stage -- upon attaching the database using stsadm I got the following error.&lt;br /&gt;&lt;br /&gt;"The [Databasename] on [servername] contains user defined schema. Databases must be empty before they must be used. Delete all tables, stored procedures and other objects or use a different database".&lt;br /&gt;&lt;br /&gt;After going over what we did differently this time, we realized that we had forgotten to run prescan that day before backing up and moving the database. So we did exactly that and the migration to stage went as expected.&lt;br /&gt;&lt;br /&gt;So run prescan early and often if you are migrating to MOSS 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-2631673910052464826?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/2631673910052464826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=2631673910052464826' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2631673910052464826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/2631673910052464826'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/07/always-alwas-run-prescan-before.html' title='ALWAYS ALWAYS Run PRESCAN before migrating Sharepoint 2003 to MOSS'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8567685022013726685</id><published>2007-07-12T13:48:00.000-06:00</published><updated>2007-07-12T14:05:18.870-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL on MOSS 2007'/><title type='text'>The RIGHT way to enable SSL on MOSS Web Applications</title><content type='html'>I have been going back and forth a few times on enabling SSL on MOSS 2007 Web applications and here is the way that I have found to work best.&lt;br /&gt;&lt;br /&gt;1. Go to central admin --&gt; Create or extend a new web application --&gt; Create a new web application.&lt;br /&gt;2. Fill in the Web app, DB and App pool names as usual. Select yes to enable SSL on the web application. If you are using host headers for this web app, then enter those too. (Important: Make sure to set the port to 443, not 80).&lt;br /&gt;3. After the web application has been created, reset IIS and then open up IIS mmc. Scroll to the IIS website that MOSS just created for you and select the right SSL certificate from the available certificates (Ask your network folks to generate an internal or external SSL cert for you depending on whether this is a test or prod server). Important: Go to the Home Directory tab and click Advanced. Make sure you set the host header and the right IP for port 80. For SSL entries, select port 443 and the IP. (If you have multiple IP's on the server, I usually pick one here for these entries). Click on the edit button for SSL entries and check the 'Require SSL' box. Also check 'Require 128 bit encryption' to make this more secure.&lt;br /&gt;4. Now go ahead and create your first site collection for this web app. MOSS will automatically create a new site collection for you and present you with a "https://.." link upon completion. You should now have a SSL ready web app.&lt;br /&gt;5. By default, if you want multiple web apps using SSL on the same server - this does not work in IIS 6. If you want multiple MOSS 2007 Web apps to be SSL enabled, there are two ways of going about this. One way is to get as many IPs as you want SSL web apps for that web server and assign one IP per host header settings for port 80 and 443 under IIS Website properties --&gt; Home Directory --&gt; Advanced. The other option is to modify the IIS metabase to allow multiple SSL web apps on the same IP. Be careful with the second option and make sure you know what you are doing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8567685022013726685?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8567685022013726685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8567685022013726685' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8567685022013726685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8567685022013726685'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/07/right-way-to-enable-ssl-on-moss-web.html' title='The RIGHT way to enable SSL on MOSS Web Applications'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3872487113082579941</id><published>2007-07-08T16:12:00.000-06:00</published><updated>2007-07-08T16:34:12.782-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft VPC 2004 development'/><title type='text'>VPC running out of disk space</title><content type='html'>I have run into problems sometimes when my development VPC is low on hard drive space. By default, you get 16 GB of hard disk space on the VPC virtual disk. Recently I created a new VPC - installed MOSS 2007, SQL 2005, Office 2007, SharePoint designer and VSTS - and figured I would use this VPC for development around MOSS. Turns out that a few days after the install, a balloon popped up stating that the VPC was running out of space. I did not have many programs that I could get rid of, so I decided to confront the problem instead of delaying it.&lt;br /&gt;&lt;br /&gt;I navigated to the Virtual PC console and clicked on settings for the currently running VPC. I clicked on the Virtual Disk Wizard and created a new disk with the default settings to be used as the Hard Disk 2 for this VPC - to get me more space. I shut off the VPC and assigned the Hard Disk 2 settings to use this new disk file. After restarting the VPC, I still did not see my new space on the system drive. So I navigated to Computer Management under Administrative Tools and clicked on Storage --&gt; Disk management. That started a wizard where it asked me to initialize my new disk (if it does not automatically start the wizard, you can right click on the new disk and start it manually). I initialized my new disk and then right clicked on the disk again to format it. I chose the New Volume wizard to basically partition the drive. I chose the simple volume type on the next screen. On the next screen I selected the disk and set the disk size (used the defaults of 16GB) and clicked next. On the next screen, I assigned E: as the drive letter. The next screen presented me choices of formatting the volume or not. I chose to format the drive with NTFS as the file system and named the volume label as data. The next screen just showed me a summary of my choices and I said ok. A few minutes later it was done formatting the drive and I had an extra 16 GB of space :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3872487113082579941?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3872487113082579941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3872487113082579941' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3872487113082579941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3872487113082579941'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/07/vpc-running-out-of-disk-space.html' title='VPC running out of disk space'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-882934846507066920</id><published>2007-07-03T09:12:00.000-06:00</published><updated>2007-07-03T09:17:44.644-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS 6 reset - class not registered</title><content type='html'>I was trying to reset iis using the iisreset command and it kept coming back with "Class not registered" error. Turns out that the program IISRSTAS.exe got unregistered. To register it again, run the following command from the console.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:tahoma,arial,sans-serif;font-size:-1;color:#000000;"&gt;c:\windows\system32\inetsrv\iisrstas.exe /RegServer&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;That fixed it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-882934846507066920?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/882934846507066920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=882934846507066920' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/882934846507066920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/882934846507066920'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/07/iis-6-reset-class-not-registered.html' title='IIS 6 reset - class not registered'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8187407025429626294</id><published>2007-06-30T13:50:00.000-06:00</published><updated>2007-08-01T22:00:21.958-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista windows update'/><title type='text'>Vista could not search for new updates error</title><content type='html'>Some of you might have experienced a problem with windows update in Vista. I installed Vista a couple of months ago and had the same problem. Whenever I would try to update my computer, it errored out with the message "Windows could not search for new updates. Error(s) 80244019. I tinkered around it for a few days before I found the reason and the fix. I had supposedly taken the laptop to work and plugged it into a domain, Vista adds a registry key to look for the WSUS server (when you add it to a domain) - hence my update would not work.&lt;br /&gt;&lt;br /&gt;If you have the same problem, here is the resolution. Go to run --&gt; regedit --&gt; HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows. There should be a subkey under this called WindowsUpdate. Delete that WindowsUpdate and the AU key beneath that. Restart your computer and updates should work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8187407025429626294?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8187407025429626294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8187407025429626294' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8187407025429626294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8187407025429626294'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/vista-could-not-search-for-new-updates.html' title='Vista could not search for new updates error'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-5831228424827528105</id><published>2007-06-29T22:20:00.000-06:00</published><updated>2007-11-17T14:07:45.984-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS Migration option'/><title type='text'>SharePoint 2003 to MOSS 2007 migration</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Please see my newer blog &lt;a href="http://faraz-khan.blogspot.com/2007/11/migrating-sharepoint-2003-to-moss-2007_16.html"&gt;entry&lt;/a&gt; where I talk about our migration experience.&lt;br /&gt;&lt;br /&gt;After going back and forth about how we are going to migrate our SharePoint 2003 intranet to MOSS 2007, we decided on using the content database migration approach. The reasons we went with this approach were:&lt;br /&gt;&lt;br /&gt;1) We are moving to a different hosting center because our relationship with the current one is going south. We are also moving to the 64 bit architecture as this will help performance.&lt;br /&gt;2) We have over 100 GB of data, but the majority of data is stored in WSS site collections, not in SPS areas. We only have a few areas and we are willing to lose those, as they do not come over as part of the migration. We also have a few custom site definitions - but we are only interested in upgrading a couple of them. For the ones we want to upgrade, I have written custom site definitions as well as the upgrade definitions that will tell MOSS what to do with that template when it encounters it.&lt;br /&gt;3) We have tried a couple of trial runs of the migration - and things migrated over pretty well for the most part. For what came over and what did not, look for a blog in the near future.&lt;br /&gt;4) Microsoft does not recommend the inplace upgrade because if something went wrong during the migration - you are pretty much hosed.&lt;br /&gt;5) We did not want to go with the gradual migration approach as well because there was signigicant risk in our mind. Some of the risks include installing both MOSS and SharePoint 2003 on one production server, performance issues this may cause, we were running out of disk space on that server, we wanted to move to a different data center etc.&lt;br /&gt;&lt;br /&gt;Those were the reasons. I attended TechEd 2007 and sat through Shane Young and Joel Oleson's migration session. They actually recommend using gradual upgrade option for the most scenarios - unless your database was too large or you wanted to move out of the data center. As you can see above, our case warranted that we go with the content database approach. You should pick one of these approaches, but carefully outline the reasons you are going with either one. This will help you in the long run and ensure a smoother migration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-5831228424827528105?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/5831228424827528105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=5831228424827528105' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5831228424827528105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/5831228424827528105'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/sharepoint-2003-to-moss-2007-migration.html' title='SharePoint 2003 to MOSS 2007 migration'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-4887873621925306429</id><published>2007-06-19T21:26:00.000-06:00</published><updated>2007-06-29T22:18:30.645-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2003 deleting orphans'/><title type='text'>Sharepoint 2003 deleting orphans for migration</title><content type='html'>After reading Joel Olesen's &lt;a href="http://blogs.msdn.com/joelo/archive/2006/07/12/663629.aspx"&gt;blog&lt;/a&gt; and the Microsoft kb on how to delete orphans in Sharepoint 2003 a supported way, I was excited to try it out. I requested the hotfix from Microsoft support and tried to install it in my test SPS 2003 environment - which is not a true representation of production but helps out in some ways regardless. After unzipping the neccessary files, I was left with a STS.msp file. When I tried to run that, I got a screen which said that gave me 2 options - Uninstall WSS 2.0 or repair and reinstall it. This would not fly in production - I did a quick test to find out if I would in fact get the same screen and I did. So I exchanged a few emails with Microsoft support and was told that this was an anamoly in my environments and this works in other environments. So basically I abandoned the approach of trying to delete our orphans and potentially bring down our SPS 2003 environment in the process of doing so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We will live with the orphans and deal with them after the migration to MOSS 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-4887873621925306429?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/4887873621925306429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=4887873621925306429' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/4887873621925306429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/4887873621925306429'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/sharepoint-2003-deleting-orphans-for.html' title='Sharepoint 2003 deleting orphans for migration'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-7466084219927939364</id><published>2007-06-18T23:27:00.001-06:00</published><updated>2007-06-18T23:39:51.474-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007 SSP access denied'/><title type='text'>MOSS 2007 cannot login into SSP</title><content type='html'>I have been involved with installing MOSS 2007 (with the right service accounts) with our Sharepoint administrator in our test environment. One problem we uncovered when creating the SSP application is that the SSP timer service account would take over the app pool credentials and not allow us to login. This is explained below.&lt;br /&gt;&lt;br /&gt;When we created the Web application where the SSP will be hosted, we created a new app pool and added the service account we created (svcMOSSSSPAP) as the app pool identity account in the 'Create web application' page in central admin. Things were great thus far. However, when we went in to create a SSP under that Web application, we would run into a problem where the SSP timer service account that we entered in the SSP creation form (svcMOSSSSP) would end up taking over the app pool identity for the Web application. This would block all access to the SSP. Also, it would not allow us to change the identity in the app pool in IIS (it would reset to the same account everytime we tried to change it). We finally figured out what it was doing and had to create a new app pool in IIS that would use svcMOSSSSPAP as its identity and configured the SSP web application to use that new app pool. We were then able to access the SSP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-7466084219927939364?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/7466084219927939364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=7466084219927939364' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7466084219927939364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/7466084219927939364'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/moss-2007-cannot-login-into-ssp.html' title='MOSS 2007 cannot login into SSP'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-3036089645920751171</id><published>2007-06-16T15:54:00.000-06:00</published><updated>2007-07-18T22:47:03.575-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007 MySites'/><title type='text'>Setting up MOSS 2007 MySites</title><content type='html'>Here is the scenario. We were greatly excited about the new mysites functionality in MOSS 2007. Since a lot of our internal users were not using MySites at all, the business decided that it would be ok to trash the Sharepoint 2003 mysites and users could build their mysites from scratch in MOSS 2007. The other reason this desicion was taken was from a governance and user adoption perspective - the business could tout this as a great new platform and get the users to use MOSS 2007 heavily as their collaboration area.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Needless to say, this made things easy. All of our content was in one big (100 GB) database in Sharepoint 2003, so all mysites came over as site collections using the personal managed path - which the migration automatically created for us. I could go ahead and delete these site collections and start afresh. Hence, I decided to create a new Web application that would separate the content from the big database into a new manageable DB as well as allow for more control and security. After creating a new web application, I created a site collection that used the MySite template (under the enterprise tab). I changed the settings within the SSP administration (user profiles and my sites --&gt; my site settings) to use the new website. All I had to change was personal site services t0 &lt;a href="https://mysiteswebapp/"&gt;https://mysiteswebapp/&lt;/a&gt; and the Personal site location to 'personal'.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then I went into my primary content web application and clicked on the mySite link. Lo and behold, I was directed to mysiteswebapp and a message appeared stating that it was creating the mysite for this user. However, I did run into an error which stated that the managed path 'personal' had not been created for this Web application. So I popped into Central admin and added a managed path called 'personal' for the mysite web app. I tried to create mysite again and this time it worked. Great success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-3036089645920751171?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/3036089645920751171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=3036089645920751171' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3036089645920751171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/3036089645920751171'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/setting-up-moss-2007-mysites.html' title='Setting up MOSS 2007 MySites'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-934894244336107720</id><published>2007-06-15T17:50:00.000-06:00</published><updated>2007-06-30T14:13:22.596-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007 Service accounts'/><title type='text'>MOSS 2007 Service accounts</title><content type='html'>&lt;p&gt;If any of you have tried to install MOSS 2007 with only the service accounts listed in Bill English's book on the service accounts page, you will see the service accounts below.&lt;br /&gt;Setup User&lt;br /&gt;SQL Server Service&lt;br /&gt;Server Farm&lt;br /&gt;SSP App Pool&lt;br /&gt;SSP Service Account&lt;br /&gt;Windows SharePoint Services Search&lt;br /&gt;Search Default Content Access Account&lt;br /&gt;Search Specific Content Access Account&lt;br /&gt;User Profile and Properties Content Access Account&lt;br /&gt;Excel Services Unattended Service Account&lt;br /&gt;App Pool Identity&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In fact, you will need another account to even complete the initial required tasks. That is the Office Server search account. It needs access to the following databases:&lt;/p&gt;&lt;p&gt;Configuration database&lt;br /&gt;SharePoint_AdminContent database&lt;br /&gt;SSP database&lt;br /&gt;SSP search database&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-934894244336107720?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/934894244336107720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=934894244336107720' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/934894244336107720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/934894244336107720'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/moss-2007-service-accounts_15.html' title='MOSS 2007 Service accounts'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-979433571264198870</id><published>2007-06-15T17:47:00.000-06:00</published><updated>2007-06-15T18:43:56.922-06:00</updated><title type='text'>Migrating from Sharepoint 2003 to MOSS 2007</title><content type='html'>So we have been gearing up to migrate our Sharepoint 2003 instance to MOSS 2007 at our company. I will start posting my experiences here very soon so other people can take advantage of our successes and blunders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-979433571264198870?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/979433571264198870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=979433571264198870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/979433571264198870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/979433571264198870'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/06/moss-2007-service-accounts.html' title='Migrating from Sharepoint 2003 to MOSS 2007'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-6209509739392462482</id><published>2007-04-11T22:27:00.001-06:00</published><updated>2007-04-11T22:28:56.298-06:00</updated><title type='text'>Asynchronous programming in .NET</title><content type='html'>&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/03/WickedCode/" target="new"&gt;Here&lt;/a&gt; is a great article about asynchronous programming in .NET. Makes for a good read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-6209509739392462482?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/6209509739392462482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=6209509739392462482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6209509739392462482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/6209509739392462482'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/04/asynchronous-programming-in-net.html' title='Asynchronous programming in .NET'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-1185786876975736641</id><published>2007-04-10T22:48:00.000-06:00</published><updated>2007-04-12T18:03:58.538-06:00</updated><title type='text'>My work website</title><content type='html'>I was one of two people that developed this &lt;a href="http://www.ihs.com" target="new"&gt;website&lt;/a&gt;. This was developed using best practices and Microsoft CMS 2002, ASP.NET 1.1, Web Services, XML and XSL transforms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-1185786876975736641?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/1185786876975736641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=1185786876975736641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1185786876975736641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/1185786876975736641'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/04/i-was-one-of-two-people-that-developed.html' title='My work website'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3997826521443705114.post-8889287926620997739</id><published>2007-04-10T17:09:00.001-06:00</published><updated>2008-10-06T21:23:06.268-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='About me'/><title type='text'>About me</title><content type='html'>Hello everyone. I am a SharePoint and .NET architect/developer based in Denver, Colorado. I architect and develop Web and windows applications in the .NET framework, using established best practices. I also work with other Microsoft products such as SharePoint 2007, SharePoint 2003, Content Management Server 2002, SQL Server among others.&lt;br /&gt;&lt;br /&gt;Starting the second half of 2006, I have been doing a lot of SharePoint 2007 work. We migrated our intranet from SharePoint 2003 to MOSS 2007 and then led a second project to brand the migrated portal. I have also completed a CMS 2002 to MOSS 2007 migration to MOSS. Currently I am architecting, designing and developing a large extranet powered by MOSS 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3997826521443705114-8889287926620997739?l=faraz-khan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://faraz-khan.blogspot.com/feeds/8889287926620997739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3997826521443705114&amp;postID=8889287926620997739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8889287926620997739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3997826521443705114/posts/default/8889287926620997739'/><link rel='alternate' type='text/html' href='http://faraz-khan.blogspot.com/2007/04/about-me.html' title='About me'/><author><name>Faraz</name><uri>http://www.blogger.com/profile/02262163105581718518</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/-NfTGIYtbF9E/TozOvkyRV8I/AAAAAAAAAI4/AbmthgMH3bs/s220/Faraz_Khan_Color.jpg'/></author><thr:total>0</thr:total></entry></feed>
