<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.claritycon.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">George Durzi</title><subtitle type="html" /><id>http://blogs.claritycon.com/blogs/george_durzi/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.claritycon.com/blogs/george_durzi/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2009-04-11T09:46:41Z</updated><entry><title>Brian Harry – Microsoft Technical Fellow – Speaking at Clarity Consulting</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2010/02/18/brian-harry-microsoft-technical-fellow-speaking-at-clarity-consulting.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2010/02/18/brian-harry-microsoft-technical-fellow-speaking-at-clarity-consulting.aspx</id><published>2010-02-19T01:08:06Z</published><updated>2010-02-19T01:08:06Z</updated><content type="html">&lt;p&gt;Join us on Thursday, March 4th from 3 pm - 6 pm for &lt;strong&gt;Visual Studio 2010 and Team Foundation Server 2010&lt;/strong&gt;, presented by Microsoft Technical Fellow, &lt;a href="http://blogs.msdn.com/bharry/"&gt;Brian Harry&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Attend this event to learn more about Microsoft’s vision for developer team solutions.&amp;#160; Brian will cover the key advances for developers in Visual Studio 2010 and Team Foundation Server 2010.&lt;/p&gt;  &lt;p&gt;Attendees will have an opportunity to ask Brian Harry questions around Microsoft’s vision for developer tools and platforms.&amp;#160; This is a great opportunity to connect directly with a very senior and technical developer community leader within Microsoft.&lt;/p&gt;  &lt;p&gt;Ryan Powers from Clarity Consulting will also discuss how Clarity’s project teams use Team Foundation Server as part of the software development lifecycle. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032443618&amp;amp;Culture=en-US" target="_blank"&gt;Registration and more details&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=113709" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Upcoming TechEd and MSDN Events in the Midwest Region</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2010/02/05/upcoming-teched-and-msdn-events-in-the-midwest-region.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2010/02/05/upcoming-teched-and-msdn-events-in-the-midwest-region.aspx</id><published>2010-02-05T13:58:00Z</published><updated>2010-02-05T13:58:00Z</updated><content type="html">&lt;p&gt;I volunteer for INETA as the user group mentor for the Midwest Region (IL, IN, and WI).&amp;nbsp; One of the things I&amp;#39;m planning to do differently this year is to better help spread the word on my blog about events happening in the region, whether they&amp;#39;re Microsoft or user group organized and hosted.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If your user group is hosting an event such as a code camp, send me a short write up and some photos and I&amp;#39;ll make sure it gets published in the INETA newsletter.&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Back to business ... Here&amp;#39;s some info about some Azure and Visual Studio 2010 events that are coming up:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;TechNet Events Present:  Windows Azure, Hyper-V and  Windows 7 Deployment - 8:30am – 12:00pm&lt;/b&gt;&lt;br /&gt;Get the inside track on new tips, tools and technologies for IT pros. Join your TechNet Events team for a look at Windows Azure™ and learn the basics of this new online service computing platform. Next, we’ll explore how to build a great virtual environment with Windows Server® 2008 R2 and Hyper-V™ version 2.0. We’ll wrap this free, half-day of live learning with a tour of easy deployment strategies for Windows® 7.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;TOPICS INCLUDE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; The Next Wave: Windows Azure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Hyper-V: Tools to Build the Ultimate Virtual Test Network&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Automating Your Windows 7 Deployment with MDT 2010&lt;br /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Location&lt;/b&gt;/&lt;b&gt;Registration&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/10/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032438348&amp;amp;Culture=en-US"&gt;Lombard, IL&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3/9/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032439006&amp;amp;Culture=en-US"&gt;Waukesha, WI&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3/11/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032439007&amp;amp;Culture=en-US"&gt;Indianapolis, IN&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;MSDN Events Presents: Cloud Computing and Azure - 1:00pm – 4:30pm&lt;/b&gt;&lt;br /&gt;Join your local MSDN Events as we take a deep dive into cloud computing and the Windows Azure Platform.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;TOPICS INCLUDE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; What is cloud computing?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Running web and web service applications in the cloud&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Using the Windows Azure and local developer cloud fabric&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Getting started – tools, SDKs and accounts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; Writing applications for Windows Azure&lt;br /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Location/Registration&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/10/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032438176&amp;amp;Culture=en-US"&gt;Lombard, IL&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;MSDN Events Presents: Visual Studio 2010, .NET Framework 4.0 and SharePoint Development&amp;nbsp; - 1:00pm – 4:30pm&lt;/b&gt;&lt;br /&gt;Join your local MSDN Events team for a lively tour our latest version of Visual Studio and the .NET Framework. We’ll start with an overview the IDE and explore how you can use the latest features to develop great applications in a flash. Next, we’ll look at the newest changes to the .NET Framework and how you can leverage them today.&amp;nbsp; Finally, we end the day by looking at the new tools in Visual Studio that will supercharge your SharePoint development.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;TOPICS INCLUDE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; What’s new in Visual Studio 2010&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; What’s new in .NET Framework 4.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; •&amp;nbsp;&amp;nbsp;&amp;nbsp; SharePoint Development using Visual Studio 2010&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Location/Registration&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3/9/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032439300&amp;amp;Culture=en-US"&gt;Waukesha, WI&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3/11/2010&lt;/td&gt;&lt;td&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032439301&amp;amp;Culture=en-US"&gt;Indianapolis, IN&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=108515" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Speaking at the Central Illinois SharePoint User Group on 1/21/2010</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/12/29/speaking-at-the-central-illinois-sharepoint-user-group-on-1-21-2010.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/12/29/speaking-at-the-central-illinois-sharepoint-user-group-on-1-21-2010.aspx</id><published>2009-12-29T16:53:00Z</published><updated>2009-12-29T16:53:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;ll be speaking at the Central Illinois SharePoint User Group in Springfield, IL&amp;nbsp;at 9:00AM on Thursday, January 21st 2010.&lt;/p&gt;
&lt;p&gt;The topic will be &lt;strong&gt;Building Communications Enabled Applications with OCS and Exchange&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Office Communications Server 2007 R2 and Exchange 2010 enable the development of communication enabled applications more quickly and easily than ever before.&amp;nbsp; In this session you will learn about the core features included in the new platform SDKs and see a demo application built around a retail enterprise that utilizes each of the scenarios the platform enables.&amp;nbsp; You will also learn about opportunities for integrating OCS and Exchange into your SharePoint applications. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More details on location and registration&amp;nbsp;areavailable at &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=144377"&gt;https://www.clicktoattend.com/invitation.aspx?code=144377&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=100434" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author><category term="Community" scheme="http://blogs.claritycon.com/blogs/george_durzi/archive/tags/Community/default.aspx" /></entry><entry><title>Querying Free/Busy Data with Exchange Web Services Managed API 1.0 SDK</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/11/11/querying-free-busy-data-with-exchange-web-services-managed-api-1-0-sdk.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/11/11/querying-free-busy-data-with-exchange-web-services-managed-api-1-0-sdk.aspx</id><published>2009-11-12T01:54:40Z</published><updated>2009-11-12T01:54:40Z</updated><content type="html">  &lt;p&gt;This week at TechEd Europe 2009, Microsoft officially launched Exchange Server 2010 and the &lt;a href="http://msdn.microsoft.com/en-us/library/dd633710.aspx"&gt;Exchange Web Services Managed API 1.0 SDK&lt;/a&gt;.&amp;#160; This API provides a managed wrapper around Exchange Web Services, eliminating the need to work directly with SOAP or with proxy classes generated when adding a web reference to your environment’s Exchange Web Services url. &lt;/p&gt;  &lt;p&gt;The release version of EWSMA includes improved support for Exchange Web Services features such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Free/Busy &lt;/li&gt;    &lt;li&gt;Autodiscover &lt;/li&gt;    &lt;li&gt;Timezones &lt;/li&gt;    &lt;li&gt;Impersonation &lt;/li&gt;    &lt;li&gt;Search &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this post, I’ll demonstrate using EWSMA to query the Exchange free/busy service to find a meeting time that is most suitable for a set of participants. &lt;/p&gt;  &lt;h4&gt;Referencing the Exchange Web Services Managed API 1.0 SDK&lt;/h4&gt;  &lt;p&gt;The Exchange Web Services Managed API 1.0 SDK is installed by default to &lt;u&gt;C:\Program Files\Microsoft\Exchange\Web Services\1.0&lt;/u&gt;, you need to reference &lt;strong&gt;Microsoft.Exchange.WebServices.dll&lt;/strong&gt;.&lt;/p&gt;  &lt;h4&gt;Improved Autodiscover&lt;/h4&gt;  &lt;p&gt;The Exchange Autodiscover service provides clients with a way to retrieve the url to use to connect to Exchange Web Services.&amp;#160; For a majority of deployments, there is one url for Exchange Web Services.&amp;#160; However, consider large, global Exchange deployments…the Autodiscover server can for example “auto discover” the most geographically appropriate web service endpoint for a client such as Outlook to connect to. &lt;/p&gt;  &lt;p&gt;If you’ve worked with Exchange Web Services in the past, you know that&amp;#160; autodiscover’ing the url for Exchange Web Services involved a lot of code, this is what it looks like now:&lt;/p&gt;   &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="op"&gt;ExchangeService&lt;/span&gt; service = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;ExchangeService();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;service.AutodiscoverUrl(String.Format(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="str"&gt;&amp;quot;{0}@{1}.com&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="op"&gt;Environment&lt;/span&gt;.UserName, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="op"&gt;Environment&lt;/span&gt;.UserDomainName));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h4&gt;Set up Availability Options&lt;/h4&gt;

