<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yet another SharePoint BLOG</title>
	<atom:link href="http://anthonysheldrake.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://anthonysheldrake.com</link>
	<description>Real life SharePoint and some real life</description>
	<lastBuildDate>Wed, 15 Apr 2009 17:39:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>&quot;Alert me&quot; crashes IIS application pool</title>
		<link>http://anthonysheldrake.com/?p=77</link>
		<comments>http://anthonysheldrake.com/?p=77#comments</comments>
		<pubDate>Wed, 15 Apr 2009 17:39:57 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[401.1]]></category>
		<category><![CDATA[access denied]]></category>
		<category><![CDATA[alert me]]></category>
		<category><![CDATA[alerts]]></category>
		<category><![CDATA[application pool]]></category>
		<category><![CDATA[CAML]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[credentials]]></category>
		<category><![CDATA[hang]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[logon]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=77</guid>
		<description><![CDATA[Some time ago, one of our customers reported an odd problem. The support ticket went something like this: When a user tries to create an alert there is a long pause and is then prompted to login. They enter their credentials but they then receive the following error: &#34;you are not authorised to view this [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago, one of our customers reported an odd problem. The support ticket went something like this:</p>
<blockquote><p>When a user tries to create an alert there is a long pause and is then prompted to login. They enter their credentials but they then receive the following error: &quot;you are not authorised to view this page.</p>
</blockquote>
<p>It&#8217;s taken a long time to get to the bottom of this one due to a number of red herrings so feel free to skip to the fix at the bottom.</p>
<p>The site in question had recently been moved from another set of servers. The site owners had taken the opportunity to rebrand the site and so our immediate investigations were directed toward the new farm and those customisations.</p>
<p>It quickly became clear that it was a subset of lists in the site that were effected but there was no obvious pattern between them.The &quot;bad lists&quot; included document libraries, news lists and discussion forums and it wasn&#8217;t anything simple like the lists with lots of items or a particular file type.</p>
<p>Not long after we started looking into this problem we started having occasional IIS application pool crashes. This obviously took priority so efforts were diverted. To be honest, we weren&#8217;t making much progress with either issue until one of our contractors noticed that reproducing the alerts problem triggered a hang on the application pool. If enough people tried to create an alert the application pool would enter a stopped state.</p>
<p><a href="http://anthonysheldrake.com/wp-content/uploads/AlertmecrashesIISapplicationpool_10191/crash.png"><img title="crash" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="crash" src="http://anthonysheldrake.com/wp-content/uploads/AlertmecrashesIISapplicationpool_10191/crash_thumb.png" width="433" border="0" /></a> </p>
<p>Goggling “A process serving application pool * exceeded time” brings back lots of generic IIS blogs and forums, most of which point to <a href="http://blogs.msdn.com/david.wang/archive/2005/08/29/HOWTO_Understand_and_Diagnose_an_AppPool_Crash.aspx">this post</a> on the IIS team blog which describes using <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&amp;displaylang=en">DebugDiag</a> to isolate the issue. The dumps pointed us towards an issue with InfoPath forms and in turn <a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointinfopath/thread/17c54846-39b1-4b3c-92a2-64cdf8341335/">this forum post</a> but again this turned out to be a dead end.</p>
<p>&#160;</p>
<h2>The Solution</h2>
<p>So after a <strong>lot of digging </strong>we were finally able to work out that the effected lists all had rather complicated views. To give you an example, one of these lists had 64 views, one of which had 12 filters, i.e. column A = XXX AND column B = YYY etc. Deleting that complicated view allowed the user to create alerts.</p>
<p>What’s happening is that the filter creates a CAML query. When that query gets above a certain length (which appears to be about 500 characters) it hangs the application pool. If enough people try the query at the same time, the application pool crashes. To the user this manifests as a long pause followed by being prompted for credentials and then getting “access denied” On the server the application pool is rebooting and reaching and then reauthenticating the user.</p>
<p>So with all this information in hand we logged a fault with Microsoft and they’ve accepted it as a fault. They expect the fix to be included in SP2.</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LiveMeeting 2007 bug</title>
		<link>http://anthonysheldrake.com/?p=76</link>
		<comments>http://anthonysheldrake.com/?p=76#comments</comments>
		<pubDate>Tue, 17 Mar 2009 16:31:00 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[LiveMeeting]]></category>
		<category><![CDATA[grey]]></category>
		<category><![CDATA[LiveMeeting 2007]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[window state]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=76</guid>
		<description><![CDATA[I’ve found myself working with LiveMeeting a lot recently and so have more LM qwerks to discuss than SharePoint ones. The latest one, I’m pleased to say, has been accepted by Microsoft and will be added to the next cumulative fix. The jist is that a window changing form is recognised as a new window [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve found myself working with LiveMeeting a lot recently and so have more LM qwerks to discuss than SharePoint ones. The latest one, I’m pleased to say, has been accepted by Microsoft and will be added to the next cumulative fix. The jist is that a window changing form is recognised as a new window by the presenters client and as a result, the content is no longer shared. Below is a worked example</p>
<p>Open Calculator and share it</p>
<p align="center"><a href="http://anthonysheldrake.com/wp-content/uploads/LiveMeeting2007bug_E839/sharing.jpg"><img title="sharing" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="279" alt="sharing" src="http://anthonysheldrake.com/wp-content/uploads/LiveMeeting2007bug_E839/sharing_thumb.jpg" width="602" border="0" /></a> </p>
<p>What you should see is the calculator with “currently sharing” in the title bar and the rest of the screen partially greyed out.</p>
<p align="center"><a href="http://anthonysheldrake.com/wp-content/uploads/LiveMeeting2007bug_E839/calc.jpg"><img title="calc" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="365" alt="calc" src="http://anthonysheldrake.com/wp-content/uploads/LiveMeeting2007bug_E839/calc_thumb.jpg" width="413" border="0" /></a> </p>
<p>Now switch to scientific mode and the presenter and the viewer will be kicked back to the “Nothing is currently being shared” screen. </p>
<p>For clarity, this isn’t restricted to calculator but it makes for a simple example. The problem is that in 2007 the product team have locked down the window security (this doesn’t happen in LiveMeeting 2005) and so when changing to scientific mode, LiveMeeting considers it a new window and so closes the sharing session. We were using this as a remote training tool for new starters. Often, trainers didn’t notice that the application wasn’t being shared and the new starter was too nervous to say anything and so sat there looking at a grey screen for an hour!</p>
<p>Microsoft’s current work arounds are:</p>
<ul>
<li>Share the entire desktop (you can’t hand over control in this configuration) </li>
<li>Open a remote desktop session to another computer with calculator running and share the RDP client </li>
<li>Create a virtual PC running calculator and share the VPC </li>
</ul>
<p>&#160;</p>
<p>I’ll post an update once Microsoft release a fix.</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=76</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Disable Livemeeting update prompts</title>
		<link>http://anthonysheldrake.com/?p=72</link>
		<comments>http://anthonysheldrake.com/?p=72#comments</comments>
		<pubDate>Mon, 16 Feb 2009 22:26:27 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[LiveMeeting]]></category>
		<category><![CDATA[2007]]></category>
		<category><![CDATA[OCS]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=72</guid>
		<description><![CDATA[Ok, this isn’t SharePoint related but hopefully it’ll be helpful to someone. We recently rolled out Livemeeting 2007 across the company. It turns out the client does a version check at the end of each meeting and will prompt the user to update. Obviously you’ll want to suppress this for users who don’t have admin [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, this isn’t SharePoint related but hopefully it’ll be helpful to someone. We recently rolled out Livemeeting 2007 across the company. It turns out the client does a version check at the end of each meeting and will prompt the user to update.</p>
<p><a href="http://anthonysheldrake.com/wp-content/uploads/Livemeetingupdatedisable_13AC1/livemeeting.jpg"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="livemeeting" src="http://anthonysheldrake.com/wp-content/uploads/Livemeetingupdatedisable_13AC1/livemeeting_thumb.jpg" border="0" alt="livemeeting" width="589" height="149" /></a></p>
<p>Obviously you’ll want to suppress this for users who don’t have admin access. Create the following registry key on the client machine and set the value to 1</p>
<blockquote><p>HKEY_LOCAL_MACHINE\Software\Microsoft\ Live Meeting\8.0\Lockdown</p></blockquote>
<p>This and other useful reg keys (particularly in relation to OCS) are available <a href="http://technet.microsoft.com/en-us/library/bb663600.aspx">here</a></p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=72</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SharePoint standard vs enterprise</title>
		<link>http://anthonysheldrake.com/?p=68</link>
		<comments>http://anthonysheldrake.com/?p=68#comments</comments>
		<pubDate>Thu, 05 Feb 2009 20:01:22 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[BDC]]></category>
		<category><![CDATA[CAL]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[excel services]]></category>
		<category><![CDATA[extranet]]></category>
		<category><![CDATA[forms services]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[license]]></category>
		<category><![CDATA[report center]]></category>
		<category><![CDATA[standard]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=68</guid>
		<description><![CDATA[A colleague of mine recently blogged about the difficulties of a managing SharePoint environment with a mixture of standard users enterprise. In short, he came to the conclusion that it isn’t a viable solution &#8211; a conclusion that I’d whole heartedly support given the grief it causes us both each day. If I had my [...]]]></description>
			<content:encoded><![CDATA[<p>A colleague of mine recently <a href="http://www.paulbednall.com/2009/01/managing-mixed-standardenterprise.html">blogged</a> about the difficulties of a managing SharePoint environment with a mixture of standard users enterprise. In short, he came to the conclusion that it isn’t a viable solution &#8211; a conclusion that I’d whole heartedly support given the grief it causes us both each day. If I had my time over I wouldn’t have attempted it. if you still want to try the mixed environment after you’ve read this post I’d encourage you to have a read of as it will help give you some pointers.</p>
<p>Paul’s post prompted somebody from Unilever to contact him as they’re currently in discussions with Microsoft and were having difficulties getting a simple answer as to the implications of standard vs enterprise. I remember those discussions well and the time I spent trying to find a clear answer online – there isn’t one. This is my attempt to clear the confusion.</p>
<p>Everything below is based on my experience working for a big company with a fair bit of buying power. I don’t know how the numbers will translate to your company or how Microsoft will behave if you get it wrong. With that in mind, do as much research as physically possible because if you get it wrong and Microsoft find out, they’re well within their rights to penalise you.</p>
<h2>Server and user licenses</h2>
<p>SharePoint is licensed in two parts. The server part is the simplest so lets start there.</p>
<p>Although you can have either an enterprise or standard server, there is no difference in cost (we pay a little under £2’500 + the windows license per server.) The license simple enables a number of features for the farm. You cannot have a mixture of standard and enterprise servers in the same farm. You can upgrade a standard farm but you cannot downgrade an enterprise farm. There is no definitive wording from Microsoft but I’ve seen it argued that if you have an enterprise farm in your company, every single user must have an enterprise Client Access License (see below for more info on CALs.)</p>
<h2>Client Access Licenses (CALs)</h2>
<p>In order to access a SharePoint site you should be covered under a CAL. Our site gives all of our users access to Windows, Office, Exchange, AD, DNS and SharePoint Standard so if our servers were running the standard license, we’d be fully compliant. As soon as an enterprise feature is enabled on a farm, web application, site collection or site that a user <strong>can</strong> access, that user requires an enterprise CAL which costs about £45 each. My company has around 80’000 users so in theory, simply turning the farm on meant they could access it (note that they don’t actually have to access it, only be able to) and required us to pay Microsoft £3’600’000 for the CALs.</p>
<p>Now I’ll quickly point out that we didn’t fully understand the implications of enterprise vs standard CALs when we installed SharePoint and ran none compliant for about a year. When we realised the mistake we spoke with Microsoft who were very understanding (I’m guessing it happens a lot.) They entered into an agreement with us where we report on the users accessing enterprise enabled sites and pay for them. Microsoft are under no obligation to agree to this kind of payment model and I doubt they would do it for smaller companies. It’s also worth pointing out that SharePoint doesn’t offer this level of reporting. I had to code an application which scans the farm looking for sites with the enterprise features turned on then grabs the user list and merges it into a spreadsheet. I’d originally planned on using an event receiver to hook when an admin turns features on and kick off some workflow which charged the appropriate business area, but it turns out no event is triggered.</p>
<h2>Internet/extranet</h2>
<p>If you have an extranet or internet based on SharePoint you’ll need another license called “Microsoft Office SharePoint Server 2007 for Internet sites” and if you run a farm with internal and external users you’ll need both licenses. We don’t use SharePoint externally so I don’t have any numbers to offer you. A quick Google shows that the prices appears to be around <a href="http://www.pcuniverse.com/Microsoft-Office-SharePoint-Server-2007-for-Internet-sites-License-1-server/76Q-01208/pd/p3853674">$40’000</a></p>
<h2>What does enterprise give me</h2>
<p>I’m quite critical of the way Microsoft handles standard vs enterprise licenses but to be fair to them, they’re very clear on what each one gives you (assuming you know where to look.) <a href="http://download.microsoft.com/download/1/d/c/1dc632e8-71e1-466f-8a2f-c940f1438e0a/SharePointProductsComparison.xls">Start here</a>. The short version is that if you want to use Business Data Catalogue(BDC), Forms Services, Excel Services or Report Centre you’re going to have to put your hand in your pocket. Keep in mind that while in most instances your farm admins will have to do some work to enable them, your site admins can still try to use web parts, making their site enterprise. Basically you’d be paying for something that doesn’t work. Clearly education is key here and needs to be embedded firmly into your governance.</p>
<p><a href="http://blogs.officezealot.com/mauro/archive/2007/01/06/20032.aspx">Mauro Cardarelli</a> has done a pretty good job of expanding on what enterprise gives you versus standard.</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=68</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>A thought crossed my mind</title>
		<link>http://anthonysheldrake.com/?p=67</link>
		<comments>http://anthonysheldrake.com/?p=67#comments</comments>
		<pubDate>Thu, 05 Feb 2009 19:08:50 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[business case]]></category>
		<category><![CDATA[investment]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=67</guid>
		<description><![CDATA[Every business case for a technical solution looks something like this: We will save the business money by streamlining process/reducing costs/reducing headcount/driving efficiencies/realising business benefit [delete as appropriate.] This will be achieved by the delivery of a integrated system based on [insert the technology of choice.] Benefits of £xxxxx will be returned to the business. [...]]]></description>
			<content:encoded><![CDATA[<p>Every business case for a technical solution looks something like this:</p>
<blockquote><p><font style="background-color: #ffffff">We will save the business money by streamlining process/reducing costs/reducing headcount/driving efficiencies/realising business benefit [delete as appropriate.] This will be achieved by the delivery of a integrated system based on [insert the technology of choice.]</font></p>
<p><font style="background-color: #ffffff">Benefits of £xxxxx will be returned to the business.</font></p>
</blockquote>
<p>So in the the current climate of cost cutting and emphasising profitable sections of the business, why aren’t businesses investing like mad in collaborative technologies such SharePoint, Notes, WebSphere etc? Either the business is short sighted or the business case was less than genuine…</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=67</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Forum first post error &#8211; resolved</title>
		<link>http://anthonysheldrake.com/?p=66</link>
		<comments>http://anthonysheldrake.com/?p=66#comments</comments>
		<pubDate>Mon, 02 Feb 2009 21:01:49 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[an unknown error has occurred]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[forum]]></category>
		<category><![CDATA[hotfix]]></category>
		<category><![CDATA[sp1]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=66</guid>
		<description><![CDATA[Today hasn&#8217;t been a great day: I spent 45 minutes stood at the station only to find out that one inch of snow in enough to stop a train. Trains which of course run four inch above the ground on iron tracks. I’m in the middle of the project from hell where some developers have [...]]]></description>
			<content:encoded><![CDATA[<p>Today hasn&#8217;t been a great day:</p>
<ul>
<li>I spent 45 minutes stood at the station only to find out that one inch of snow in enough to stop a train. Trains which of course run four inch above the ground on iron tracks. </li>
<li>I’m in the middle of the project from hell where some developers have thrown WSS, Biztalk, K2 and a shed load of custom code into a mixing pot without any consideration to how it’ll work in production (“it works on our dev server” &#8211; “your dev server is a single box with everything running under one admin account” &#8211; “so?”) or how it’ll be supported.</li>
<li>My uncle got taken to hospital so I’ve spent all evening with my grandma holding back the tears.</li>
<li>My puppy left me a present in the kitchen.</li>
</ul>
<p>So why am I taking the time to write a post after such a rubbish day? Because I finally got to put a six month old problem to bed. </p>
<p>“I cannot edit the properties or text of the first post in a discussion forum. When I click edit I get ’an unknown error has occurred’. I can edit all other posts.“</p>
<p>When this bug was first reported our support guys went through the usual process of checking ULS logs, event logs etc but everything was clear. This was the only one of our four farms to show the behaviour and Google was disappointingly unhelpful. We were left with little choice but to engage PSS. More log checks, reproducing the error (which Microsoft were finding hard), SQL traces – you name it, but almost six months later and it appeared MS were as stumped as we were.</p>
<p>Then today, out of the blue they fired over an e-mail to say it was a bug that’d be introduced with SP1 and fixed with the infrastructure update.(we’d put fixes on hold while we ironed out some of the outstanding PSS cases.) I installed it into a dev system and sure enough, the problem went away.</p>
<p>It’s slightly embarrassing to say I sat on a bug for six months when a standard maintenance fix could have removed it, but I’m in a glass half full mood so I’m going look at it as a problem solved.</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=66</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s all laugh at Anthony</title>
		<link>http://anthonysheldrake.com/?p=60</link>
		<comments>http://anthonysheldrake.com/?p=60#comments</comments>
		<pubDate>Mon, 19 Jan 2009 23:24:15 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[guitar]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=60</guid>
		<description><![CDATA[When I started this BLOG I wanted it to be a combination of SharePoint and none-work content. I assumed that SharePoint would take up the bulk of the posts as my personal life isn’t interesting enough to generate many readers, but up to now I’ve not made a single none-SharePoint post. That’s all about to [...]]]></description>
			<content:encoded><![CDATA[<p>When I started this BLOG I wanted it to be a combination of SharePoint and none-work content. I assumed that SharePoint would take up the bulk of the posts as my personal life isn’t interesting enough to generate many readers, but up to now I’ve not made a single none-SharePoint post. That’s all about to change.</p>
<p>I’ve always fancied learning the guitar and so when my dad mentioned that he didn’t know what to buy me for Christmas I suggested one of <a href="http://www.amazon.co.uk/Yamaha-F310-Acoustic-Guitar-Starter/dp/B000I1V5KA">these</a> (<a href="http://uk.youtube.com/watch?v=wf5xAuBTQb0">another link</a></p>
<p>.) So for the last 4 weeks I’ve been spending half an hour every other night learning C, D and E chords. Tonight, like a true techie I threw out the instruction manual and decided I knew best. I found a site which claims to show you how to play Oasis’ Talk Tonight and set about teaching myself. 3 hours later my left hand is cramping, my index fingers is sore as hell and I’ve got this embarrassing video to share. I hope you all get a chuckle so that in 6 months time when I’m rocking with the <a href="http://www.google.co.uk/url?sa=t&amp;source=web&amp;ct=res&amp;cd=4&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DsPv8PPl7ANU&amp;ei=Juh0Sbu5HZWN-ga8z8GABw&amp;usg=AFQjCNF8QVInRMFBv9eT2p05c6HhnCptZA&amp;sig2=NDgFE6i48dKeMslcFCUaIA">Windows Vista band</a> I can come back and say “I told you I’d make it.” If I can’t have that, I’ll settle for not being the next <a href="http://www.google.co.uk/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D60og9gwKh1o&amp;ei=TuV0SY2RGMaO-gbp1smjBw&amp;usg=AFQjCNE7xE7H5iIi27c16XkHBuanjXeGaw&amp;sig2=nKEe66YWWH4vZ1ngSm0uww">Numa Numa kid</a>. </p>
<p>Enjoy</p>
<p>&#160;</p>
<div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c0336f50-497d-466b-959d-8a0595fa95c8" style="padding-right: 0px; display: block; padding-left: 0px; float: none; padding-bottom: 0px; margin-left: auto; width: 432px; margin-right: auto; padding-top: 0px">
<div><embed src="http://images.video.msn.com/flash/soapbox1_1.swf" quality="high" width="432" height="364" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://macromedia.com/go/getflashplayer" flashvars="c=v&#038;v=832d418d-b86f-4cc3-bd1a-a033b1f8261a&#038;from=writer&#038;mkt=en-US"></embed></div>
</div>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=60</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Quickly hide elements with CSS</title>
		<link>http://anthonysheldrake.com/?p=52</link>
		<comments>http://anthonysheldrake.com/?p=52#comments</comments>
		<pubDate>Mon, 19 Jan 2009 10:00:00 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[MySite]]></category>
		<category><![CDATA[Recycle Bin]]></category>
		<category><![CDATA[View All Site Content]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=52</guid>
		<description><![CDATA[When I have a little spare time I like to look at my twitter feed for interesting BLOG posts. Often, if I find a well written article I’ll go back to see what the author has posted in the past. It was this process that caused me to stumble over this year old post by [...]]]></description>
			<content:encoded><![CDATA[<p>When I have a little spare time I like to look at my twitter feed for interesting BLOG posts. Often, if I find a well written article I’ll go back to see what the author has posted in the past. It was this process that caused me to stumble over this year old post by Mark Wagner (<a href="http://www.crsw.com/mark/Lists/Posts/Post.aspx?ID=36">How To: Hide/Remove the View All Site Content link in SharePoint</a>.) In the post he talks about using features to deploy custom style sheets, specifically to hide items on a page. While the process would certainly work,I think it’s a little “overkill” for a lot of scenarios, particularly in self service deployments where you want to avoid involving IT where possible. Here’s an alternative approach.</p>
<p>Let’s stick with Mark’s original idea of hiding the “View All Content” link. Create a test.css file and paste the following into it:</p>
<blockquote><p>#ctl00_PlaceHolderLeftNavBar_idNavLinkViewAll      {display: none}</p></blockquote>
<p>Save the file and upload it to the style sheet library on the target site, eg <a href="http://sharepoint-test/style%20library/">http://sharepoint-test/style%20library/</a>. Now visit the site’s admin page and click “Master Page” Under “Look and Feel”.</p>
<p><a href="http://anthonysheldrake.com/wp-content/uploads/QuickCSStrick_FBEB/csstrics_admin.jpg"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="csstrics_admin" src="http://anthonysheldrake.com/wp-content/uploads/QuickCSStrick_FBEB/csstrics_admin_thumb.jpg" border="0" alt="csstrics_admin" width="244" height="221" /></a></p>
<p>Scroll to the bottom of the page and look for the section which allows you to select a custom style sheet. Click browse, navigate to the style library and select your test.css file. Once you click ok and leave the admin pages, you should see that the “View All Site Content” has gone. <a href="http://anthonysheldrake.com/wp-content/uploads/QuickCSStrick_FBEB/csstrics.jpg"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="csstrics" src="http://anthonysheldrake.com/wp-content/uploads/QuickCSStrick_FBEB/csstrics_thumb.jpg" border="0" alt="csstrics" width="572" height="259" /></a></p>
<p>You’ll notice that in this screenshot I’ve also hidden the recycle bin and the MySite link. Here’s the code you’ll need to replicate this:</p>
<blockquote><p>#ctl00_PlaceHolderGlobalNavigation_ctl08_hlMySite  {display: none}</p>
<p>#ctl00_PlaceHolderGlobalNavigation_ctl06_hlMySite  {display: none}</p>
<p>#ctl00_PlaceHolderLeftNavBar_idNavLinkViewAll       {display: none}</p>
<p>#ctl00_PlaceHolderLeftNavBar_idNavLinkRecycleBin  {display: none}</p></blockquote>
<p>Obviosuly this is useful for those of you interested in “look and feel,” but if you’re a support guy, it’s worth bearing this in mind if you get a support ticket for a site that’s “missing parts” or simply acting strange.</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=52</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MCS UK BLOG</title>
		<link>http://anthonysheldrake.com/?p=47</link>
		<comments>http://anthonysheldrake.com/?p=47#comments</comments>
		<pubDate>Wed, 14 Jan 2009 15:02:33 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[MCS]]></category>
		<category><![CDATA[UK]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=47</guid>
		<description><![CDATA[MCS UK have launched a blog http://blogs.msdn.com/uksharepoint/default.aspx I&#8217;ll be keeping my eye out for the guys I know. No slacking now fellas!]]></description>
			<content:encoded><![CDATA[<p>MCS UK have launched a blog</p>
<p><a href="http://blogs.msdn.com/uksharepoint/default.aspx">http://blogs.msdn.com/uksharepoint/default.aspx</a></p>
<p>I&#8217;ll be keeping my eye out for the guys I know. No slacking now fellas!</p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated vs manual installs</title>
		<link>http://anthonysheldrake.com/?p=41</link>
		<comments>http://anthonysheldrake.com/?p=41#comments</comments>
		<pubDate>Tue, 13 Jan 2009 21:11:23 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[automated]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[psconfig]]></category>
		<category><![CDATA[stsadm]]></category>
		<category><![CDATA[unattended]]></category>

		<guid isPermaLink="false">http://anthonysheldrake.com/?p=41</guid>
		<description><![CDATA[I&#8217;m interested in people&#8217;s opinions about automating Sharepoint installations. We aim to automate everything, in fact if someone needs to touch a key or mouse button we have to through a policy waiver process. In principal I think this is a great idea. It allows us to have a &#8220;self service&#8221; server provisioning system where [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m interested in people&#8217;s opinions about automating Sharepoint installations. We aim to automate everything, in fact if someone needs to touch a key or mouse button we have to through a policy waiver process.</p>
<p>In principal I think this is a great idea. It allows us to have a &#8220;self service&#8221; server provisioning system where anyone can use a web site wizard and end up with a server with WSS all set up without too much understanding of the manual process. This allows us to devolve some disaster recovery situations out as all the engineer needs to do is use the self service wizard to bring a new front end server into the farm.</p>
<p>All good so far but getting to this point has been a painful process and involved some lateral thinking. I&#8217;ll try to explain some of the pitfalls we&#8217;ve hit and what we did to get around it. I&#8217;ll assume you&#8217;ve already automated everything up to the WSS/MOSS install, ie Windows, ISS, .NET etc and that you have a configured SQL server.</p>
<p><strong>Application install</strong></p>
<p>On the face of it this is the easiest step. Simply use the provided silent install .xml files and call setup.exe. The only gotcha is that you might want to consider slipsteaming your SharePoint hotfixes. The next step will be to either create a new farm or to connect to an existing configuration database. If it&#8217;s the latter, your servers need to be at the same patch level as the database so our automated hotfix scripts will copy the hotfix on to a share. The SharePoint install script checks to see if there are any files in that share and copies them into the slipstream directory before calling setup.</p>
<blockquote><p>Barebones script</p></blockquote>
<blockquote><p>XCOPY \\share\hotfixes %SP_InstallScriptDir%\Updates</p>
<p>setup.exe /config silent.xml</p></blockquote>
<p><strong>Farm setup</strong></p>
<p>Because we use the same process to perform the initial server build, planned rebuilds and DRing the server we need to first check if the farm has already been created. If you don&#8217;t do this and you come to rebuild a server you&#8217;ll get unexpected results. Most likely it&#8217;ll error and return a -1 code but it might set a property back to it&#8217;s day one value or in some rare instances it can nuke your config. Because we have to script using DOS batch, all I have access to is psconfig and stsadm. This means the only mechanism for checking if the farms exists is to run</p>
<blockquote><p>psconfig -cmd configdb -connect</p>
<p>or</p></blockquote>
<blockquote><p>psconfig -cmd configdb -create</p></blockquote>
<p>Back in the early beta days MOSS would flatten your config database if you ran -create against an existing farm. Once bitten, twice shy so I always use -connect. Obviously if the server is being rebuilt and the configuration database is intact then your server just rejoined the farm and the SharePoint is in the process of bringing it up to speed. If the config database isn&#8217;t there psconfig will return a -1 error to the console, so your code needs to look something like this:</p>
<blockquote><p>psconfig -cmd configdb -connect -server %SQLServer% -database %ConfigDB% -user %ServiceAcct% -password %ServicePass% -cmd helpcollections -installall -cmd secureresources -cmd services -install -cmd installfeatures -cmd adminvs -provision -port 12345 -windowsauthprovider onlyusentlm -cmd applicationcontent -install</p></blockquote>
<blockquote><p>if %errorlevel% == -1 goto create</p></blockquote>
<blockquote><p>if %errorlevel% NEQ 0 goto error</p></blockquote>
<blockquote><p>if %errorlevel% == 0 goto end</p></blockquote>
<p>Bear in mind that the account you call psconfig with must have permissions within SQL. For security reasons, Windows native runas command doesn&#8217;t allow you to pipe the password so if you either need to run your whole script as the service account or use something like <a href="http://www.commandline.co.uk/sanur/">SANUR</a> or <a href="http://www.joeware.net/freetools/tools/cpau/index.htm">CPAU</a>.</p>
<p>The rest of the arguments simply mimic the steps that the gui installer takes. Obviously tweak them to suit your environment.</p>
<p>Ok, so what if this is the first install or a farm rebuild? Well the above logic just dropped you into a routine called :create. The first job will be to create the configuration database</p>
<blockquote><p>psconfig -cmd configdb -create -server %SQLServer% -database %ConfigDB% -user %ServiceAcct% -password %ServicePass% -admincontentdatabase %AdminContentDB% -cmd helpcollections -installall -cmd secureresources -cmd services -install -cmd installfeatures -cmd adminvs -provision -port 12345 -windowsauthprovider onlyusentlm -cmd applicationcontent -install</p></blockquote>
<p>There&#8217;s your core Sharepoint installation with central admin on http://server:12345 . Everything else is specific to your environment so I go into too much detail, however I will touch on a few important points. Let me start with the limitations of stsadm &#8211; the command you&#8217;ll use for 99% of your configuration. For me, it has two main problems:</p>
<ul>
<li>It only offers a subset of the functionality of central admin, eg you can assign a quota template as the default for a web application but there is no command to create that template in the first place</li>
<li>I&#8217;ve never been able to get it to return an error code other than -1, regardless of what the fault was. This is a real problem for unattended installs where you might want to put some logic into the script</li>
</ul>
<p>Happily, Sharepoint MVP <a href="http://stsadm.blogspot.com/">Gary Lapointe</a> has release something in the region of 100 stsadm extensions and so point one is solved. I strongly advise you to install it at the start of your :create routine. There was a tool on codeplex called stsadm+ which tried to tackle point 2, but at the time of writing this it isn&#8217;t available. This means that if you have any failures  you can&#8217;t apply any logic and have to fail the script. This can be very frustrating if command 29 out of 30 fails and (assuming you&#8217;re sticking to your automated process) you have no choice but to disconnect the server from the farm, delete the database(s) and start over.</p>
<p>Be sure to run your script on one server at a time to avoid conflicts in the database. Make liberal use of</p>
<blockquote><p>stsadm -o execadmsvcjobs</p></blockquote>
<p>to ensure each command has finished. Below is an overview of the logic for this script:</p>
<blockquote><p>Rem Slipstream any hotfixes that have been applied to the farm</p>
<p>XCOPY \\share\hotfixes %SP_InstallScriptDir%\Updates</p>
<p>REM Call setup to install Sharepoint</p>
<p>setup.exe /config silent.xml</p>
<p>REM Try to connect to the farm</p>
<p>psconfig -cmd configdb -connect -server %SQLServer% -database %ConfigDB% -user %ServiceAcct% -password %ServicePass% -cmd helpcollections -installall -cmd secureresources -cmd services -install -cmd installfeatures -cmd adminvs -provision -port 12345 -windowsauthprovider onlyusentlm -cmd applicationcontent -install</p>
<p>REM Check for errors to see if we connected</p>
<p>if %errorlevel% == -1 goto create</p>
<p>if %errorlevel% == 0 goto end</p>
<p>if %errorlevel% NEQ 0 goto error</p>
<p>:create</p>
<p>REM Create the farm</p>
<p>psconfig -cmd configdb -create -server %SQLServer% -database %ConfigDB% -user %ServiceAcct% -password %ServicePass% -admincontentdatabase %AdminContentDB% -cmd helpcollections -installall -cmd secureresources -cmd services -install -cmd installfeatures -cmd adminvs -provision -port 12345 -windowsauthprovider onlyusentlm -cmd applicationcontent -install</p>
<p>REM Install Gary Lapointe&#8217;s stsadm extensions</p>
<p>stsadm -o addsolution -filename lapointe.wsp</p>
<p>stsadm -o execadmsvcjobs</p>
<p>stsadm -o deploysolution -name lapointe.wsp -local -allowgacdeployment</p>
<p>REM Do your farm specific configuration</p>
<p>:End</p>
<p>REM Your error logic</p>
<p>:End</p>
<p>REM WooHoo we made it</p></blockquote>
<p><strong>Hotfix</strong></p>
<p>There&#8217;s lots of info out there describing the <a href="http://www.paulbednall.com/2008/12/updates-beware.html">SharePoint hotfix process</a> so I&#8217;ll keep this brief. We split our script into two parts. Part one runs the hotfix and is run on all the servers at the same time. Part two is run on the servers one at a time and calls the upgrade process and then copies the hotfix to the share that I mentioned right at the start of this post.</p>
<blockquote><p>psconfig -cmd upgrade -inplace b2b -wait -force</p>
<p>if %errorlevel% == 0 xcopy %hotfix% \\share\hotfixes\%hotfix%</p></blockquote>
<p>I&#8217;ve not had the opportunity to convert all the above into a powershell script. It should solve the error logic gripe and would allow me much more control over the environment, effectively exposing what Gary Lapointe has given us via his extensions.</p>
<p>So back to my original point. Is all the above really worth it? Do you script your installs or do you do it manually? If you do use automation, what process are you using?</p>
<p>edit: Right on queue, SharePointdevwiki have just posted an article about scripting Sharepoint. <a href="http://sharepointdevwiki.com/display/public/Scripting">Have a look</a></p>


<!-- Begin TwitThis script (http://twitthis.com/) -->
<div style="text-align:left;">
<script type="text/javascript" src="http://s3.chuug.com/chuug.twitthis.scripts/twitthis.js"></script>
<script type="text/javascript">
<!--
document.write('<a href="javascript:;" onclick="TwitThis.pop();"><img src="http://s3.chuug.com/chuug.twitthis.resources/twitthis_grey_72x22.gif" alt="TwitThis" style="border:none;" /></a>');
//-->
</script>
</div>
<!-- /End -->

]]></content:encoded>
			<wfw:commentRss>http://anthonysheldrake.com/?feed=rss2&amp;p=41</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