&lt;p&gt;Before querying the free/busy service, you need to specify some options that the service will use to retrieve a list of meeting time suggestions – this is represented by a class called &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.availabilityoptions.aspx"&gt;AvailabilityOptions&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="op"&gt;AvailabilityOptions&lt;/span&gt; availabilityOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvailabilityOptions();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;availabilityOptions.MeetingDuration = 60;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;availabilityOptions.MaximumNonWorkHoursSuggestionsPerDay = 4;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;availabilityOptions.MinimumSuggestionQuality = &lt;span class="op"&gt;SuggestionQuality&lt;/span&gt;.Good;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;availabilityOptions.RequestedFreeBusyView = &lt;span class="op"&gt;FreeBusyViewType&lt;/span&gt;.FreeBusy;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Check out the SDK documentation to explore other options you can set when creating an instance of &lt;strong&gt;AvailabilityOptions.&amp;#160; &lt;/strong&gt;In this case, we’re looking for a 60 minute time slot, allowing some flexibility to schedule the meeting outside of working hours, setting the minimum suggestion quality to Good, and only requesting the FreeBusy view after querying the service. &lt;/p&gt;

&lt;h4&gt;Get Availability Results&lt;/h4&gt;

&lt;p&gt;First, create a &lt;strong&gt;List&amp;lt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.attendeeinfo.aspx"&gt;AttendeeInfo&lt;/a&gt;&amp;gt; &lt;/strong&gt;to store the list of contacts to include in the request to the free/busy service.&amp;#160; In this case, you can see how to add different attendee types to the list, e.g. the organizer, a required attendee, and a room resource.&lt;/p&gt;


&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;List&amp;lt;&lt;span class="op"&gt;AttendeeInfo&lt;/span&gt;&amp;gt; attendees = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="op"&gt;AttendeeInfo&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;attendees.Add(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;AttendeeInfo&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        SmtpAddress = &lt;span class="str"&gt;&amp;quot;rl@fabrikam.com&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        AttendeeType = &lt;span class="op"&gt;MeetingAttendeeType&lt;/span&gt;.Organizer&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;attendees.Add(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;AttendeeInfo&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        SmtpAddress = &lt;span class="str"&gt;&amp;quot;sc@fabrikam.com&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        AttendeeType = &lt;span class="op"&gt;MeetingAttendeeType&lt;/span&gt;.Required&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;attendees.Add(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;AttendeeInfo&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        SmtpAddress = &lt;span class="str"&gt;&amp;quot;boardroom@fabrikam.com&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        AttendeeType = &lt;span class="op"&gt;MeetingAttendeeType&lt;/span&gt;.Room&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    });&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;With the attendee list set up, create an instance of &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.getuseravailabilityresults.aspx"&gt;GetUserAvailabilityResults&lt;/a&gt; &lt;/strong&gt;to store the meeting suggestions returned by the free/busy service.&amp;#160; &lt;/p&gt;


&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="op"&gt;GetUserAvailabilityResults&lt;/span&gt; availabilityResults =&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;     service.&lt;span class="op"&gt;GetUserAvailability&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        attendees,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;TimeWindow&lt;/span&gt;(&lt;span class="op"&gt;DateTime&lt;/span&gt;.Now, &lt;span class="op"&gt;DateTime&lt;/span&gt;.Now.AddDays(1)),&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="op"&gt;AvailabilityData&lt;/span&gt;.FreeBusyAndSuggestions,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        availabilityOptions);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I want to point out a gotcha here.&amp;#160; When&amp;#160; &lt;strong&gt;AvailabilityOptions.RequestedFreeBusyView&lt;/strong&gt; is set to &lt;strong&gt;FreeBusyViewType.FreeBusy&lt;/strong&gt;, the time window for the call to &lt;strong&gt;GetUserAvailability &lt;/strong&gt;needs to be at least 24 hours.&amp;#160; I’m not sure of the reasoning for this but if its set to a shorter time window, the call &lt;u&gt;sometimes&lt;/u&gt; throws an exception about an invalid time window. &lt;/p&gt;

&lt;h4&gt;Explore Suggested Meeting Times&lt;/h4&gt;

&lt;p&gt;You can now explore the suggested meeting times&amp;#160; returned by the free/busy service.&amp;#160; &lt;/p&gt;

&lt;p&gt;The results are in the form of a &lt;strong&gt;List&amp;lt;&lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.suggestion.aspx"&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &lt;/strong&gt;where &lt;strong&gt;Suggestion&lt;/strong&gt; describes the date and quality of the suggestion, and a collection of individual &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.timesuggestion.aspx"&gt;TimeSuggestion&lt;/a&gt;s.&amp;#160; A TimeSuggestion describes any conflicts at the suggested time, whether or not the suggestion occurs during working hours, the suggested time and quality of the meeting. &lt;/p&gt;

&lt;p&gt;Unless you set a time window of more than 1 day, you’ll probably just want to grab &lt;strong&gt;availabilityResults.Suggestions[0]&lt;/strong&gt; and pick the most suitable TimeSuggestion in &lt;strong&gt;availabilityResults.Suggestions[0].TimeSuggestions&lt;/strong&gt; according to whatever criteria are suitable for your application.&lt;/p&gt;

&lt;h4&gt;Book the Meeting&lt;/h4&gt;

&lt;p&gt;It’s just as easy to book the appointment directly from your application.&amp;#160; Assuming that &lt;strong&gt;suggestion &lt;/strong&gt;is an instance of a &lt;strong&gt;TimeSuggestion&lt;/strong&gt; that you want to book:&lt;/p&gt;


&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Create the appointment and set its properties&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="op"&gt;Appointment&lt;/span&gt; appointment = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="op"&gt;Appointment&lt;/span&gt;(service);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="rem"&gt;// Set the appointment title&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;appointment.Subject = &lt;span class="str"&gt;&amp;quot;Team Meeting&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="rem"&gt;// Set the appointment start and end time&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;appointment.Start = suggestion.MeetingTime;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;appointment.End = suggestion.MeetingTime.AddMinutes(availabilityOptions.MeetingDuration);   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="rem"&gt;// Add the conference room as a meeting resource&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;appointment.Resources.Add(&lt;span class="str"&gt;&amp;quot;Board Room&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&lt;a href="mailto:boardroom@fabrikam.com"&gt;boardroom@fabrikam.com&lt;/a&gt;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="rem"&gt;// Set the meeting location to display name of the conference room&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;appointment.Location = &lt;span class="str"&gt;&amp;quot;Board Room&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="rem"&gt;// Save the appointment&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;appointment.Save();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h4&gt;Summary&lt;/h4&gt;

&lt;p&gt;You’ve seen how easy it is to include Outlook-style functionality into your custom applications.&amp;#160; This didn’t use to be as simple, unless you loved working with WebDAV or CDO, or writing some sweet asynchronous WebRequest code… &lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=97927" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Slides and Source Code from CSPUG Talk</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/09/10/slides-and-source-code-from-cspug-talk.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/09/10/slides-and-source-code-from-cspug-talk.aspx</id><published>2009-09-10T22:23:00Z</published><updated>2009-09-10T22:23:00Z</updated><content type="html">&lt;p&gt;I spoke today&amp;nbsp;at the Chicago SharePoint User Group about Building Public Facing SharePoint sites. Thanks to Michael and Asif for inviting me, I&amp;#39;m looking forward to doing this again in the future. &lt;/p&gt;
&lt;p&gt;You can download the presentation slides and the source code for the sample site I demo&amp;#39;d &lt;a href="http://employees.claritycon.com/gdurzi/Blog/CSPUG.zip"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Thanks to everybody who attended and asked great questions. &lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=88780" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Building a Twitter Recommendation Engine for Gadfly</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/09/01/building-a-twitter-recommendation-engine-for-gadfly.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/09/01/building-a-twitter-recommendation-engine-for-gadfly.aspx</id><published>2009-09-01T22:19:59Z</published><updated>2009-09-01T22:19:59Z</updated><content type="html">&lt;p&gt;I recently got a chance to help out on &lt;a href="http://gadfly.claritycon.com/"&gt;Gadfly&lt;/a&gt;, a twitter client that &lt;a href="http://twitter.com/SteveHolstad"&gt;@SteveHolstad&lt;/a&gt;, &lt;a href="http://twitter.com/leeiroth"&gt;@leeiroth&lt;/a&gt;, and &lt;a href="http://twitter.com/eklimcz"&gt;@eklimcz&lt;/a&gt; from Clarity are working on.&amp;#160; If you haven’t had a chance to check it out, I definitely recommend it, I’ve been waiting for a long while for a great web-based twitter client to show up! &lt;/p&gt;  &lt;p&gt;Gadfly allows you to rate individual tweets from 1 to 5 stars.&amp;#160; Using this ratings data, we started looking into building a recommendation engine that would suggest other tweeple that you might find interesting. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.claritycon.com/blogs/george_durzi/11_0D63BD51.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="1[1]" border="0" alt="1[1]" src="http://blogs.claritycon.com/blogs/george_durzi/11_thumb_6D48B093.png" width="244" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;How a Twitter Reputation Algorithm Needs to Work&lt;/h4&gt;  &lt;p&gt;As I was researching how I would build such a recommendation engine, &lt;a href="http://twitter.com/goodoldschu"&gt;@goodoldschu&lt;/a&gt; forwarded me an article titled &lt;a href="http://searchengineland.com/how-a-twitter-reputation-algorithm-needs-to-work-19017"&gt;How a Twitter Reputation Algorithm Needs to Work&lt;/a&gt;.&amp;#160; The author does a great job of describing what he thinks should and should not matter in a twitter reputation algorithm:&lt;/p&gt;  &lt;p&gt;Should Matter:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Co-follower rate:&amp;#160; when two people follow the same people, you can numerically represent how similar their tastes are.&amp;#160; This is a crucial concept for most recommendation algorithms. &lt;/li&gt;    &lt;li&gt;What your followers follow, and what they tweet about:&amp;#160; if you index the text of individual tweets, you can do some very interesting stuff such as clustering similar tweeple into groups, e.g. people who tweet about a certain technology. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Shouldn’t Matter:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Follower counts &lt;/li&gt;    &lt;li&gt;When you started tweeting &lt;/li&gt;    &lt;li&gt;Frequency of tweets &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pretty straightforward… Your follower count, when you started tweeting, and how often you tweet don’t represent the &lt;em&gt;quality &lt;/em&gt;of your tweets.&amp;#160; These metrics have no place in a twitter recommendation algorithm. &lt;/p&gt;  &lt;h4&gt;Practical Challenges&lt;/h4&gt;  &lt;p&gt;There are some practical challenges, however, when trying to incorporate the “should matter” metrics into a twitter recommendation algorithm; I’ll explain those as they relate to Gadfly in particular. &lt;/p&gt;  &lt;p&gt;Gadfly is a web based application build in Silverlight; it uses &lt;a href="http://silverlight.net/blogs/msnow/archive/2008/07/16/tip-of-the-day-19-using-isolated-storage.aspx"&gt;isolated storage&lt;/a&gt; as a virtual file system to store application data on your machine.&amp;#160; We’re somewhat limited in how much data we can store in isolated storage, e.g. 1MB for an in-browser Silverlight application. &lt;/p&gt;  &lt;p&gt;So why not store followers and tweet content in a central database?&amp;#160; If storage space weren’t an issue, this would certainly be feasible.&amp;#160; However, we didn’t want to get into the business of constantly querying follower and following lists and storing them in our database, let alone storing the content (raw or indexed) of tweets.&amp;#160; There’s also the matter of how quickly we’d eat into the twitter API rate limit with these operations. &lt;/p&gt;  &lt;h4&gt;Enter Ratings&lt;/h4&gt;  &lt;p&gt;The best way to explain this is to use the good old Netflix movie ratings example.&amp;#160; &lt;/p&gt;  &lt;p&gt;Netflix allows users to rate movies that they have watched.&amp;#160; When new users join Netflix and begin rating movies, you can compare their preferences to existing users that have rated those same movies.&amp;#160; Based on this data, you can identify a set of existing users who are most “similar” to the new users and use these users’ ratings for other movies to fill in the gaps in the new user’s profile.&amp;#160; For example, a recommendation engine can predict that you would give &lt;strong&gt;The Bourne Supremacy&lt;/strong&gt; a rating of 4 stars and place it on your recommended list. &lt;/p&gt;  &lt;p&gt;This describes the &lt;a href="http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm"&gt;KNN (K-Nearest Neighbor)&lt;/a&gt; algorithm in its simplest form.&amp;#160; This is the algorithm that Netflix uses (albeit with a ton of tweaks and optimizations) to recommend movies to users. &lt;/p&gt;  &lt;p&gt;How does this apply to a twitter recommendation engine?&amp;#160; Instead of rating movies, you rate tweets.&amp;#160; Since you’re rating the same twitter user multiple times, we average out this rating to come up with a single rating.&amp;#160; This gives us a single figure that represents a Gadfly user rating a twitter user.&amp;#160; &lt;em&gt;Over time, we’ll probably calculate the average based on more recent tweets, otherwise new ratings will have little to no effect on the calculation. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;When other Gadfly users rate the same twitter user, we can compute how similar these users’ tastes are.&amp;#160; We can then predict what rating users will give to twitter users that they haven’t rated.&amp;#160; If the predicted rating is above an acceptable threshold that we set, we can recommend that twitter user as a Gadfly Pick. &lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Computing Similarity&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.claritycon.com/blogs/george_durzi/21_0494BD56.png"&gt;&lt;img style="border-right-width:0px;margin:0px 20px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="2[1]" border="0" alt="2[1]" align="left" src="http://blogs.claritycon.com/blogs/george_durzi/21_thumb_621F2649.png" width="220" height="283" /&gt;&lt;/a&gt;The process that powers a KNN-based recommendation engine is always run in batch mode due to the computational intensity that is involved.&lt;/p&gt;  &lt;p&gt;The first step is to calculate the similarity (or correlation) between every set of two users using a coefficient such as &lt;a href="http://en.wikipedia.org/wiki/Correlation"&gt;Pearson&lt;/a&gt;.&amp;#160;&amp;#160; This is a number between 0 and 1, with 0 meaning that the users are not similar at all, and 1 meaning that they are as similar as they can be.&lt;/p&gt;  &lt;p&gt;The key here though is that you can’t measure correlation between two users unless they have some ratings in common – we define this parameter to the algorithm as the &lt;strong&gt;Minimum Number of Ratings in Common&lt;/strong&gt;.&amp;#160; Realizing that at first our data will be very sparse, we set this to &lt;strong&gt;1 - &lt;/strong&gt;we can tweak this as more Gadfly users enter ratings.&amp;#160; We can increase this to make the engine more selective as we get more ratings data. &lt;/p&gt;  &lt;p&gt;To the left is example of some of the ratings data, this is all sample data so the similarity numbers are artificially high. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.claritycon.com/blogs/george_durzi/21_4B7DE053.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Generating Picks&lt;/h4&gt;  &lt;p&gt;Now that the system has computed all possible combinations of similarity among users with a minimum number of ratings in common, the next step is to generate the Gadfly Picks for each user. &lt;/p&gt;  &lt;p&gt;When computing the picks for a particular user, e.g. UserId 67 in the above sample data, the &lt;strong&gt;K &lt;/strong&gt;from &lt;strong&gt;K&lt;/strong&gt;NN refers to the number of most similar users that the algorithm will use to predict ratings for twitter users that User 67 hasn’t rated.&amp;#160; If the predicted rating is greather than a specified threshold, we recommend that twitter user to User 67 and they appear in their Gadfly Picks timeline.&amp;#160; &lt;/p&gt;  &lt;p&gt;So if we’re using a value of &lt;strong&gt;K=3&lt;/strong&gt; and the above sample data to put together the Gadfly Picks for User 67, the top 3 similar users are 68, 71, and 74 with Pearson values of 1.0, 1.0, and 0.992583334.&amp;#160; Let’s use those numbers to predict how User 67 would rate a particular twitter user, assuming the following information on how User 67’s top 3 most similar users have rated that twitter user:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Similarity&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Rating&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;68&lt;/td&gt;        &lt;td&gt;1&lt;/td&gt;        &lt;td&gt;2&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;71&lt;/td&gt;        &lt;td&gt;1&lt;/td&gt;        &lt;td&gt;3&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;74&lt;/td&gt;        &lt;td&gt;0.992583334&lt;/td&gt;        &lt;td&gt;2&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Predicted Rating&lt;/strong&gt; = (2*1 + 3*1 + 2*0.992583334) / (1 + 1 + 0.992583334) =6.985166668 / 2.992583334 &lt;strong&gt;= ~2.33&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The predicted rating should be pretty self explanatory.&amp;#160; If the three Gadfly users that User 67 is most similar to gave this twitter user ratings of 2, 3, and 2, a predicted rating of 2.33 is right in line. &lt;/p&gt;  &lt;p&gt;We currently have the value of &lt;strong&gt;Predicted Rating Threshold&lt;/strong&gt; set to &lt;u&gt;3.5&lt;/u&gt; – this user wouldn’t make the cut. &lt;/p&gt;  &lt;p&gt;Right now we’re generating each user’s Gadfly Picks once a day, we can make this more frequent as usage increases.&amp;#160; It will be very interesting to see how much we have to tweak the backend SQL when it has to deal with much larger datasets. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.claritycon.com/blogs/george_durzi/31_6629741B.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="3[1]" border="0" alt="3[1]" src="http://blogs.claritycon.com/blogs/george_durzi/31_thumb_4204198C.png" width="317" height="324" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Limitations and Opportunities for Improvement&lt;/h4&gt;  &lt;p&gt;I’m excited to get this rolled out in the next couple of days, but I can already identify several areas which I want to work on improving after we iron out the initial kinks.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Twitter Users in a Search Timeline have a Twitter User Id = 0&lt;/h5&gt;  &lt;p&gt;As I understand it, the twitter search API hasn’t yet been integrated into twitter’s core API.&amp;#160; The implication of this for us is that the Twitter User Id of a twitter user in a search timeline is always 0.&amp;#160; We’re thus not able to relate that user to an actual twitter user and can’t use that piece of ratings data.&amp;#160; Hopefully this will be a non-issue as the APIs continue to come together. &lt;/p&gt;  &lt;h5&gt;The Engine Recommends Me to Me&lt;/h5&gt;  &lt;p&gt;I thought it was funny when I saw myself as a Gadfly Pick, we need to tweak the algorithm so that I’m not recommended to myself!&lt;/p&gt;  &lt;h5&gt;Ability to Rate the Recommendations &lt;/h5&gt;  &lt;p&gt;The only way to truly measure the effectiveness of a recommendation algorithm is to compare the predicted rating to the actual rating provided by the user.&amp;#160; The functionality is currently there to rate the recommended picks.&amp;#160; We haven’t proved this out yet, but we suspect that the algorithm will automagically take care of things. &lt;/p&gt;  &lt;p&gt;We’ll be rolling this out in the next day or two, I’m really interested in taking a look at the quality of the ratings as we get more realistic data. &lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=88667" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Speaking at Chicago SharePoint User Group on September 10th 2009</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/08/06/speaking-at-chicago-sharepoint-user-group-on-september-10th-2009.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/08/06/speaking-at-chicago-sharepoint-user-group-on-september-10th-2009.aspx</id><published>2009-08-06T15:30:15Z</published><updated>2009-08-06T15:30:15Z</updated><content type="html">&lt;p&gt;I’ll be speaking at the &lt;a href="https://ug.culminis.com/sites/chicagosharepoint/default.aspx"&gt;Chicago SharePoint User Group&lt;/a&gt;’s monthly meeting on September 10th 2009. The meeting is scheduled from 1pm to 4pm at the &lt;a href="http://www.microsoft.com/About/CompanyInformation/usaoffices/midwest/downersgrove.mspx"&gt;Microsoft office in Downers Grove, IL&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Interested in seeing what it takes to build out a public facing site using SharePoint?&amp;#160; My talk will cover areas such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Publishing workflow&lt;/li&gt;    &lt;li&gt;Server and network topology of a public facing SharePoint site&lt;/li&gt;    &lt;li&gt;Organizing your SharePoint solutions&lt;/li&gt;    &lt;li&gt;Publishing site definitions&lt;/li&gt;    &lt;li&gt;Branding&lt;/li&gt;    &lt;li&gt;Packaging the site’s assets&lt;/li&gt;    &lt;li&gt;Configuring content deployment&lt;/li&gt;    &lt;li&gt;Setting up anonymous access&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’ll also go over some special considerations for public facing SharePoint sites such as page payload size, accessibility, and search engine optimization. &lt;/p&gt;  &lt;p&gt;More details and registration information should be available soon on the CSPUG site, hope to see you there! &lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=88350" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Package Environment Specific Settings into a Silverlight XAP using Team Build</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/30/package-environment-specific-settings-into-a-silverlight-xap-using-team-build.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/30/package-environment-specific-settings-into-a-silverlight-xap-using-team-build.aspx</id><published>2009-06-30T16:12:20Z</published><updated>2009-06-30T16:12:20Z</updated><content type="html">&lt;p&gt;This one’s for you @SteveHolstad!&lt;/p&gt;  &lt;p&gt;I was helping one of our teams ease the deployment of a Silverlight project into various server environments.&amp;#160; The project contained a &lt;strong&gt;ServiceReferences.ClientConfig&lt;/strong&gt; file to reference some WCF services in the solution.&amp;#160; When deploying the project to a Development, Staging, or Production environment, the team had to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Un-XAP the Silverlight XAP &lt;/li&gt;    &lt;li&gt;Copy in an environment specific ServiceReferences.ClientConfig file (or edit) &lt;/li&gt;    &lt;li&gt;Re-XAP the Silverlight XAP &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here’s how to do this pretty easily with TFS Team Build.&lt;/p&gt;  &lt;p&gt;I like to store environment specific settings in the source control branch that corresponds to that environment.&amp;#160; In the Dev branch (which translates to our Development Integration environment), I created a version of ServiceReferences.ClientConfig with the appropriate environment specific service bindings and placed it at. &lt;u&gt;&lt;strong&gt;$\MyTeamProject\Dev\Env\Config\Services\ServiceReferences.ClientConfig&lt;/strong&gt;&lt;/u&gt;. &lt;/p&gt;  &lt;p&gt;In the Team Project’s build definition, you can now tap into the &lt;strong&gt;BeforeCompile &lt;/strong&gt;target and do the following:&lt;/p&gt;   &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BeforeCompile&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(SolutionRoot)\Env\Config\Services\ServiceReferences.ClientConfig&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Output&lt;/span&gt; &lt;span class="attr"&gt;ItemName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ServiceReferences&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TaskParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Include&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@(ServiceReferences)&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;      &lt;span class="attr"&gt;DestinationFolder&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(SolutionRoot)\Source\MySilverlightProject&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;      &lt;span class="attr"&gt;OverwriteReadOnlyFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The first thing that a Team Build does is get the latest code from source control, and place it in a working directory on the build agent.&amp;#160; The new BeforeCompile target replaces the ServiceReferences.ClientConfig in the working directory with the environment specific one.&amp;#160; &lt;/p&gt;

&lt;p&gt;And it does it &lt;strong&gt;BEFORE COMPILE&lt;/strong&gt;!&amp;#160; When TFS then compiles the &lt;strong&gt;MySilverlightProject &lt;/strong&gt;project, the resulting XAP will contain the environment specific version of ServiceReferences.ClientConfig. &lt;/p&gt;

&lt;p&gt;This of course assumes that you’re structured your source control in such a way where you can point different Team Build definitions at different branches or directories in your source tree.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=78767" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Moving MOSS Intranet to a New WFE</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/30/moving-moss-intranet-to-a-new-wfe.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/30/moving-moss-intranet-to-a-new-wfe.aspx</id><published>2009-06-30T14:01:46Z</published><updated>2009-06-30T14:01:46Z</updated><content type="html">&lt;p&gt;This probably falls under SharePoint Administration 101, but as a developer, I was pleasantly surprised at how easy it was to move our MOSS 2007 intranet to a new web front end. &lt;/p&gt;  &lt;p&gt;Our environment is very simple: 1 SharePoint WFE and a separate SQL Server which is shared by several other applications.&amp;#160; Our old WFE recently started acting up and we figured that we better get a new server up and running before this one GPF’d.&amp;#160; It also ran a 32-bit version of Windows Server 2003, and we wanted to upgrade to Windows Server 2008 x64. &lt;/p&gt;  &lt;p&gt;It was also important for us to not have to do any DNS changes.&amp;#160; If that doesn’t work for you, you’ll have to adjust these instructions slightly. &lt;/p&gt;  &lt;p&gt;The whole process was pretty simple, here are the steps I followed:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Install Windows 2008 Server x64 on the new server&lt;/li&gt;    &lt;li&gt;Install MOSS but &lt;strong&gt;do not run&lt;/strong&gt; the SharePoint Products and Technologies Configuration Wizard&lt;/li&gt;    &lt;li&gt;Bring up the new server to the same patch level as the farm&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;In this case, I took the opportunity to bring everything up to SP2&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Run the SharePoint Products and Technologies Configuration Wizard on the new server&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Connect the server to the farm&lt;/li&gt;      &lt;li&gt;Host the Central Administration site on the server&lt;/li&gt;      &lt;li&gt;Let the wizard do its thing&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;At this point, you have a another fully functioning WFE in your farm.&amp;#160; However, it won’t be able to serve any requests because as far as DNS is concerned, it doesn’t exist.&amp;#160; You can browse to your site at the server’s IP address to make sure that everything is working. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Send a nice email to your users to let them know that the farm will be down while you do this&lt;/li&gt;    &lt;li&gt;Run the SharePoint Products and Technologies Configuration Wizard on the old server&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Disconnect the server from the farm&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Change the old server’s IP address to something else&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Your farm is now inaccessible until you assign the old server’s IP address to the new server. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Assign the old server’s IP address to the new server&lt;/li&gt;    &lt;li&gt;Install your SSL certificate (if applicable) on the new server&lt;/li&gt;    &lt;li&gt;Set your host headers in IIS on the new server&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That’s it!&amp;#160; Go through Central Administration and make sure all your services are started, you should be good to go. &lt;/p&gt;  &lt;p&gt;A couple of interesting things I learned while doing this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Don’t know why you’d want to do this, but it looks like your WFEs can be running different version of Windows Server&lt;/li&gt;    &lt;li&gt;You have to apply your host headers manually in IIS.&amp;#160; Not surprising because the wizard probably has no clue what you have going on for DNS and load balancing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now I need to work on getting Windows Rights Management Services off the old server!&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=78759" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>SharePoint Saturday Chicago Session Recap</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/16/sharepoint-saturday-chicago-session-recap.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/16/sharepoint-saturday-chicago-session-recap.aspx</id><published>2009-06-16T14:03:53Z</published><updated>2009-06-16T14:03:53Z</updated><content type="html">&lt;p&gt;SharePoint Saturday Chicago was this past Saturday, June 13th at the Tribune Tower in Chicago.&lt;/p&gt;  &lt;p&gt;Kudos to Kris Wagner and the rest of the organizing committee for pulling off a great event, I’m already looking forward to next year. &lt;/p&gt;  &lt;p&gt;My session was titled: &lt;strong&gt;Building Public Facing SharePoint Sites&lt;/strong&gt;.&amp;#160; Using a SharePoint publishing site that I built out for the presentation, I went over the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Publishing workflow&lt;/li&gt;    &lt;li&gt;Topology of the solution&lt;/li&gt;    &lt;li&gt;Tips for organizing your Visual Studio solutions&lt;/li&gt;    &lt;li&gt;Using publishing site definitions&lt;/li&gt;    &lt;li&gt;Packaging your run-once assets&lt;/li&gt;    &lt;li&gt;Configuring and running content deployment&lt;/li&gt;    &lt;li&gt;Setting up anonymous access&lt;/li&gt;    &lt;li&gt;Special considerations for public sites&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As promised, here is my &lt;a href="http://Employees.claritycon.com/gdurzi/Blog/SPSSessionRecap/SPSChicago-gdurzi.pptx"&gt;presentation&lt;/a&gt;, and the &lt;a href="http://Employees.claritycon.com/gdurzi/Blog/SPSSessionRecap/SPSaturdayChicago2009.zip"&gt;complete source code&lt;/a&gt; for the publishing site that I demo’d. &lt;/p&gt;  &lt;p&gt;There was some great discussion, it was helpful to hear about the experiences of other people working on SharePoint publishing sites – it was comforting to see that we all also suffered over the same issues!&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=77551" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>INETA Regional Speaker Program</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/09/ineta-regional-speaker-program.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/09/ineta-regional-speaker-program.aspx</id><published>2009-06-09T21:30:41Z</published><updated>2009-06-09T21:30:41Z</updated><content type="html">&lt;p&gt;I recently took on the role of INETA User Group Mentor for Illinois, Wisconsin, and Indiana.&amp;#160; As a user group mentor, my responsibilities include being the groups’ primary INETA contact, as well as being among the first to hear about exciting programs coming out of INETA. &lt;/p&gt;  &lt;p&gt;INETA recently announced the &lt;a href="http://www.ineta.org/RegionalSpeakers/Default.aspx"&gt;Regional Speakers Program&lt;/a&gt; to help formalize the process around identifying local speakers. &lt;/p&gt;  &lt;p&gt;Some excerpts from the announcement:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This new initiative is designed to help user groups coordinate speaking engagements for meetings and community events such as code camps connect with local and regional speakers. Long term, we (INETA) hope to use this as a staging ground to evaluate regional speakers for the national Speakers Bureau. The first phase of the program, registering speakers and connecting user groups with Regional Speakers, is now available.&lt;/p&gt;    &lt;p&gt;We invite you to &lt;a href="http://www.ineta.org/RegionalSpeakers/Profile.aspx"&gt;register as a Regional Speaker&lt;/a&gt; on the &lt;a href="http://www.ineta.org/"&gt;INETA web site&lt;/a&gt; and enroll in the program. The registration is open to all, so please feel free to forward.&lt;/p&gt;    &lt;p&gt;User Group leaders are encouraged to &lt;a href="http://www.ineta.org/RegionalSpeakers/SearchRegionalSpeakers.aspx"&gt;search for regional speakers&lt;/a&gt; and contact them directly via the website. The link will launch a peer-to-peer email conversation for you to make appropriate arrangements. The program is designed such that a user group could potentially schedule all of its speakers.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=76803" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Programming for Unified Communications with Microsoft® Office Communications Server 2007 R2 Book is Now Available</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/08/programming-for-unified-communications-with-microsoft-174-office-communications-server-2007-r2-book-is-now-available.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/06/08/programming-for-unified-communications-with-microsoft-174-office-communications-server-2007-r2-book-is-now-available.aspx</id><published>2009-06-09T02:16:14Z</published><updated>2009-06-09T02:16:14Z</updated><content type="html">&lt;p&gt;If you’re looking for the definitive reference for programming against Microsoft Office Communications Server 2007 R2, be sure to check out &lt;a href="http://www.amazon.com/gp/product/0735626235/ref=s9_sims_gw_s0_p14_i1?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-2&amp;amp;pf_rd_r=1ZAHQB03KQ668T6Z6XM7&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=470938631&amp;amp;pf_rd_i=507846"&gt;Programming for Unified Communications with Microsoft® Office Communications Server 2007 R2&lt;/a&gt;, published by Microsoft Press and now available at your favorite retailer of books! &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0735626235/ref=s9_sims_gw_s0_p14_i1?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-2&amp;amp;pf_rd_r=1ZAHQB03KQ668T6Z6XM7&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=470938631&amp;amp;pf_rd_i=507846"&gt;Go get it at Amazon.com.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I helped one of the authors – &lt;a href="http://blogs.msdn.com/cmayo/"&gt;Chris Mayo&lt;/a&gt; – review his chapters on programming against the Office Communicator SDK, so I’ve seen first hand the quality of the content in the book. &lt;/p&gt;  &lt;p&gt;Chris will soon be publishing a code library that encapsulates the Office Communicator SDK and extends it to enable you to build Contextual Collaboration functionality into your UC-enabled applications.&amp;#160; I’ll be sure to write about it when it becomes available.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=76764" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Join me at SharePoint Saturday Chicago on June 13th</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/05/10/join-me-at-sharepoint-saturday-chicago-on-june-13th.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/05/10/join-me-at-sharepoint-saturday-chicago-on-june-13th.aspx</id><published>2009-05-10T18:59:35Z</published><updated>2009-05-10T18:59:35Z</updated><content type="html">&lt;p&gt;I&amp;#39;ll be speaking at SharePoint Saturday on June 13th at the Tribune Tower in Chicago.&lt;/p&gt; &lt;p&gt;For more more information, check out &lt;a title="http://www.sharepointsaturday.org/chicago" href="http://www.sharepointsaturday.org/chicago"&gt;http://www.sharepointsaturday.org/chicago&lt;/a&gt; or follow &lt;a href="http://twitter.com/SPSaturdayChi" target="_blank"&gt;@SPSaturdayChi&lt;/a&gt; on twitter.&amp;nbsp; The event is free and is open to the public.&amp;nbsp; Registration hasn&amp;#39;t been opened yet, but keep an eye on the site for more information. &lt;/p&gt; &lt;p&gt;I&amp;#39;m really looking forward to my talk, it&amp;#39;s titled &lt;strong&gt;Best Practices for Building Public Facing SharePoint WCM Sites&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;Using a completely custom built SharePoint WCM site, I&amp;#39;m going to cover topics such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Topology of a public facing SharePoint WCM site&lt;/li&gt; &lt;li&gt;Solution architecture&lt;/li&gt; &lt;li&gt;Organizing your Visual Studio and SharePoint solutions&lt;/li&gt; &lt;li&gt;Using a custom publishing site definition&lt;/li&gt; &lt;li&gt;Branding&lt;/li&gt; &lt;li&gt;Considerations for public facing sites&lt;/li&gt; &lt;li&gt;Content authoring&lt;/li&gt; &lt;li&gt;Content deployment&lt;/li&gt; &lt;li&gt;Authentication&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I&amp;#39;ll also make my slides and source code available immediately after my talk.&amp;nbsp; Looking forward to seeing everyone there!&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=75754" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Keeping track of your current build in TFS</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/04/30/keeping-track-of-your-current-build-in-tfs.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/04/30/keeping-track-of-your-current-build-in-tfs.aspx</id><published>2009-04-30T14:39:46Z</published><updated>2009-04-30T14:39:46Z</updated><content type="html"> &lt;p&gt;When creating a build definition in TFS, you can set the option to &lt;em&gt;build each check-in&lt;/em&gt;, meaning that a team build will get queued up every time a developer checks in a changeset. &lt;/p&gt; &lt;p&gt;When you have multiple developers working on a project, your build drop location might get cluttered. It&amp;#39;s even worse if you have different build definitions for various branches of your source tree, e.g. Dev, Main, and Prod. &lt;/p&gt; &lt;p&gt;My colleague @pwalke suggested that we create a &lt;strong&gt;CurrentBuild &lt;/strong&gt;folder that would always contain the most current build for every build definitions. If you browse to the team project&amp;#39;s build drop location, you can open the folder and grab the build output. &lt;/p&gt; &lt;p&gt;This was pretty easy to do in the build definition by overriding the &lt;strong&gt;AfterDropBuild&lt;/strong&gt; build target:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AfterDropBuild&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;#39;$(BuildBreak)&amp;#39;!=&amp;#39;true&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(DropLocation)\$(BuildNumber)\**\*.*&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Output&lt;/span&gt; &lt;span class="attr"&gt;ItemName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BuildOutput&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TaskParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Include&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CreateItem&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RemoveDir&lt;/span&gt; &lt;span class="attr"&gt;Directories&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(DropLocation)\CurrentBuild\$(BuildDefinition)&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@(BuildOutput)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="attr"&gt;DestinationFolder&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(DropLocation)\CurrentBuild\$(BuildDefinition)\%(RecursiveDir)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="attr"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This clears out the directory, and then recursively copies the build output to a subfolder in the CurrentBuild folder.&lt;/p&gt;
&lt;p&gt;Update: Added a condition on the build target to verify if the build was successful, thanks @sajo!&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=74795" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry><entry><title>Extending SharePoint Site Provisioning using Site Definition ProvisionData</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/george_durzi/archive/2009/04/11/extending-sharepoint-site-provisioning-using-site-definition-provisiondata.aspx" /><id>http://blogs.claritycon.com/blogs/george_durzi/archive/2009/04/11/extending-sharepoint-site-provisioning-using-site-definition-provisiondata.aspx</id><published>2009-04-11T14:46:41Z</published><updated>2009-04-11T14:46:41Z</updated><content type="html"> &lt;p&gt;I&amp;#39;m a big fan of packaging &amp;quot;run once assets&amp;quot; into the deployment process of a SharePoint WCM site - I believe that this type of content should be deployed using Features until content authors ultimately assume responsibility for maintaining it. &lt;/p&gt; &lt;p&gt;The reason I insist on this is that I think it is critical for developers to always be working with the whole site, and not in a sandbox. Get developers seeing the big picture early on in a SharePoint WCM project, and you&amp;#39;re much more likely to avoid integration issues down the line. &lt;/p&gt; &lt;p&gt;So when it came time to provision a hierarchy of sites as part of a custom site definition, I explored different ways to automate this. &lt;/p&gt; &lt;p&gt;One way of implementing custom provisioning logic is by including an implementation of &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spwebprovisioningprovider.aspx" target="_blank"&gt;SPWebProvisioningProvider&lt;/a&gt; in your site definition. You can tap into SPWebProvisioningProvider&amp;#39;s &lt;em&gt;InitializePortal&lt;/em&gt; method and execute custom logic, e.g., creating webs, or setting custom navigation properties. &lt;/p&gt; &lt;p&gt;When exploring Andrew Connell&amp;#39;s Minimal Publishing Portal site definition (&lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/Professional-SharePoint-2007-Web-Content-Management-Development-Building-Publishing-Sites-with-Office-SharePoint-Server-2007.productCd-0470224754,descCd-DOWNLOAD.html" target="_blank"&gt;download the code for AC&amp;#39;s Professional SharePoint 2007 WCM Development book&lt;/a&gt;), I noticed the &lt;em&gt;ProvisionData&lt;/em&gt; attribute of a template in the site definition that pointed to a file called &lt;em&gt;PortalConfig.xml&lt;/em&gt;. This looked promising, it seemed like a way to define your custom provisioning logic in markup instead of using the SharePoint object model. &lt;/p&gt; &lt;p&gt;I couldn&amp;#39;t find any good examples of anybody using this in a site definition, so I fired up Reflector to see how SharePoint was using it when provisioning sites based on the Publishing Portal site definition. &lt;/p&gt; &lt;p&gt;Take a minute to check out the Publishing Portal template - you can find this in &lt;u&gt;&lt;strong&gt;C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1033\XML\webtempsps.xml&lt;/strong&gt;&lt;/u&gt;:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BLANKINTERNETCONTAINER&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;52&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing Portal&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/1033/images/IPPT.gif&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;... omitted ...&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ProvisionAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft.SharePoint.Publishing, Version=12.0.0.0, &lt;/pre&gt;Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot;&lt;/span&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ProvisionClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft.SharePoint.Publishing.PortalProvisioningProvider&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ProvisionData&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xml\\InternetBlank.xml&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;RootWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TRUE&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;VisibilityFeatureDependency&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;97A2485F-EF4B-401f-9167-FA4FE177C6F6&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The template defines a &lt;em&gt;ProvisionClass&lt;/em&gt; of &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;(which is simply an implementation of &lt;strong&gt;SPWebProvisioningProvider&lt;/strong&gt;) and points to &lt;strong&gt;xml\\InternetBlank.xml &lt;/strong&gt;in its &lt;em&gt;ProvisionData &lt;/em&gt;attribute. &lt;/p&gt;
&lt;p&gt;If you examine the &lt;em&gt;Provision &lt;/em&gt;method &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.portalprovisioningprovider.aspx" target="_blank"&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider&lt;/a&gt; in Reflector, you can follow the logic that SharePoint uses to provision a Publishing site. &lt;/p&gt;
&lt;p&gt;The &lt;em&gt;Provision &lt;/em&gt;method calls &lt;em&gt;CreatePortal&lt;/em&gt;, which loads and validates &lt;strong&gt;InternetBlank.xml&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;against the &lt;em&gt;PortalTemplate.xsd&lt;/em&gt; schema. &lt;em&gt;CreatePortal &lt;/em&gt;calls &lt;em&gt;CreateChildWebs &lt;/em&gt;which recursively creates the site hierarchy as defined in &lt;em&gt;InternetBlank.xml&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img style="margin:0px 0px 0px 15px;" src="http://employees.claritycon.com/gdurzi/Blog/ProvisionData/1.PortalProvisioningProvider.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;InternetBlank.xml&lt;/em&gt; can be found at &lt;strong&gt;&lt;u&gt;C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\InternetBlank.xml&lt;/u&gt;&lt;/strong&gt;, let&amp;#39;s take a look at its contents:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kward"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;portal&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PortalTemplate.xsd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BLANKINTERNET#0&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Resources:cmscore,IPPT_Portal_Root_DisplayName;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Resources:cmscore,IPPT_Portal_Root_Description;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;webs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PressReleases&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BLANKINTERNET#1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;          &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Resources:cmscore,IPPT_Portal_PressRelease_DisplayName;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Search&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SRCHCENTERLITE#1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;          &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$Resources:cmscore,IPPT_Portal_SearchCenterLite_DisplayName;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;webs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;portal&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you&amp;#39;ve created an out of the box Publishing Portal, this should be familiar - &lt;em&gt;InternetBlank.xml&lt;/em&gt; defines the &lt;em&gt;Press Releases &lt;/em&gt;and &lt;em&gt;Search Center&lt;/em&gt; sites that are created. 
&lt;p&gt;There are a couple of possible approaches you can take if you&amp;#39;d like to integrate this functionality into your custom site definition: 
&lt;ol&gt;
&lt;li&gt;Have your site definition use &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;instead of writing your own &lt;strong&gt;SPWebProvisioningProvider&lt;/strong&gt; 
&lt;li&gt;Implement some of the logic in &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;into your own implementation of &lt;strong&gt;SPWebProvisioningProvider&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The approach you take really depends on your requirements. If you simply need to provision a hierarchy of sites as part of your site definition, go with #1. If you need to create those sites, but also execute more custom logic, go with #2. &lt;/p&gt;
&lt;p&gt;I&amp;#39;m planning to explore a third option which involves extending &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;to account for some more custom logic - we&amp;#39;ll leave that for a future post though :)&lt;/p&gt;
&lt;p&gt;Let me now demonstrate modifying AC&amp;#39;s Minimal Publishing Portal site definition to use &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider&lt;/strong&gt;&amp;nbsp; instead of a custom &lt;strong&gt;SPWebProvisioningProvider&lt;/strong&gt; - you can &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/Professional-SharePoint-2007-Web-Content-Management-Development-Building-Publishing-Sites-with-Office-SharePoint-Server-2007.productCd-0470224754,descCd-DOWNLOAD.html" target="_blank"&gt;download the code for AC&amp;#39;s Professional SharePoint 2007 WCM Development book&lt;/a&gt;, the Minimal Publishing Portal site definition is in Chapter 5. 
&lt;p&gt;Let&amp;#39;s first take a look at the &lt;strong&gt;WEBTEMP.PublishingMinimal.xml &lt;/strong&gt;file for the site definition: &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt; &lt;span class="attr"&gt;xmlns:ows&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft SharePoint&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PublishingMinimal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10001&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Site&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/images/PublishingMinimal/Preview.png&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;RootWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Portal&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/images/PublishingMinimal/Preview.png&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ProvisionAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Chapter05MinimalSiteDefinition, Version=1.0.0.0, &lt;/pre&gt;&lt;pre class="alt"&gt;                        Culture=neutral, PublicKeyToken=c591e70cfdf9ce4f&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ProvisionClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;WROX.ProMossWcm.Chapter05.ProvisioningEngine&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ProvisionData&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SiteTemplates\\PublishingMinimal\\XML\\PortalConfig.xml&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;RootWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Site with Workflow&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/1033/images/PublishingSite.gif&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;VisibilityFeatureDependency&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;54A92CA1-4E7C-4B73-B03A-E93955E4E560&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;... omitted ... &amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The site definition includes three configurations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Minimal Publishing Portal - the &amp;quot;provisioner&amp;quot; for the site definition 
&lt;li&gt;Minimal Publishing Site - a template for a web without workflow 
&lt;li&gt;Minimal Publishing Site with Workflow - a template for a web with workflow&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Let&amp;#39;s start by pasting the contents of &lt;strong&gt;&lt;u&gt;C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\InternetBlank.xml&lt;/u&gt;&lt;/strong&gt; into &lt;em&gt;PortalConfig.xml &lt;/em&gt;and editing the &lt;strong&gt;siteDefinition&lt;/strong&gt; property of the root web to provision the appropriate configuration of the &lt;strong&gt;PublishingMinimal&lt;/strong&gt; site definition:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;portal&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PortalTemplate.xsd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PublishingMinimal#0&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;webs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PressReleases&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BLANKINTERNET#1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;          &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Press Releases&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Search&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;siteDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SRCHCENTERLITE#1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;          &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Search&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;          &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;webs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;portal&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&amp;#39;ll also modify &lt;strong&gt;WEBTEMP.PublishingMinimal.xml &lt;/strong&gt;to use &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;instead:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt; &lt;span class="attr"&gt;xmlns:ows&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft SharePoint&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PublishingMinimal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10001&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Site&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/images/PublishingMinimal/Preview.png&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;RootWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Portal&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/images/PublishingMinimal/Preview.png&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ProvisionAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft.SharePoint.Publishing, Version=12.0.0.0, &lt;/pre&gt;&lt;pre class="alt"&gt;                        Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot;&lt;/span&gt;              &lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ProvisionClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft.SharePoint.Publishing.PortalProvisioningProvider&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;ProvisionData&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SiteTemplates\\PublishingMinimal\\XML\\PortalConfig.xml&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;RootWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Configuration&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Minimal Publishing Site with Workflow&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;DisplayCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Publishing&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Hidden&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/_layouts/1033/images/PublishingSite.gif&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;SubWebOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;     &lt;span class="attr"&gt;VisibilityFeatureDependency&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;54A92CA1-4E7C-4B73-B03A-E93955E4E560&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;     &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;... omitted ... &amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;While doing this, I discovered that I had to ensure that &lt;strong&gt;PublishingMinimal#0 &lt;/strong&gt;and &lt;strong&gt;&lt;strong&gt;PublishingMinimal&lt;/strong&gt;#2 &lt;/strong&gt;also activated the SharePoint &lt;strong&gt;PublishingSite &lt;/strong&gt;and &lt;strong&gt;PublishingWeb &lt;/strong&gt;features. For each configuration in the site definition&amp;#39;s &lt;strong&gt;ONET.xml&lt;/strong&gt;, ensure that the features are activated.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;PublishingSite &lt;/strong&gt;feature is scoped at the Site level and should be activated in &amp;lt;SiteFeatures&amp;gt;:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SiteFeatures&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;&amp;lt;!-- Feature: PublishingSite --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Feature&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;f6924d36-2fa8-4f0b-b16d-06b7250180fa&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;PublishingWeb &lt;/strong&gt;feature is scoped at the Web level and should be activated in &amp;lt;WebFeatures&amp;gt;:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;WebFeatures&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;&amp;lt;!-- Feature: PublishingWeb --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Feature&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;94c94ca6-b32f-4da9-a9e3-1f3d343d7ecb&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;#39;s it! &lt;/p&gt;
&lt;p&gt;Go ahead and create a site collection based on the Minimal Publishing Portal site definition, and you&amp;#39;ll see the &lt;em&gt;Press Releases&lt;/em&gt; and &lt;em&gt;Search&lt;/em&gt; sites created automatically. &lt;/p&gt;
&lt;p&gt;Creating custom site definitions is painful enough ... Simplifying it slightly by leveraging existing SharePoint Publishing functionality to provision a portal&amp;#39;s hierarchy will hopefully make this a little easier. &lt;/p&gt;
&lt;p&gt;As I mentioned, I&amp;#39;ll be exploring extending the functionality in &lt;strong&gt;Microsoft.SharePoint.Publishing.PortalProvisioningProvider &lt;/strong&gt;in order to still use it, but also inject some custom functionality which is often required during provisioning - stay tuned. &lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=70219" width="1" height="1"&gt;</content><author><name>gdurzi</name><uri>http://blogs.claritycon.com/members/gdurzi.aspx</uri></author></entry></feed>