<?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>CleverWorkarounds &#187; Infrastructure</title>
	<atom:link href="http://www.cleverworkarounds.com/category/infrastructure/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cleverworkarounds.com</link>
	<description>After much frustration, it seems DEFAULT is the way to go...</description>
	<lastBuildDate>Mon, 16 Aug 2010 22:56:22 +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>Why me? Web part errors on new web applications</title>
		<link>http://www.cleverworkarounds.com/2010/08/17/why-me-web-part-errors-on-new-web-applications/</link>
		<comments>http://www.cleverworkarounds.com/2010/08/17/why-me-web-part-errors-on-new-web-applications/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 16:27:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[Governance]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Risk]]></category>
		<category><![CDATA[SP2010]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Site Definitions]]></category>
		<category><![CDATA[Site Templates]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Web Parts]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2010/08/17/why-me-web-part-errors-on-new-web-applications/</guid>
		<description><![CDATA[Oh man, it’s just not my week. After nailing a certificate issue yesterday that killed user profile provisioning, I get an even better one today! I’ve posted it here as a lesson on how not to troubleshoot this issue! The symptoms: I created a brand new web application on a SP2010 farm, and irrespective of [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p>Oh man, it’s just not my week. After nailing a <a href="http://www.cleverworkarounds.com/2010/08/15/more-user-profile-sync-in-sp2010-certificate-provisioning-issues/" target="_blank">certificate issue</a> yesterday that killed user profile provisioning, I get an even better one today! I’ve posted it here as a lesson on how <strong>not </strong>to troubleshoot this issue!</p>
<h2>The symptoms:</h2>
<p>I created a brand new web application on a SP2010 farm, and irrespective of the site collection I subsequently create, I get the dreaded error &quot;Web Part Error: This page has encountered a critical error. Contact your system administrator if this problem persists&quot;</p>
<p>Below is a screenshot of a web app using the team site template. Not so good huh?</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb7.png" width="691" height="491" /></a> </p>
<h2>The swearing…</h2>
<p>So faced with this broken site, I do what any other self respecting SharePoint consultant would do. I silently cursed Microsoft for being at the root of all the world’s evils and took a peek into that very verbose and very cryptic place known as the ULS logs. Pretty soon I found messages like:</p>
<blockquote><p>0&#215;3348 SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; General&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8sl3 High&#160;&#160;&#160;&#160; DelegateControl: Exception thrown while building custom control &#8216;Microsoft.SharePoint.SPControlElement&#8217;: This page has encountered a critical error. Contact your system administrator if this problem persists. eff89784-003b-43fd-9dde-8377c4191592</p>
<p>0&#215;3348 SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Web Parts&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 7935 Information <a href="http://sp:81/default.aspx">http://sp:81/default.aspx</a> &#8211; An unexpected error has been encountered in this Web Part.&#160; Error: This page has encountered a critical error. Contact your system administrator if this problem persists., </p>
</blockquote>
<p>Okay, so that is about as helpful as a fart in an elevator, so I turned up the debug juice using that new, pretty debug juicer turner-upper (okay, the diagnostic logging section under monitoring in central admin). I turned on a variety of logs at different times including.</p>
<ul>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Configuration&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; General&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Web Parts&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Feature Infrastructure&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fields&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Web Controls&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Server&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; General&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Server&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Setup and Upgrade&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
<li>SharePoint Server&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Topology&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Verbose</li>
</ul>
<p>While my logs got very big very quickly, I didn’t get much more detail apart from one gem,to me, seemed so innocuous amongst all the detail, yet so kind of.. fundamental <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<blockquote><p>0&#215;3348 SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Web Parts&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emt7 High&#160;&#160;&#160;&#160; Error: Failure in loading assembly: Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a eff89784-003b-43fd-9dde-8377c4191592</p>
</blockquote>
<p>That rather scary log message was then followed up by this one – which proved to be the clue I needed.</p>
<blockquote><p>0&#215;3348 SharePoint Foundation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Runtime&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 6610 Critical Safe mode did not start successfully. This page has encountered a critical error. Contact your system administrator if this problem persists. eff89784-003b-43fd-9dde-8377c4191592</p>
</blockquote>
<p>It was about this time that I also checked the event logs (I told you this post was about how <strong>not </strong>to troubleshoot) and I saw the same entry as above.</p>
<p><font face="Verdana">Log Name:&#160;&#160;&#160;&#160;&#160; Application     <br />Source:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Microsoft-SharePoint Products-SharePoint Foundation      <br />Event ID:&#160;&#160;&#160;&#160;&#160; 6610      <br />Description:      <br />Safe mode did not start successfully. This page has encountered a critical error. Contact your system administrator if this problem persists.      <br /></font></p>
<p>I read the error message carefully. This problem was certainly persisting and I was the system administrator, so I contacted myself and resolved to search google for the “Safe mode did not start successfully” error.<font face="Verdana"></font></p>
<h2>The 46 minute mark epiphany </h2>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb8.png" width="121" height="231" /></a> </p>
<p>If you watch the TV series “House”, you will know that House always gets an epiphany around the 46 minute mark of the show, just in time to work out what the mystery illness is and save the day. Well, this is the 46 minute mark of this post!</p>
<p>I quickly found that others had this issue in the past, and it was the process where SharePoint checks web.config to process all of the controls marked as safe. If you have never seen this, it is the section of your SharePoint web application configuration file that looks like this:</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image9.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb9.png" width="674" height="336" /></a>&#160; </p>
<p>This particular version of the error is commonly seen when people deploy multiple servers in their SharePoint farm, and use a different file path for the INETPUB folder. In my case, this was a single server. So, although I knew I was on the right track, I knew this wasn’t the issue.</p>
<p>My next thought was to run the site in full trust mode, to see if that would make the site work. This is usually a setting that makes me mad when developers ask for it because it tells me they have been slack. I changed the entry</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">trust</span> <span class="attr">level</span><span class="kwrd">=&quot;WSS_Minimal&quot;</span> <span class="attr">originUrl</span><span class="kwrd">=&quot;&quot;</span> <span class="kwrd">/&gt;</span></pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>to </p>
<pre class="csharpcode">&lt;trust level=<span class="str">&quot;Full&quot;</span> originUrl=<span class="str">&quot;&quot;</span> /&gt;</pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>But to no avail. Whatever was causing this was not affected by code access security.</p>
<p>I reverted back to WSS_Minimal and decided to remove all of the SafeControl entries from the web.config file, as shown below. I knew the site would bleat about it, but was interested if the “Safe Mode” error would go away.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image10.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb10.png" width="437" height="215" /></a> </p>
<p>The result? My broken site was now less broken. It was still bitching, but now it appeared to be bitching more like what I was expecting.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image11.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb11.png" width="757" height="342" /></a> </p>
<p>After that, it was a matter of adding back the &lt;safecontrol&gt; elements and retrying the site. It didn’t take long to pinpoint the offending entry.</p>
</p>
<blockquote>
<p>&lt;SafeControl Assembly=&quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot; Namespace=&quot;Microsoft.SharePoint.WebPartPages&quot; TypeName=&quot;ContentEditorWebPart&quot; Safe=&quot;False&quot; /&gt;</p>
</blockquote>
<p>As soon as I removed this entry the site came up fine. I even loaded up the content editor web part without this entry and it worked a treat. Therefore, how this spurious entry got there is still a mystery.</p>
<h2>The final mystery</h2>
<p>My colleague and I checked the web.config file in C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\CONFIG. This is the one that gets munged with other webconfig.* files when a new web application is provisioned. </p>
<p>Sure enough, its modified date was July 29 (just outside the range of the SharePoint and event logs unfortunately). When we compared against a known good file from another SharePoint site, we immediately saw the offending entry.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image13.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb13.png" width="782" height="273" /></a> </p>
</p>
<p>The solution store on this SharePoint server is empty and no 3rd party stuff to my knowledge has been installed here. But clearly this file has been modified. So, we did what any self respecting SharePoint consultant would do…</p>
<p>…we blamed the last guy.</p>
<p>&#160;</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p>www.sevensigma.com.au</p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2010/08/17/why-me-web-part-errors-on-new-web-applications/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>More User Profile Sync issues in SP2010: Certificate Provisioning Fun</title>
		<link>http://www.cleverworkarounds.com/2010/08/15/more-user-profile-sync-in-sp2010-certificate-provisioning-issues/</link>
		<comments>http://www.cleverworkarounds.com/2010/08/15/more-user-profile-sync-in-sp2010-certificate-provisioning-issues/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 02:03:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Forefront Identity Manager]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SP2010]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[User Profiles]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2010/08/15/more-user-profile-sync-in-sp2010-certificate-provisioning-issues/</guid>
		<description><![CDATA[Wow, isn’t the SharePoint 2010 User Profile Service just a barrel of laughs. Without a bit of context, when you compare it to SP2007, you can do little but shake your head in bewilderment at how complex it now appears. I have a theory about all of this. I think that this saga started over [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p>Wow, isn’t the SharePoint 2010 User Profile Service just a barrel of laughs. Without a bit of context, when you compare it to SP2007, you can do little but shake your head in bewilderment at how complex it now appears.</p>
<p>I have a theory about all of this. I think that this saga started over a beer in 2008 or so. </p>
<p>I think that Microsoft decided that SharePoint 2010 should be able to write back to Active Directory (something that AD purists dislike but sold Bamboo many copies of their sync tool). Presumably the SharePoint team get on really well with the Forefront Identify Manager team and over a few Friday beers, the FIM guys said “Why write your own? Use our fit for purpose tool that does exactly this. As an added bonus, you can sync to other directories easily too”.</p>
<p>“Damn, that *is* a good idea”, says the SharePoint team and the rest is history. Remember the old saying, the road to hell is paved with good intentions? </p>
<p>Anyways, when you provision the UPS enough times, and understand what Forefront Identity Manager does, it all starts to make sense. Of course, to have it make sense, requires you to mess it up in the first place and I think that everyone universally will do this – because it is essentially <strong>impossible to get it right the first time </strong>unless you run everything as domain administrator. This is a key factor that I feel did not get enough attention within the product team. I have now visited three sites where I have had to correct issues with the user profile service. Remember, not all of us do SharePoint all day – for the humble system administrator that is also catering with the overall network, this implementation is simply too complex. Result? Microsoft support engineers are going to get a lot of calls here – and its going to cost Microsoft that way.</p>
<h2>One use-case they never tested</h2>
<p>I am only going to talk about one of the issues today because <a href="http://www.harbar.net/articles/sp2010ups.aspx">Spence</a> has written the definitive article that will get you through if you are doing it from scratch. </p>
<p>I went to a client site where they had attempted to provision the user profile synchronisation unsuccessfully. I have no idea of the things they tried because I wasn’t there unfortunately, but I made a few changes to permissions, AD rights and local security policy as per Spencers post. I then provisioned user profile sync again and I hit this issue. A sequence of 4 event log entries.</p>
<p><font face="Verdana">Event ID:&#160;&#160;&#160;&#160;&#160; 234     <br />Description:      <br />ILM Certificate could not be created: Cert step 2 could not be created: C:\Program Files\Microsoft Office Servers\14.0\Tools\MakeCert.exe -pe -sr LocalMachine -ss My -a sha1 -n CN=&quot;ForefrontIdentityManager&quot; -sky exchange -pe -in &quot;ForefrontIdentityManager&quot; -ir localmachine -is root      <br /></font></p>
<p><font face="Verdana">Event ID:&#160;&#160;&#160;&#160;&#160; 234     <br />Description:      <br />ILM Certificate could not be created: Cert could not be added: C:\Program Files\Microsoft Office Servers\14.0\Tools\CertMgr.exe -add -r LocalMachine -s My -c -n &quot;ForefrontIdentityManager&quot; -r LocalMachine -s TrustedPeople      <br /></font></p>
<p><font face="Verdana">Event ID:&#160;&#160;&#160;&#160;&#160; 234     <br />Description:      <br />ILM Certificate could not be created: netsh http error:netsh http add urlacl url=</font><a href="http://+:5725/"><font face="Verdana">http://+:5725/</font></a><font face="Verdana"> user=Domain\spfarm sddl=D:(A;;GA;;;S-1-5-21-2972807998-902629894-2323022004-1104)     <br /></font></p>
<p><font face="Verdana">Event ID:&#160;&#160;&#160;&#160;&#160; 234     <br />Description:      <br />Cannot get the self issued certificate thumbprint:       <br /></font></p>
<h2>The theory</h2>
<p>Luckily this one of those rare times where the error message actually makes sense (well – if you have worked with PKI stuff before). Clearly something went wrong in the creation of certificates. Looking at the sequence of events, it seems that as part of provisioning ForeFront Identity Manager, a self signed certificate was created for the Computer Account, added to the Trusted People certificate store and then is used for SSL on a web application or web service listening on port 5725. </p>
<p><em>By the way, don’t go looking for the web app listening on such a port in IIS because its not there. Just like <a href="http://blogs.msdn.com/b/bwelcker/archive/2007/12/04/everybody-why-leave-iis.aspx">SQL Reporting Services</a>, FIM likely uses very little of IIS and doesn’t need the overhead. </em>&#160;</p>
<p>The way I ended up troubleshooting this issue was to take a good look at the first error in the sequence and what the command was trying to do. Note the description in the event log is important here. “ILM Certificate could not be created: Cert step 2 could not be created”. So this implies that this command is the second step in a sequence and there was a step 1 that must have worked. Below is the step 2 command that was attempted.</p>
<p><font face="Verdana">C:\Program Files\Microsoft Office Servers\14.0\Tools\MakeCert.exe -pe -sr LocalMachine -ss My -a sha1 -n CN=&quot;ForefrontIdentityManager&quot; -sky exchange -pe -in &quot;ForefrontIdentityManager&quot; -ir localmachine -is root     <br /></font></p>
<p>When you create a certificate, it has to have a trusted issuer. Verisign and Thawte are examples and all browsers consider them trustworthy issuers. But we are not using 3rd party issuers here. Forefront uses a self-signed certificate. In other words, it trusts itself. We can infer that step 1 is the creation of this self-trusted certificate issuer by looking at the parameters of the MakeCert command that step 2 is using. </p>
<p>Now I am not going to annotate every Makecert parameter here, but the English version of the command above says something like: </p>
<blockquote><p>Make me a shiny new certificate for the local machine account and call it “ForefrontIdentityManager”, issued by a root certificate that can be found in the <strong>trusted root store </strong>also called ForeFrontIdentityManager. </p>
</blockquote>
<p>So this command implies that step 1 was the creation of that root certificate that issues the other certificates. <em>(Product team &#8211; you could have given the name of the root issuer certificate something different to the issued certificate)</em></p>
<h2>The root cause</h2>
<p>Now that we have established a theory of what is going on, the next step is to run the failing Makecrt command from a prompt and see what we get back. Make sure you do this as the Sharepoint farm account so you are comparing apples with apples.</p>
<p>C:\Program Files\Microsoft Office Servers\14.0\Tools&gt;MakeCert.exe -pe -sr LocalMachine -ss My -a sha1 -n CN=&quot;ForefrontIdentityManager&quot; -sky exchange -pe -in &quot;ForefrontIdentityManager&quot; -ir localmachine -is root</p>
<p><strong>Error: There are more than one matching certificate in the issuer&#8217;s root cert store. Failed</strong></p>
<p>Aha! so what do we have here? The error message states that we have more than 1 matching certificate in the <strong>issuers root certificate store</strong>. </p>
<p><em>For what its worth it is the parameters “-ir localmachine -is root” that specifies the certificate store to use. In this case, it is the <strong>trusted root certificate store </strong>on the <strong>local computer</strong>.</em></p>
<p>So lets go and take a look. Run the Microsoft Management Console (MMC) and Choose “Add/Remove Snap In” from the File Menu.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb4.png" width="553" height="386" /></a> </p>
<p>From the list of snap ins choose Certificates and then choose “Computer Account”</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb5.png" width="244" height="126" /></a> </p>
<p>Now in the list of certificate stores, we need to examine the one that the command refers to: The Trusted Root Certification Authorities store. Well, look at that, the error was telling the truth!</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb6.png" width="781" height="421" /></a> </p>
<p>Clearly the Forefront Identity Manager provisioning/unprovisioning code does not check for all circumstances. I can only theorise what my client did to cause this situation because I wasn’t privy to what was done on this particular install before I got there. but step 1 of this provisioning process would create an issuing certificate whether <strong>one existed already or not</strong>. Step 2 then failed because it had no way to determine which of these certificates is the <strong>authoritative one</strong>.</p>
<p>This was further exacerbated because each re-attempt creates another root certificate because there is <strong>no check whether a certificate already exists</strong>.</p>
<p>The cure is quite easy. Just delete all of the certificates from the Trusted Root Certification Authorities and re-provision the user profile sync in SharePoint. Provided that there is no certificate in this store to begin with, step 1 will create it and step 2 will then be able to create the self signed certificate using this issuer just fine.</p>
<h2>Conclusion (and minor rant)</h2>
<p>Many SharePoint pros have commented on the insane complexity of the new design of the user profile sync system. Yes I understand the increased flexibility offered by the new regime, leveraging a mature product like Forefront, but I see that with all of this flexibility comes risk that has not been well accounted for. SP2010 is twice as tough to learn as SP2007 and it is more likely that you will make a mistake than not making one. The more components added, the more points of failure and the less capable over-burdened support staff are in dealing with it when it happens. </p>
<p>SharePoint 2010 is barely out of nappies and I have already been in a remediation role for several sites over the user profile service alone. </p>
<p>I propose that Microsoft add a new program level KPI to rate how well they are doing with their SharePoint product development. That KPI should be something like % of time a system administrator can provision a feature without making a mistake or resorting to running it all as admin. The benefit to Microsoft would be tangible in terms of support calls and failed implementations. Such a KPI would force the product team to look at an example like the user profile service and think “How can we make this more resilient?”. “How can we remove the number of manual steps that are not obvious?”, “how can we make the wizard clearer to understand?” (yes they *will* use the wizard).</p>
<p>Right now it feels like the KPI was how many features could be crammed, in as well as how much integration between components there is. If there is indeed a KPI for that they definitely nailed it this time around.</p>
<p>Don’t get me wrong – its all good stuff, but if Microsoft are stumping seasoned SharePoint pros with this stuff, then they definitely need to change the focus a bit in terms of what constitutes a good product.</p>
<p>&#160;</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2010/08/15/more-user-profile-sync-in-sp2010-certificate-provisioning-issues/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Index index everywhere but not a result in sight.</title>
		<link>http://www.cleverworkarounds.com/2010/08/12/index-index-everywhere-but-not-a-result-in-sight/</link>
		<comments>http://www.cleverworkarounds.com/2010/08/12/index-index-everywhere-but-not-a-result-in-sight/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 13:56:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2010/08/12/index-index-everywhere-but-not-a-result-in-sight/</guid>
		<description><![CDATA[I have been doing a bit more tech work than normal lately – SP2010 popularity I guess, and was asked to remediate a few issues on a problematic server that I hadn’t set up. The server in question had a number of issues (over and above the usual “lets all run it as one account” [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p>I have been doing a bit more tech work than normal lately – SP2010 popularity I guess, and was asked to remediate a few issues on a problematic server that I hadn’t set up. The server in question had a number of issues (over and above the usual “lets all run it as one account” type stuff) that had a single root cause, so I thought I’d quickly document the symptoms and the cause here.</p>
<h2>Symptom 1: SQL Server Event ID 28005: </h2>
<p>“An exception occurred while enqueueing a message in the target queue. Error: 15404, State: 19. Could not obtain information about Windows NT group/user ‘DOMAIN\someuser&#8217;, error code 0&#215;5”</p>
<p>This error would be reported in the Application log around 70 times per minute. As it happened, I had removed the account in question from running any of the SharePoint web, application or windows services, but this still persisted. I suspect SharePoint was installed as this account because it was the db owner of many of the databases on the SQL Server. Whatever the case, SQL was whinging about it despite its lack of actual need to be there.</p>
<h2>Symptom 2: Event ID 4625:</h2>
<p>At a similar rate of knots as the SQL error, was the rate of 4625 errors in the security log. These logs were not complaining about the account that the SQL event complained about, but instead it complained about ANY account running the SQL Server instance. I tried network service, a domain account and a local account and saw similar errors (although the local one had a different code).</p>
<pre class="csharpcode">Log Name:      Security
Source:        Microsoft-Windows-Security-Auditing
Event ID:      4625
Task Category: Logon
Keywords:      Audit Failure
Description:  An account failed to log on. 

Subject:
    Security ID:        NETWORK SERVICE
    Account Name:        COMPUTER$
    Account Domain:        DOMAIN
    Logon ID:        0x3e4 

Failure Information:
    Failure Reason:        Unknown user name or bad password.
    Status:            0xc000006d
    Sub Status:        0xc0000064 

Process Information:
    Caller Process ID:    0x7e0
    Caller Process Name:    E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\sqlservr.exe 

Detailed Authentication Information:
    Logon Process:        Authz
    Authentication Package:    Kerberos</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>When using a local, rather than a domain user account the code was:</p>
<pre class="csharpcode">Failure Information:
    Failure Reason:        An Error occured during Logon.
    Status:            0xc000005e
    Sub Status:        0x0 </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>Symptom 3: Search only working for domain administrators</h2>
<p>On top of the logs being filled by endless entries of the previous two, I had another error (the original reason why I was called in actually). A SharePoint search would yield zip, nada, zero, no results for a regular user, but a domain administrator could happily search SP2010 and get results. (well actually regular users did get some results &#8211; people searched actually worked fine). </p>
<p>The crawler was fine and dandy and the default content source had not been messed with. There were no errors or logs to suggest anything untoward.</p>
<h2>The resolution:</h2>
<p>It was the second symptom that threw me because I thought that the problem must have been kerberos config. But I quickly discounted that after checking SPN’s and the like (notwithstanding the fact this was a single server install anyway!)</p>
<p>On a hunch (helped by the fact that I had dealt with the issue of <a href="http://social.technet.microsoft.com/Forums/en-US/sharepoint2010setup/thread/5279f8da-2924-461f-8c35-5b81a2329927">registering managed accounts</a> not so long ago), I concentrated on the user account that was causing SQL Server all the trouble (Event ID 28005). I loaded up Active Directory and temporarily changed the security of this user account so that “Authenticated Users” had “READ” access to it.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb3.png" width="430" height="407" /></a> </p>
<p>As soon as I did this, both event ID 28005 and 4625 stopped. </p>
<p>I then checked the search (symptom 3) and it was still barfing. In this case I decided to turn up the debug juice on the “Query” and “Query Processor” functions of “SharePoint Server Search”. </p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/image_thumb2.png" width="295" height="439" /></a></p>
<p>After upping the level of verbosity, I found what I was looking for.</p>
<p><em><font size="2" face="Verdana">08/12/2010 22:13:41.00&#160;&#160;&#160;&#160; w3wp.exe (0&#215;2228)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0x1F0C&#160;&#160;&#160; SharePoint Server Search&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Query Processor&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; g2j3&#160;&#160;&#160; High&#160;&#160;&#160;&#160;&#160;&#160;&#160; AuthzInitializeContextFromSid failed with ERROR_ACCESS_DENIED. This error indicates that the account under which this process is executing may not have read access to the tokenGroupsGlobalAndUniversal attribute on the querying user&#8217;s Active Directory object. Query results which require non-Claims Windows authorization will not be returned to this querying user.&#160;&#160;&#160; debd2c54-d6a5-41b8-bf26-c4697b36f4d4</font></em></p>
<p>I knew immediately that this was very likely the same issue as the first two symptoms and when I googled this result, my Perth compatriot, Jeremy Thake had hit the <a href="http://social.technet.microsoft.com/Forums/en-US/sharepoint2010setup/thread/688b5c52-f478-463b-bc00-debfd0c3be2b">same issue</a> in July. The fix is to add your search service account to a group called “Pre-Windows 2000 Compatibility Access” group. This group happens to have the right required to read this attribute. Whether it is the same attribute I needed for my SQL issue, or the registering managed accounts issue I don’t know, but what I do know is that this group loosens up permissions enough to cure all four of these issues.</p>
<p><em>The little security guy in me keeps telling me I should confirm the least privilege in each of these scenarios, but hey if Microsoft are saying to put the accounts into this group, then who am I to argue?</em></p>
<p>Finally, it turns out that SP2010 re-introduced something that was in SP2003. A call to a function called <a href="http://msdn.microsoft.com/en-us/library/aa376309(VS.85).aspx">AuthzInitializeContextFromSid</a> which seems to be the root of it all. Apparently it was not used in SP2007, but its sure there now. I assume that one of the many stored procedures that SharePoint would call in SQL may have been the cause of Symptom 1. When you look at Symptom 2, it now makes sense because AD was faithfully reporting an access denied when the call to AuthzInitializeContextFromSid was made. It reported SQL Server as the culprit, I assume, because of a stored proc doing the work perhaps? It just sucks that the security event logged is a fairly stock message that doesn’t give you enough specifics to really work out what is going on. </p>
<p>Anyway, I hope that helps someone else – as googling the event ID details is not overly helpful</p>
<p>&#160;</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2010/08/12/index-index-everywhere-but-not-a-result-in-sight/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQL Server oddities</title>
		<link>http://www.cleverworkarounds.com/2010/08/01/sql-server-oddities/</link>
		<comments>http://www.cleverworkarounds.com/2010/08/01/sql-server-oddities/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 20:08:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Troubleshooting]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2010/08/01/sql-server-oddities/</guid>
		<description><![CDATA[So its Saturday night and where I should be out having fun, I am instead sitting in a training room in Wellington New Zealand, configuring a lab for a course I am running on Monday. Each student lab setup is two virtual machines. The first being a fairly stock standard AD domain controller and the [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p>So its Saturday night and where I should be out having fun, I am instead sitting in a training room in Wellington New Zealand, configuring a lab for a course I am running on Monday. </p>
<p>Each student lab setup is two virtual machines. The first being a fairly stock standard AD domain controller and the second being a SQL/SharePoint 2010 box. Someone else set up the machines, and I came in to make some changes for the labs next week. But as soon as I fired up the first student VM&#8217;s I hit a snag. I loaded SQL Server Management Studio, only to find that I was unable to connect to it as the domain administrator, despite being fairly certain that the account had been granted the sysadmin role in SQL.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image002.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image002_thumb.jpg" width="443" height="324" /></a></p>
<p>Checking the event logs, showed an error that I had not seen before. “Token-based server access validation failed with an infrastructure error”. hmmm</p>
<blockquote><p>Log Name: Application</p>
<p>Source: MSSQLSERVER</p>
<p>Date: 31/07/2010 6:45:37 p.m.</p>
<p>Event ID: 18456</p>
<p>Task Category: Logon</p>
<p>Level: Information</p>
<p>Keywords: Classic,Audit Failure</p>
<p>User: TRAINSBYDAVE\administrator</p>
<p>Computer: SP01.trainsbydave.com</p>
<p>Description:</p>
<p>Login failed for user &#8216;TRAINSBYDAVE\administrator&#8217;. Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors. </p>
<p>[CLIENT: &lt;local machine&gt;]</p>
<p>Event Xml:</p>
<p>&lt;Event xmlns=&quot;http://schemas.microsoft.com/win/2004/08/events/event&quot;&gt;</p>
<p>&lt;System&gt;</p>
<p>&lt;Provider Name=&quot;MSSQLSERVER&quot; /&gt;</p>
<p>&lt;EventID Qualifiers=&quot;49152&quot;&gt;18456&lt;/EventID&gt;</p>
<p>&lt;Level&gt;0&lt;/Level&gt;</p>
<p>&lt;Task&gt;4&lt;/Task&gt;</p>
<p>&lt;Keywords&gt;0&#215;90000000000000&lt;/Keywords&gt;</p>
<p>&lt;TimeCreated SystemTime=&quot;2010-07-31T06:45:37.000000000Z&quot; /&gt;</p>
<p>&lt;EventRecordID&gt;8281&lt;/EventRecordID&gt;</p>
<p>&lt;Channel&gt;Application&lt;/Channel&gt;</p>
<p>&lt;Computer&gt;SP01.trainsbydave.com&lt;/Computer&gt;</p>
<p>&lt;Security UserID=&quot;S-1-5-21-3713613819-1395520312-4192346095-500&quot; /&gt;</p>
<p>&lt;/System&gt;</p>
<p>&lt;EventData&gt;</p>
<p>&lt;Data&gt;TRAINSBYDAVE\administrator&lt;/Data&gt;</p>
<p>&lt;Data&gt; Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors.&lt;/Data&gt;</p>
<p>&lt;Data&gt; [CLIENT: &amp;lt;local machine&amp;gt;]&lt;/Data&gt;</p>
</blockquote>
<p>As it happened, whoever set it up had SQL Server in mixed mode authentication, so I was able to sign in as the sa account and have a poke around. All things considered, it should have worked. The user account in question was definitely in the logins and set with sysadmin server rights as shown below.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image004.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image004_thumb.jpg" width="583" height="339" /></a></p>
<p>Uncle google showed a few people with the error but not as many as I expected to see since half the world gets nailed on authentication issues. I also took the event log suggestion and looked for a previous error. A big nope on that suggestion. In fact in all respects, everything looked sweet. The machine was valid on the domain and I was able to perform any other administrative task. </p>
<p>Finally, I removed the TRAINSBYDAVE\administrator account from the list of Logins in SQL Server. It gave the unsurprising whinge about orphaned database users, but luckily for AD accounts when you re-add the same account back it is smart enough to re-establish the link.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image006.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image006_thumb.jpg" width="422" height="96" /></a></p>
<p>As soon as I re-added the account, all was good again. If I was actually interested enough I&#8217;d delve into why this happened, but not tonight &#8211; I have another 6 student machines to configure <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Goodnight!</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image008.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/08/clip_image008_thumb.jpg" width="385" height="253" /></a></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2010/08/01/sql-server-oddities/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SharePoint Webcasts: Reporting Services for the Really Really Good Looking</title>
		<link>http://www.cleverworkarounds.com/2010/02/22/sharepoint-webcasts-reporting-services-for-the-really-really-good-looking/</link>
		<comments>http://www.cleverworkarounds.com/2010/02/22/sharepoint-webcasts-reporting-services-for-the-really-really-good-looking/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 00:25:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Bruno]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[Hansel]]></category>
		<category><![CDATA[Offbeat]]></category>
		<category><![CDATA[SQL Reporting services]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Speaking presentation]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Zoolander]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[user engagement]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/?p=1784</guid>
		<description><![CDATA[Last year, Peter Serzo and I presented at the SharePoint Best Practices Conference in DC. We did an extremely serious talk called “SharePoint and SQL Reporting Services 2008 for the really really good looking” which rated rather well. As part of this, we recorded a bunch of screencasts that have never seen the light of [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image.png"><img style="border-right-width: 0px; margin: 0px 0px 0px 20px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="right" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image_thumb.png" width="187" height="358" /></a>Last year, <a href="http://sharepointusermagic.com/default.aspx">Peter Serzo</a> and I presented at the SharePoint Best Practices Conference in DC. We did an extremely serious talk called “SharePoint and SQL Reporting Services 2008 for the really really good looking” which rated rather well. As part of this, we recorded a bunch of screencasts that have never seen the light of day, so I thought that some would benefit from this being released to a wider audience.</p>
<p><em><strong>Note: This post and content is really going make utterly no sense unless you have watched Zoolander. Even if you have seen the movie, before you launch into the webcasts, some scene setting is required. </strong></em></p>
<h2></h2>
<h2>The business need</h2>
<p>Some time ago, Peter and I were contracted by the Derek Zoolander School for the Really, Really Good Looking after Derek saw Microsoft’s new SharePoint diagram when he accidentally picked up a “Computerworld” magazine. Apart from matching Derek’s suit colour rather nicely, the diagram captivated his imagination with the notion of “Insights”. </p>
<p>Zoolander thought that “Insight”, sounded like the perfect look to follow up from the highly successful “Magnum”, which he used to save the Malaysian prime ministers life. He took the diagram to his wife, and demanded that he must have “Insights” at all costs.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image_thumb1.png" width="529" height="301" /></a></p>
<p>Zoolander’s wife saw the business problem that “Insights” would help to address. You see, the Derek Zoolander School for the Really, Really Good Looking, at great expense, custom developed an ERP system to manage everything you needed to know about male models. The system was called the “<strong><font size="4">C</font></strong>omputerised <strong><font size="4">R</font></strong>ecords for <strong><font size="4">A</font></strong>ttractive <strong><font size="4">P</font></strong>eople”…</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image_thumb2.png" width="531" height="334" /></a> </p>
<p>The <strong>CRAP</strong> system stored all sorts of interesting information about male models, such as tracking their “hotness”, as well as important detail such as stated age versus actual age, and any cosmetic procedures that they have undertaken. After a long and expensive consultation, Peter and I concluded that SharePoint 2007, integrated with SQL Reporting Services, was the perfect solution to create the all important “Insights” that Zoolander so desperately needed.</p>
<p>As a result, we conducted a project kickoff meeting with Hansel and Peter tried to explain the architecture of reporting services using a nice diagram.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image_thumb3.png" width="312" height="363" /></a> </p>
<p>… but we worked out pretty quickly that this was not the way to explain how it all worked to poor old Hansel…</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image_thumb4.png" width="312" height="321" /></a> </p>
<p>So instead, we went the live demo route. Being male models, custom development was totally out of the question. This solution had to be done using all out of the box methods in a quick and easy manner. Below are the four live demos that were recorded and now you can use them as inspiration for your own male modelling school.</p>
<ul>
<li>Our first webcast illustrates how we were able to create a meaningful report from the CRAP system within five minutes. </li>
<li>The second webcast expanded on this idea, by illustrating how reports can be parameterised and linked together for drilldown reporting. </li>
<li>The third demo modifies the user profile store to allow for recording of each users unique ID in the CRAP system</li>
<li>The last webcast strings this all together for the final demonstration where we pimp the report to make it dynamic with no custom code.</li>
</ul>
<p>&#160;</p>
<p> <center><br />
<table border="0" cellspacing="0" cellpadding="2" width="618">
<tbody>
<tr>
<td valign="top" width="321" align="center"><a title="The 5 minute report webcast" href="http://www.cleverworkarounds.com/webcasts/5minutereport.htm"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image5.png" width="244" height="183" /></a>&#160;</td>
<td valign="top" width="295" align="center"><a title="Drilling down" href="http://www.cleverworkarounds.com/webcasts/drilldown.htm"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image9.png" width="244" height="185" /></a></td>
</tr>
<tr>
<td valign="top" width="321" align="center">
<p align="center"><a href="http://www.cleverworkarounds.com/webcasts/5minutereport.htm">The 5 minute report</a></p>
</td>
<td width="295" align="center" lign="center"><a title="Drilling down" href="http://www.cleverworkarounds.com/webcasts/drilldown.htm">Drilling down with Derek</a></td>
</tr>
<tr>
<td valign="top" width="321" align="center"><a title="User profiles" href="http://www.cleverworkarounds.com/webcasts/userprofiles.htm"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image10.png" width="244" height="185" /></a> </td>
<td valign="top" width="295" align="center"><a title="Pimp My Site" href="http://www.cleverworkarounds.com/webcasts/pimpmysite.htm"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2010/02/image11.png" width="244" height="184" /></a> </td>
</tr>
<tr>
<td width="321" align="center">
<p><a title="User Profiles for the really really good looking" href="http://www.cleverworkarounds.com/webcasts/userprofiles.htm">User Profiles for the really really good looking</a></p>
</td>
<td width="295" align="center"><a title="Pimp my report" href="http://www.cleverworkarounds.com/webcasts/pimpmysite.htm">Pimp my report</a></td>
</tr>
</tbody>
</table>
<p> </center>
<p>&#160;</p>
<p>We hope you find some value from these webcasts and we look forward to hearing about your hot new look as a result!</p>
<p>Thanks for reading</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2010/02/22/sharepoint-webcasts-reporting-services-for-the-really-really-good-looking/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SBS 2008, Hewlett Packard, WSS3, Search Server 2008 Express and a UPS – Oh the pain!</title>
		<link>http://www.cleverworkarounds.com/2009/11/29/sbs-2008-hewlett-packard-wss3-search-server-2008-express-and-a-ups-oh-the-pain/</link>
		<comments>http://www.cleverworkarounds.com/2009/11/29/sbs-2008-hewlett-packard-wss3-search-server-2008-express-and-a-ups-oh-the-pain/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 12:47:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Assurance]]></category>
		<category><![CDATA[Governance]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Risk]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Troubleshooting]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2009/11/29/sbs-2008-hewlett-packard-wss3-search-server-2008-express-and-a-ups-oh-the-pain/</guid>
		<description><![CDATA[In the words of Doctor Smith from lost in space, while everyone else was in Vegas having a grand old time, I was at a client site, having to come to grips with the beast known as Windows Small Business Server 2008. I rarely work with SBS2003 and had never used SBS2008 until now. This [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/11/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/11/image_thumb3.png" width="240" height="240" /></a> </p>
<p>In the words of Doctor Smith from lost in space, while everyone else was in Vegas having a grand old time, I was at a client site, having to come to grips with the beast known as Windows Small Business Server 2008. I rarely work with SBS2003 and had never used SBS2008 until now. </p>
<p>This was one of those engagements that is somewhat similar to those awful dreams that you have when you are trying to get to some place, but you never quite get there and your subconscious puts all sorts of strange and surreal obstacles in your path. In my case, the surreal obstacles were very real, yet some of them were really really dumb. Whatsmore, it is a very sad indictment on IT at several levels and a testament to how complexity will never be tamed with yet more complexity.</p>
<p>As a result, I really <a href="http://www.cleverworkarounds.com/2008/09/25/complexity-bites-when-sharepoint-risk/" target="_blank">fear the direction</a> that IT in general is heading.</p>
<p>So where to begin? This project was easy enough in theory. A former colleague called me up because he knew of my dim, dark past in the world of Cisco, Active Directory and SharePoint. He asked me to help put in SBS2008 for him, configuring Exchange/AD/SharePoint and migrating his environment over to it. </p>
<p>“Sure”, I say, “it’ll be a snap” (famous last words)</p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<p>I haven’t use the coffee or tequila ratings for a while, so I thought that this post was apt for dusting them off. If you check the <a href="http://www.cleverworkarounds.com/2008/04/11/why-do-sharepoint-projects-fail-part-1/" target="_blank">Why do SharePoint Projects Fail</a> series, you will see that I use tequila shots or coffee at times. In this case, I will use the tequila shots to demonstrate my stress levels.</p>
<h2>Attempt 1</h2>
<p>We start our sorry tale a few weeks ago, where my client had ordered Small Business Server 2008 and the media/key had not arrived by the time I was due to start. The supplier came to the rescue by sending them a copy of the media and promised to send the license key in a couple of days. </p>
<p>The server was a HP Proliant DL360 G6, a seemingly nice box with some good features at a reasonable price. HP/Compaq people will be familiar with the <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/DocumentIndex.jsp?contentType=SupportFAQ&amp;lang=en&amp;cc=us&amp;docIndexId=64178&amp;taskId=101&amp;prodTypeId=18964&amp;prodSeriesId=345557" target="_blank">SmartStart</a> software and process, where instead of using the windows media, you pop in the supplied SmartStart CD and it will perform some admin tasks, before asking for the windows media, auto-magically slipstreaming drivers and semi-automating the install.</p>
<p>On client machines, I never use the CD from the vendor because there is always too much bloatware crap. However on servers I generally do use the CD, because it tends to come with all the tools necessary to manage disk storage, firmware and the like. I dutifully popped in SmartStart CD, answered a few basic questions, and it asked for the windows media CD. </p>
<p><strong>Cleverworkarounds stress rating: Good so far</strong></p>
<p>Next it asked me for the Windows SBS2008 licence key. Of course, I was using media that had been lent to us from the supplier because my client’s media (and keys) had not arrived. Thus, since I did not have a license key I was unable to proceed with the install using this preferred manner. HP, in their infinite wisdom, have <strong>assumed </strong>that you always have the license key when you install via their SmartStart CD, <strong>despite Microsoft giving you 30 days to activate the product</strong>. To be fair on HP, they are hooking into Microsoft’s unattended installation framework, so perhaps the blame should be shared. </p>
<p>All was not lost however. The SmartStart CD can be run after windows has been installed. It then will install all the necessary “HP bits” like graphics and system board drivers. So I booted off the Windows CD and fortunately, windows installer detected the HP storage controller and the disk array,&#160; and proceeded to let me partition it and install. </p>
<p><strong>Cleverworkarounds stress rating: Minor annoyance, but good so far</strong></p>
<p>Small Business Server 2008 did its thing and then loaded up a post install wizard that sets the timezone, active directory domain name and the like. At a certain step when running this wizard, SBS2008 informed me that there was no network card with a driver loaded, so it could not continue. As it turns out, Microsoft’s initial SBS2008 configuration wizard simply will not proceed <strong>unless</strong> it finds a valid network card. But since this is the pre-install wizard, we are not yet at the point in the installation where we have a proper windows desktop with start menu and windows explorer. All is not lost (apparently), because SBS allows you to start device manager from within the wizard and search for the driver.</p>
<p>Fair enough, I think to myself, so I pop in the HP SmartStart CD and tell device manager to search the media.</p>
<p><strong>Cleverworkarounds stress rating: Spider senses tingle that today might not turn out well</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<p>Windows device manager comes back and tells me that it <strong>cannot find any drivers</strong>. </p>
<p>Why? </p>
<p>Well after some examination, the SmartStart drivers are all <strong>self extracting executables</strong> and therefore device manager could not find them when I told it to. Of course, the self extracting zip files have hugely meaningful names like C453453.EXE making it really obvious to work out what driver set is the one required… not!</p>
<p>Luckily, Ctrl+Alt+Del gave me task manager which allowed me to start a windows explorer session, and I was able to browse to the CD and run the autorun of the SmartStart CD manually. This loaded up HP’s fancy schamsy driver install software that produces a nice friendly report on what system software is missing and proceeds to install it all for you.</p>
<p>SmartStart did its thing, finding all of the driverless hardware and installed the various drivers. A few minutes and a reboot later and SBS2008 reruns its configuration wizard and this time finds the network and allows me to complete the wizard. This triggers another thirty minutes of configuration and another reboot and we have ourselves a small business server!</p>
<p><strong>Cleverworkarounds stress rating: Spider senses subside – back on track?</strong></p>
<p>Next I did something that is a habit that has served me well over the years (until now). I reran the Smartstart CD, now with a network and internet access. This time I told the driver management utility to connect to HP.COM. It scanned HP and reported to me that most drivers on the SmartStart CD were out of date. This is unsurprising because most of the time I do server builds for any vendor, I find that about half of the drivers, BIOS and various firmwares have been replaced by newer versions since the CD was pressed. </p>
<p>Since this is a brand new server build, it is a habit of mine to upgrade to the latest drivers, BIOS and firmware before going any further. </p>
<p>Among the things found to be out of date was the BIOS, the firmware on the RAID Storage controller as well as the network card. The SmartStart software downloaded all of these updates, and another reboot later, all are installed happily. Another hour of patching via Windows update, and we have a ready to go SBS2008 server with WSS3, Exchange, SQL Express and WSUS all configured automatically for you.</p>
<p><strong>Cleverworkarounds stress rating: This SBS2008 stuff isn’t so bad right? </strong></p>
<p>Okay, so things were good so far, but now here is where the fun really begins.</p>
<p>Windows 2008 SBS comes with a <strong>pre-installed</strong> WSS3 site called http://Companyweb. As we all know, search completely sucks in WSS3. It has a bunch of limitations and isn’t a patch on what you get with MOSS. But no problem – we have <a href="http://www.microsoft.com/enterprisesearch/en/us/search-server-express.aspx" target="_blank">Microsoft Search Server Express</a> now, a free upgrade which turns WSS search from complete horribleness to niceness fairly quickly. </p>
<p><em>For those of you reading this who run WSS3 and have not installed Search Server Express, I suggest you investigate it as it does offer a significant upgrade of functionality. Search server express pretty much makes WSS3 have the same search capabilities of MOSS 2007.</em></p>
<p>So, I proceeded to install Search Server 2008 express onto this Small Business Server 2008 box. I have installed Search Server Express quite a few times before and I have to admit, it is a tricky install at times. But given that this was a fresh Small Business Server 2008 install and not in production, as well as having successfully installed it on Small Business Server 2003 previously, I felt that I should be safe.</p>
<p>I commenced the Search Server 2008 express install, and the first warning sign that my day was about to turn bad showed itself. The install of search server express <strong>only allowed me to choose the “Basic” option</strong>. The option that I wanted to use, “Advanced” was greyed out and therefore unavailable. </p>
<p><strong>Cleverworkarounds stress rating: Spider senses tingling again</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<p>Knowing this server was not in production, I went ahead and allowed Search Server Express to install as per the forced basic setting. The install itself appeared to work, but it died during the SharePoint configuration wizard. It specifically crapped out on step 9, with the error message </p>
<p>“Failed to create sample data. An exception of type Microsoft.SharePoint.SPException was thrown.&#160; Additional exception information: User cannot be found”. </p>
<p>“Curses!” I say, “another trip to logs folder in the 12 hive”. For the nerds, the log is pasted below.</p>
<p><font size="2" face="Courier">[SPManager] [INFO] [10/21/2009 3:38:47 PM]: Finished upgrading SPContentDatabase Name=ShareWebDb Parent=SPDatabaseServiceInstance Name=Microsoft##SSEE.      <br />[SPManager] [DEBUG] [10/21/2009 3:38:47 PM]: Using cached [SPContentDatabase Name=ShareWebDb Parent=SPDatabaseServiceInstance Name=Microsoft##SSEE] NeedsUpgrade value: False.       <br />[SharedResourceProviderSequence] [DEBUG] [10/21/2009 3:38:47 PM]: Unable to locate SearchDatabase. Exception thrown was: <strong>System.Data.SqlClient.SqlException: Cannot open database &quot;SharedServices_DB_ed3872ca-06b1-44c5-8ede-5a81b52265f9&quot; requested by the login. The login failed.        <br />Login failed for user &#8216;NT AUTHORITY\NETWORK SERVICE&#8217;.         <br /></strong>&#160;&#160; at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)       <br />&#160;&#160; at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)       <br />&#160;&#160; at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)       <br />&#160;&#160; at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)</font></p>
<p>The long and short of this error takes a little while to explain. First we need to explain the historical difference between SQL Server <strong>Express</strong> edition and SQL Server <strong>Embedded</strong> edition (also known as the Windows internal database). From wikipedia: </p>
<p><a href="http://en.wikipedia.org/wiki/Windows_Internal_Database">SQL Server 2005 Embedded Edition (SSEE)</a>: SQL Server 2005 Embedded Edition is a specially configured named instance of the SQL Server Express database engine which can be accessed only by certain Windows Services. </p>
<p><a href="http://en.wikipedia.org/wiki/SQL_Server_Express">SQL Server Express Edition</a>: SQL Server Express Edition is a scaled down, free edition of SQL Server, which includes the core database engine. While there are no limitations on the number of databases or users supported, it is limited to using one processor, 1 GB memory and 4 GB database files. </p>
<p>Why does this matter? Well Microsoft, being the wise chaps that they are, decided that when you perform a SharePoint installation using the “basic” option, <strong>different editions of SharePoint use different editions of SQL Server! </strong>Mark Walsh explains it <a href="http://social.technet.microsoft.com/Forums/en-US/sharepointadmin/thread/f6d876ff-cca5-4734-b983-0dae61874389" target="_blank">here</a>:</p>
<ul>
<li>When you use the &quot;Basic&quot; install option during <strong>MOSS 2007</strong> installation it will install and use <a href="http://technet.microsoft.com/en-gb/library/cc678868.aspx">SQL Server 2005 Express Edition</a> and you have a 4GB database size limit. </li>
<li>When you use the &quot;Basic&quot; install option during <strong>WSS 3.0</strong> installation it <strong>DOES NOT</strong> use SQL Express, it uses SQL Server 2005 Embedded edition and it DOES NOT have a 4GB size limit. </li>
</ul>
<p>It happens that Small Business Server 2008 comes with WSS3 preinstalled. Annoyingly, but unsurprisingly, the Small Business Server team opted to use the BASIC installation mode. As described above, SQL Server Embedded Edition (known on Win2008 as the Windows Internal Database) is used. <em>For reference, WSUS on Small Business Server 2008 also uses this database instance</em>.</p>
<p>BUT BUT BUT…</p>
<p>Search Server 2008 Express, uses <strong>SQL Server Express edition </strong>when performing a basic install. As a result, an <strong>additional SQL Server Express instance </strong>(SERVERNAME\OFFICESERVERS) gets installed onto the Small Business 2008 server. Then, to make matters worse, the installer gets mixed up and installs some Search Server express databases into the new instance (a Shared Service Provider), but then uses the SQL Embedded Edition instance to install other databases (like the searchDB). Then later during the configuration wizard, it cannot find the databases that it needs because it searches the wrong instance!</p>
<p>The net result is the error shown in the log above. I tried all sorts of things like copying the Express databases into the embedded edition, but I couldn’t disentangle this dependency issue. Some parts of SharePoint (the search server express bits no doubt) looked in the SQL Express instance and the WSS bits looked in the Embedded SQL instance. Eventually, conscious of time, I proceeded to uninstall Search Server Express.</p>
<p><strong>Cleverworkarounds stress rating: Some swear words now uttered</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<p>Uninstalling Search Server Express was attempted and tells me that it has successfully completed and wants a reboot. Unfortunately SharePoint is now even more hosed than it was before and I tried a few things to get things back on track (psconfig to create a new farm and the like). After more frustration, and conscious of time I decided to uninstall WSS3 altogether and then reinstall it according to the <a href="http://technet.microsoft.com/en-us/library/dd430085(WS.10).aspx" target="_blank">SBS Repair guide</a> for WSS3. </p>
<p>This had the effect of stuffing up WSUS as well! (I assume because it shares the same Windows Internal Database instance), and after a couple of hours of trying all sorts of increasingly hacky ways of getting all of this working, I was forced to give up.</p>
<p><em>Note: Whatever you do, do not attempt <a href="http://blogs.vishwak.com/blogs/eravi/archive/2009/08/07/configuring-search-server-express-on-sbs-2008.aspx" target="_blank">this method</a>. At one point I tried to trick WSS3 into temporarily thinking it was not a basic mode install so get Search Server Express to prompt for Advanced mode, but it made things worse because the configuration database got confused. </em></p>
<p><strong>Cleverworkarounds stress rating: Installing SharePoint in basic mode is committing a crime against humanity.</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<h2>Attempt 2</h2>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/11/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/11/image_thumb4.png" width="193" height="244" /></a> </p>
<p>At this point I hear Doctor Smith abusing me like the poor old robot. “You bubble-headed booby, you ludicrous lump, adlepated amateur, dottering dunderhead”.</p>
<p>Since WSUS got completely screwed, as well as the Windows Internal Database through relentless uninstallation and repair attempts, I started to get nervous. Small Business Server 2008 is a very fussy beast. Essentially it can get very upset at seemingly benign changes. I felt that I had messed about so much that I could no longer guarantee the integrity of this server so I wiped clean and reinstalled.</p>
<p>I installed Windows as per the previous method, and once again the install wizard stopped, asking me for a network driver. Once again I popped in the HP SmartStart CD and proceeded to run the driver install program from the SBS configuration wizard.</p>
<p>This time, no network card was detected! </p>
<p>What the? During attempt 1, I happily installed the necessary HP drivers using the same %$^#% SmartStart CD! Why is it not detecting now??</p>
<p><strong>Cleverworkarounds stress rating: Now thinking about how much fun everyone is having in Vegas while I am fighting this server</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<p>After some teeth gnashing, the cause of this problem hit me as I was driving home from the site. I had upgraded the firmware of the network card during attempt 1, as well as the storage controller and system BIOS. I realised that the stupid, brain-dead HP network card drivers likely could <strong>no longer recognise its own network card with a newer firmware</strong>.</p>
<p>The next day I came back refreshed, and found that indeed, there were newer network drivers at the HP site. I downloaded them and extracted them and sure enough, suddenly the network card was found and I was back in business. How dumb is that! Surely if you are going to write a driver, at the very least make it recognise the hardware irrespective of firmware!&#160;&#160; </p>
<p>Once I got past this stupid annoyance, it did not take too long for SBS2008 to be installed and ready to go. Remember that WSS3 is installed for you in basic mode, so to change it requires an uninstall of WSS and then to reinstall it in a different mode. But the problem here is SBS2008 and its fussiness about messing with configuration. In going down this path, you risk future service packs and updates breaking because things are not as expected. Additionally you would have to create companyweb manually and it raises the risk of a misconfiguration or mistake along the way. </p>
<p>I logged a call with Microsoft and got a pretty good engineer (hey Ai Wa) and she was able to consistently reproduce all of my issues in the lab, but was unable to work out a supportable fix. In the meantime, I tried to force Search Server 2008 to install into advanced mode using a scripted install, using an article written by my old mate <a href="http://technet.microsoft.com/en-us/library/cc994302.aspx" target="_blank">Ben Curry</a>. Alas, I could not bend it to my will and at the time of writing this article, I had to give up on Search Server 2008 with SBS2008 for now.</p>
<p><em>For what its worth, I know that I can make this work by installing WSS3 differently, but I planned to properly nail this issue in my lab using the out of the box installs and then publish this article, but I didn’t have the sufficient hardware to run Small Business Server 2008. It requires a lot of grunt to run! So I will revisit this issue once my new VM server arrives and post an update.</em></p>
<h2>But there is more…</h2>
<p>If the whole Smartstart, network driver, SBS2008 with its dodgy scripted WSS3 install, with Search Server Express dumb installation assumptions were not enough, I hit more dumb things that resulted in showing how ill equipped HP’s support is able to deal with these sorts of issues.</p>
<p>The server, not surprisingly, supplied with a nice hardware RAID configuration and my client opted to buy some additional disk. When the disks arrived and were installed, we found that the RAID controller could see the disks, but we were unable to add the disks to the existing array using HP’s management tools. HP’s “friendly” support was unable to work out the issue and asked me to do things that were never going to work and insulted my intelligence. Eventually I worked out what was going on myself, via HP’s own forums. It turns out that the HP Server requires a write cache module to be able to grow an array. We had one of these installed. Upon further examination by opening up the chassis, we were missing a battery to go with the write cache module. HP were unable to determine the part number that we needed and we ended up working it out ourselves and telling our supplier.</p>
<p>Then HP stuffed up the order and after following up for two weeks, it turned out they accidentally forgot to put the order through to Singapore to get the part. It seemed that once we went outside of the normal supply chain system at HP, it all broke down. After two weeks and numerous calls, they suddenly realised that the part was available in Sydney all along and it was shipped over next day!. The irony was that next day the part from Singapore arrived! </p>
<p>So now we had two batteries.</p>
<p>Grrrr. It shouldn’t be this hard! Why supply a write cache module and not supply the battery! Dumb Dumb Dumb! </p>
<p><strong>Cleverworkarounds stress rating: Really hating HP and Microsoft at this point.</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<h2>… and piece de resistance!</h2>
<p>Okay so we had a few frustrating struggles, but we more or less got there. But here is the absolute showstopper – the final issue that for me, really made me question this IT discipline that I have worked in for twenty years now.</p>
<p>My client rang me on Monday morning to tell me the server was powered off when we arrived on site. This was unusual because the rack was UPS protected and no other devices were off. We ran HP’s diagnostic tools and no faults were reported. The UPS was a fairly recent APC model, and we installed a serial cable to the server and loaded the APC UPS Management software. The software (which looks scarily like what 16 bit apps used to look like in the early 90’s), found the UPS and showed that was all hunky dory.</p>
<p>We decided to perform a battery test using the software. No sooner than I clicked OK, the server powered off with no warning or shutdown. Whoa!!</p>
<p>I put in a call to APC, and was told that the UPS was <strong>not compatible</strong> with HP’s new fancy shmansy green star rating power supplies. We had to buy a new UPS because of some “sine wave” mumbo jumbo (UPS engineer talk that I really wasn’t interested in). If the UPS switched to battery, this server would think power was dodgy and do a pre-emptive shutdown. The reason that the server was powered off on the Monday morning was that the UPS has a built in self test that runs every 7 days that <strong>cannot be disabled</strong>!</p>
<p><strong>Cleverworkarounds stress rating: For %%$$ sake!.</strong></p>
<p><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /><img border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2008/06/image-thumb3.png" width="45" height="45" /></p>
<h2>Conclusion</h2>
<p>Now I don’t know about you, but once a UPS cannot be “compatible” with a server, that’s it &#8211; things have gone too far. For crying out loud, a UPS supplies power. How $%#^ hard can that be? How is an organization supposed to get value out of their IT investments with this sort of crap to deal with.</p>
<p>Then add in the added complexity of Blade servers, Citrix, Virtualisation, shared storage, and I truly feel that some sites are sitting on time bombs. The supposed benefits in terms of efficiency, resiliency and scalability that these technologies bring, come at an often intangible and insidious cost – sheer risk from incredible complexity. If you look at this case study of a small organisation putting in a basic server, most of the issues I have encountered are the side effects of this complexity and the lack of ability for the vendors to be able to help with it. </p>
<p>As the global financial crisis has aptly demonstrated, when things are complex and no-one person can understand everything, when something bad does happen, it tends to do it in a spectacularly painful and costly way.</p>
<p>Finally, before you reply to this likely immature rant and tell me I am a whiner, remember this all you Vegas people. You got to have fun and marvel at all the new (complex) SP2010 toys, while I sat on the other side of the planet in a small computer room, all bitter and twisted, sprouting obscenities to HP, Microsoft and APC dealing with this crap. When you put that into perspective, I think this article is quite balanced! <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2009/11/29/sbs-2008-hewlett-packard-wss3-search-server-2008-express-and-a-ups-oh-the-pain/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Missing metadata with Office 2003 &#8211; yet another &#8220;duh&#8221; moment&#8230;</title>
		<link>http://www.cleverworkarounds.com/2009/09/05/missing-metadata-with-office-2003-yet-another-duh-moment/</link>
		<comments>http://www.cleverworkarounds.com/2009/09/05/missing-metadata-with-office-2003-yet-another-duh-moment/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 03:15:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2009/09/05/missing-metadata-with-office-2003-yet-another-duh-moment/</guid>
		<description><![CDATA[I had a problem this week that got resolved with something quite obvious, but I learned a lot in the process, so I am detailing it here. Symptoms: Using MOSS 2007 SP2 and Office 2003 SP3, users complained that metadata on documents went missing. Consider the scenario below where we have a sample document library. [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript"><!--
google_ad_client = "pub-6551570212921028";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_ui_features = "rc:6";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p>I had a problem this week that got resolved with something quite obvious, but I learned a lot in the process, so I am detailing it here.</p>
<p>Symptoms: Using MOSS 2007 SP2 and Office 2003 SP3, users complained that metadata on documents went missing. Consider the scenario below where we have a sample document library.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image_thumb1.png" width="797" height="128" /></a> </p>
<p>Our user opens the “Memo to Council re Convenor” document into Word 2003, makes a change and saves it. Note the difference. Where’s my metadata?</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image_thumb2.png" width="797" height="128" /></a> </p>
<p>I asked about this on the <a href="http://www.codify.com/lists/OzMOSS" target="_blank">ozmoss</a> mailing list, and others noted the same issue. Some had applied the June 2009 cumulative update for WSS3 and the problem was solved for them. I applied this update, and it improved the situation, but did not cure the problem totally.</p>
<p>Upon further investigation, we were able to ascertain that the problem would only happen on certain PCs. The same user could update the same document on a different PC and it would work fine. A fiddler trace of the process allowed me to narrow down the issue and understand the sequence of events. The root cause of the issue was incorrect handling of HTML/JavaScript by Office 2003 and/or Internet Explorer. This manifests itself in an inconsistency in the display of properties in the Office “Web File Properties” dialog box (file-&gt;properties in an office 2003 app). Consider the example below.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/clip_image0021.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/clip_image002_thumb1.jpg" width="419" height="368" /></a>&#160; <a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/clip_image00251.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[5]" border="0" alt="clip_image002[5]" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/clip_image0025_thumb1.jpg" width="459" height="368" /></a></p>
<p>Note that the first dialog shows that values for the metadata columns are blank or default. Now consider the same document opened on a different PC. Well what do you know – we have metadata!</p>
<p>Fiddler confirmed that when <strong>saving</strong> a document to SharePoint from an Office 2003 application, the <strong>same </strong>HTTP request is made to SharePoint as is done when displaying the document properties in the above example. </p>
<p>In both cases, A HTTP GET request is made to the owssvr.dll&#160; (WSS RPC)&#160; and the <a href="http://msdn.microsoft.com/en-us/library/ms414166.aspx" target="_blank">dialogview</a> method is called. Therefore, the root of my problem has something to do with the fact that the data returned by this call was not being parsed properly by MSWord on one PC (as illustrated by the first of the above dialog box screenshots). When a user than saved their edits, blank or default values are being written back to SharePoint, in effect “losing” the metadata.</p>
<p>So let’s take a look at the HTTP call and the data returned. The call to owssvr.dll&#160; looks like this.</p>
<p><strong>GET /somesite/_vti_bin/owssvr.dll?location=My%20Committee/Agenda%20attachment%20July%2009.doc&amp;dialogview=SaveForm HTTP/1.1</strong></p>
<p>The output returned by SharePoint is a bunch of HTML and JavaScript that MSWord then renders by calling the Internet Explorers rendering framework programmatically. (I’ve included sample output at the end of the post for the hardcore nerds).</p>
<p>So the question now becomes, what was preventing the correct HTML rendering on one PC and not the other? This was a difficult question to answer because I was unable to find a way to debug JavaScript when the output was rendered in Office 2003 apps.</p>
<p>When you think about it, there can be many potential causes here. Given that Internet Explorer is effectively doing the work (WinINet), this whole process could be adversely affected by add-ins, zone settings, AD policies, virus scanning, etc. On one affected PC I disabled all all-ins to Internet Explorer and retried without success. After around half an hour of frustration, I decided to reset IE’s configuration as shown below.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image3.png"><img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/09/image_thumb3.png" width="292" height="372" /></a> </p>
<p>After accepting the various warnings, I retried the test and it all worked! Metadata was now being properly saved. “Awesome”, I thought. I’m not quite sure what the true root cause is, but at least I know how to cure it.</p>
<p>Then it suddenly dawned on me that I’d been stupid. For all of my low level examination of the office 2003/RPC interaction with SharePoint, picking the brain of gurus like MCM <a href="http://harbar.net/" target="_blank">Spence Harbar</a>, I’d never thought to clear the temporary internet files cache. Doh!</p>
<p>On the next affected PC I did so, and the problem also went away instantly.</p>
<p>*Blush*</p>
<p>In my defence of my dumbness however, I had never examined the behind the scenes integration with Office 2003 and SharePoint, and it did not even twig that Internet Explorer would be involved in the picture. Given that this problem manifests itself within Office 2003 applications, it is not immediately obvious that your temporary internet files would cause an issue here – but now I know better <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<h2>And now I get it…</h2>
<p>Now Office 2007 is not affected by this because it does not use this method at all. In 2007, the document information panel uses InfoPath to render metadata. At the time I naively thought that was a dumb idea because the document information panel cannot display custom column types. For example, let’s say you created a custom column type to hold a phone number with the correct formatting for country code and the like. In a SharePoint site you can display it fine, but in the Office 2007 document information panel, you will never see it. InfoPath only will work with the out of the box in column types.</p>
<p>My rationale was that if Office 2007 instead used JavaScript and HTML, then it should be able to display these sorts of custom columns. That may actually be true, but it is irrelevant. When you think of the sheer number of ways that the rendering of the code could be interfered with (Temporary Internet Files being one precedent), you can see why the Office team might have opted for the safety of InfoPath instead. </p>
<p>Now that I understand that this is how Office 2003 does it, I can plainly see that it leaves too much room for error.</p>
<p>So even though my problem was solved by a simple clearing of the cache, it still remains that things like a bad add-in or a bad AD policy setting could interfere with the Office 2003/SharePoint integration. So if you ever have this issue crop up, try the temporary internet files thing or reset IE’s configuration completely. It may save you a lot of time and pain troubleshooting.</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">&lt;</span><span class="html">html</span> <span class="attr">dir</span><span class="kwrd">=&quot;ltr&quot;</span><span class="kwrd">&gt;</span></pre>
<pre><span class="kwrd">&lt;</span><span class="html">HEAD</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">META</span> <span class="attr">Name</span><span class="kwrd">=&quot;GENERATOR&quot;</span> <span class="attr">Content</span><span class="kwrd">=&quot;Microsoft SharePoint&quot;</span><span class="kwrd">&gt;</span></pre>
<pre>    <span class="kwrd">&lt;</span><span class="html">META</span> <span class="attr">HTTP-EQUIV</span><span class="kwrd">=&quot;Content-Type&quot;</span> <span class="attr">CONTENT</span><span class="kwrd">=&quot;text/html; charset=utf-8&quot;</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">META</span> <span class="attr">HTTP-EQUIV</span><span class="kwrd">=&quot;Expires&quot;</span> <span class="attr">content</span><span class="kwrd">=&quot;0&quot;</span><span class="kwrd">&gt;</span></pre>
<pre>    <span class="rem">&lt;!-- _locID=&quot;id_PageTitle&quot; _locComment=&quot;{StringCategory=TTL}&quot; --&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">Title</span> <span class="attr">ID</span>=<span class="attr">onetidTitle</span><span class="kwrd">&gt;</span>File Properties<span class="kwrd">&lt;/</span><span class="html">Title</span><span class="kwrd">&gt;</span></pre>
<pre><span class="kwrd">&lt;</span><span class="html">Link</span> <span class="attr">REL</span><span class="kwrd">=&quot;stylesheet&quot;</span> <span class="attr">Type</span><span class="kwrd">=&quot;text/css&quot;</span> <span class="attr">HREF</span><span class="kwrd">=&quot;/_layouts/1033/styles/core.css&quot;</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">META</span> <span class="attr">Name</span><span class="kwrd">=&quot;Microsoft Theme&quot;</span> <span class="attr">Content</span><span class="kwrd">=&quot;default&quot;</span><span class="kwrd">&gt;</span></pre>
<pre>    <span class="kwrd">&lt;</span><span class="html">META</span> <span class="attr">Name</span><span class="kwrd">=&quot;Microsoft Border&quot;</span> <span class="attr">Content</span><span class="kwrd">=&quot;none&quot;</span><span class="kwrd">&gt;</span></pre>
<pre class="alt"><span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">src</span><span class="kwrd">=&quot;/_layouts/1033/init.js&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;script src=<span class="str">&quot;/_layouts/1033/core.js&quot;</span>&gt;&lt;/script&gt;</pre>
<pre class="alt">&#160;</pre>
<pre>&lt;script src=<span class="str">&quot;/_layouts/1033/bform.js&quot;</span>&gt;&lt;/script&gt;</pre>
<pre class="alt">&#160;</pre>
<pre>&lt;/HEAD&gt;</pre>
<pre class="alt">&lt;Script ID=<span class="str">&quot;Form_Validate&quot;</span>&gt;</pre>
<pre><span class="kwrd">function</span> Form_Validate(fVisible)</pre>
<pre class="alt">{</pre>
<pre>    <span class="kwrd">if</span> (frm.FValidate(fVisible))</pre>
<pre class="alt">        document.OWSForm.IsFormValid.value=<span class="str">&quot;true&quot;</span>;</pre>
<pre>    <span class="kwrd">else</span></pre>
<pre class="alt">        document.OWSForm.IsFormValid.value=<span class="str">&quot;false&quot;</span>;</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Script</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;Script ID=<span class="str">&quot;Update_UI_From_Values&quot;</span>&gt;</pre>
<pre class="alt"><span class="kwrd">var</span> bFormFieldsInited = <span class="kwrd">false</span>;</pre>
<pre><span class="kwrd">function</span> Update_UI_From_Values()</pre>
<pre class="alt">{</pre>
<pre>    frm.SetFirstFocus(bFormFieldsInited);</pre>
<pre class="alt">    bFormFieldsInited = <span class="kwrd">true</span>;</pre>
<pre>    frm.DataBind();</pre>
<pre class="alt">    DefaultControls();</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Script</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;Script ID=<span class="str">&quot;Update_Values_From_UI&quot;</span>&gt;</pre>
<pre class="alt"><span class="kwrd">function</span> Update_Values_From_UI()</pre>
<pre>{</pre>
<pre class="alt">    frm.SetFirstFocus(bFormFieldsInited);</pre>
<pre>    bFormFieldsInited = <span class="kwrd">true</span>;</pre>
<pre class="alt">    frm.FValidate(<span class="kwrd">false</span>);</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Script</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;script language=<span class="str">&quot;JavaScript&quot;</span>&gt;</pre>
<pre class="alt">L_tooltipfile_Text = <span class="str">&quot;&quot;</span>;</pre>
<pre>L_tooltipfolder_Text = <span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">selectedElement = <span class="kwrd">null</span></pre>
<pre>inChangeSelection = <span class="kwrd">false</span></pre>
<pre class="alt">slElem = <span class="kwrd">null</span>;</pre>
<pre>oldSelection = <span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">bIsFileDialogView = <span class="kwrd">true</span>;</pre>
<pre><span class="kwrd">function</span> selectrow()</pre>
<pre class="alt">{</pre>
<pre>    <span class="kwrd">if</span> (slElem) {</pre>
<pre class="alt">        slElem.className=oldSelection;</pre>
<pre>        slElem.title=<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">        }</pre>
<pre>    selectedElement = window.<span class="kwrd">event</span>.srcElement;</pre>
<pre class="alt">    <span class="kwrd">while</span> (selectedElement.tagName!=<span class="str">&quot;TR&quot;</span>) {</pre>
<pre>           selectedElement=selectedElement.parentElement;</pre>
<pre class="alt">           }</pre>
<pre>    slElem = selectedElement;</pre>
<pre class="alt">    oldSelection=slElem.className;        </pre>
<pre>    slElem.className=<span class="str">&quot;ms-selected&quot;</span>;</pre>
<pre class="alt">    <span class="kwrd">if</span> (slElem.getAttribute(<span class="str">&quot;fileattribute&quot;</span>) == <span class="str">&quot;file&quot;</span>)</pre>
<pre>        slElem.title=L_tooltipfile_Text;</pre>
<pre class="alt">    <span class="kwrd">else</span></pre>
<pre>        slElem.title=L_tooltipfolder_Text;</pre>
<pre class="alt">    document.selection.empty();</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd">function</span> checkScroll()</pre>
<pre>{</pre>
<pre class="alt">    <span class="kwrd">if</span> (document.body.scrollHeight &gt; document.body.offsetHeight ||</pre>
<pre>        document.body.scrollWidth &gt; document.body.offsetWidth)</pre>
<pre class="alt">       document.body.scroll=<span class="str">&quot;yes&quot;</span>;</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;BODY marginwidth=0 marginheight=0 onload=<span class="str">&quot;checkScroll()&quot;</span> onresize=<span class="str">&quot;checkScroll()&quot;</span> scroll=no&gt;</pre>
<pre class="alt">&lt;!-- Banner --&gt;</pre>
<pre>&lt;TABLE  CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=<span class="str">&quot;100%&quot;</span> &gt;</pre>
<pre class="alt">  &lt;TR&gt;</pre>
<pre>   &lt;TD COLSPAN=3 STYLE=<span class="str">&quot;width:100%&quot;</span>&gt;</pre>
<pre class="alt">    &lt;TABLE <span class="kwrd">class</span>=ms-bannerframe CELLPADDING=0 CELLSPACING=0 BORDER=0 STYLE=<span class="str">&quot;width:100%&quot;</span>&gt;</pre>
<pre>     &lt;TR&gt;</pre>
<pre class="alt">      &lt;TD VALIGN=BOTTOM WITDH=25&gt;</pre>
<pre>      &lt;font size=1&gt;&amp;nbsp;&lt;/font&gt;</pre>
<pre class="alt">      &lt;/TD&gt;</pre>
<pre>     &lt;/TR&gt;</pre>
<pre class="alt">    &lt;/TABLE&gt;</pre>
<pre>   &lt;/TD&gt;</pre>
<pre class="alt">  &lt;/TR&gt;</pre>
<pre>&lt;/table&gt;</pre>
<pre class="alt">&lt;table width=100% cellpadding=4 cellspacing=0&gt;</pre>
<pre> &lt;tr&gt;</pre>
<pre class="alt">  &lt;td&gt;</pre>
<pre>   &lt;TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=<span class="str">&quot;100%&quot;</span> &gt;</pre>
<pre class="alt">    &lt;tr&gt;</pre>
<pre>     &lt;td&gt;</pre>
<pre class="alt">      &lt;table cellpadding=0 cellspacing=0 style=<span class="str">&quot;margin-left: 3px;margin-bottom:2px&quot;</span>&gt;</pre>
<pre>       &lt;tr&gt;</pre>
<pre class="alt">        &lt;td nowrap <span class="kwrd">class</span>=<span class="str">&quot;ms-titlearea&quot;</span>&gt;Some User&lt;/td&gt;</pre>
<pre>       &lt;/tr&gt;</pre>
<pre class="alt">       &lt;tr&gt;</pre>
<pre>        &lt;td ID=onetidPageTitle nowrap <span class="kwrd">class</span>=<span class="str">&quot;ms-pagetitle&quot;</span>&gt;My Committee&lt;/td&gt;</pre>
<pre class="alt">       &lt;/tr&gt;</pre>
<pre>      &lt;/table&gt;</pre>
<pre class="alt">     &lt;/td&gt;</pre>
<pre>    &lt;/tr&gt;</pre>
<pre class="alt">    &lt;tr&gt;</pre>
<pre>     &lt;td&gt;</pre>
<pre class="alt">      &lt;table border=0 width=100% cellpadding=0 cellspacing=0 style=<span class="str">&quot;margin-left: 3px;margin-bottom: 3px&quot;</span>&gt;</pre>
<pre>       &lt;tr&gt;</pre>
<pre class="alt">        &lt;td <span class="kwrd">class</span>=<span class="str">&quot;ms-sectionline&quot;</span> height=1&gt;&lt;img src=<span class="str">&quot;/_layouts/images/blank.gif&quot;</span>&gt;&lt;/td&gt;</pre>
<pre>       &lt;/tr&gt;</pre>
<pre class="alt">      &lt;/table&gt;</pre>
<pre>     &lt;/td&gt;</pre>
<pre class="alt">    &lt;/tr&gt;</pre>
<pre>        &lt;!-- Item Form --&gt;</pre>
<pre class="alt">        </pre>
<pre>&lt;SCRIPT&gt;</pre>
<pre class="alt"><span class="kwrd">var</span> frm = <span class="kwrd">new</span> OWSForm(<span class="str">&quot;OWSForm&quot;</span>, <span class="kwrd">false</span>, <span class="str">&quot;http:\u002f\u002fintranetdev\u002fsomesite\u002f_layouts\u002f&quot;</span>);</pre>
<pre><span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">&#160;</pre>
<pre>&lt;SCRIPT&gt; frm.dopt.chDateSep = <span class="str">&quot;\u002f&quot;</span>; frm.dopt.chTimeSep = <span class="str">&quot;:&quot;</span>; frm.dopt.SetTimeFormat(0); frm.dopt.SetDateOrder(1); frm.dopt.SetDOW(0); frm.dopt.stAM = <span class="str">&quot;AM&quot;</span>; frm.dopt.stPM = <span class="str">&quot;PM&quot;</span>; frm.dopt.TimeMarkPosn = 0; frm.dopt.webTZOffsetMin = -480;  frm.nopt.chDigSep = <span class="str">&quot;,&quot;</span>; frm.nopt.chDecimal = <span class="str">&quot;.&quot;</span>; frm.nopt.chMinus = <span class="str">&quot;-&quot;</span>; frm.nopt.iNegNumber = 1; frm.nopt.SetGrouping(<span class="str">&quot;3;0&quot;</span>); </pre>
<pre class="alt">frm.stFieldPrefix = <span class="str">&quot;urn:schemas-microsoft-com:office:office#&quot;</span>;</pre>
<pre>frm.stImagesPath = <span class="str">&quot;\u002f_layouts\u002fimages\u002f&quot;</span>;</pre>
<pre class="alt">frm.wBaseType = 1;</pre>
<pre><span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">Form</span> <span class="attr">Name</span><span class="kwrd">=&quot;OWSForm&quot;</span> <span class="attr">id</span>=<span class="attr">OWSForm</span> <span class="attr">EncType</span><span class="kwrd">=&quot;multipart/form-data&quot;</span> <span class="attr">Action</span><span class="kwrd">=&quot;http://intranetdev/somesite/_vti_bin/owssvr.dll?CS=65001&quot;</span> <span class="attr">Method</span>=<span class="attr">POST</span> <span class="attr">onSubmit</span><span class="kwrd">=&quot;return false;&quot;</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">&lt;INPUT Type=Hidden Name=<span class="str">&quot;_charset_&quot;</span> Value=<span class="str">&quot;utf-8&quot;</span>&gt;</pre>
<pre>&lt;INPUT ID=onetidCmd Type=Hidden Name=<span class="str">&quot;Cmd&quot;</span> Value=<span class="str">&quot;Save&quot;</span>&gt;</pre>
<pre class="alt">&lt;INPUT ID=onetidIsFormValid type=hidden name=<span class="str">&quot;IsFormValid&quot;</span>&gt;</pre>
<pre>&lt;INPUT ID=onetidFormWasPosted type=hidden name=<span class="str">&quot;FormWasPosted&quot;</span>&gt;</pre>
<pre class="alt">&lt;INPUT ID=<span class="str">&quot;MustUpdateForm&quot;</span> type=hidden name=<span class="str">&quot;MustUpdateForm&quot;</span> value=<span class="str">&quot;true&quot;</span>&gt;</pre>
<pre>&lt;INPUT type=hidden name=<span class="str">&quot;NextID&quot;</span> id=<span class="str">&quot;NextID&quot;</span> value=<span class="str">&quot;-1&quot;</span>&gt;</pre>
<pre class="alt">&lt;INPUT type=hidden name=<span class="str">&quot;NextUsing&quot;</span> id=<span class="str">&quot;NextUsing&quot;</span> value=<span class="str">&quot;&quot;</span>&gt;</pre>
<pre>&lt;SPAN id=<span class="str">'part1'</span>&gt;&lt;INPUT ID=onetidIOHidden TYPE=HIDDEN NAME=<span class="str">&quot;List&quot;</span> VALUE=<span class="str">&quot;{EF494645-1D24-4761-A874-0CB866FA494C}&quot;</span>&gt;</pre>
<pre class="alt">&lt;INPUT ID=onetidIOHidden TYPE=HIDDEN NAME=<span class="str">&quot;ID&quot;</span> VALUE=<span class="str">&quot;New&quot;</span>&gt;</pre>
<pre>&lt;TABLE border=0 cellpadding=2&gt;</pre>
<pre class="alt">&lt;SCRIPT&gt;<span class="kwrd">var</span> _g_tp_fNewForm = <span class="kwrd">true</span>;<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;TR style=<span class="str">&quot;display:none&quot;</span>&gt;&lt;TH nowrap valign=top <span class="kwrd">class</span>=<span class="str">&quot;ms-formlabel&quot;</span>&gt;&lt;nobr&gt;Comment&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> NoteField(frm,<span class="str">&quot;Comment1&quot;</span>,<span class="str">&quot;Comment&quot;</span>,<span class="str">&quot;&quot;</span>);fld.stNumLines = <span class="str">&quot;20&quot;</span>;fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span>&amp;nbsp;&lt;br&gt;&lt;SPAN <span class="kwrd">class</span>=<span class="str">&quot;ms-formdescription&quot;</span>&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR style=<span class="str">&quot;display:none&quot;</span>&gt;&lt;TH nowrap valign=top <span class="kwrd">class</span>=<span class="str">&quot;ms-formlabel&quot;</span>&gt;&lt;nobr&gt;Document&amp;nbsp;Status&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> ChoiceField(frm,<span class="str">&quot;Corro_x0020_Status&quot;</span>,<span class="str">&quot;Document Status&quot;</span>,<span class="str">&quot;Not Started&quot;</span>); fld.format = <span class="str">&quot;Dropdown&quot;</span>; fld.AddChoice(<span class="str">&quot;Not Started&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;No Action Required&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;In Progress&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Completed&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Deferred&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Waiting on someone else&quot;</span>, <span class="str">&quot;&quot;</span>);fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">SPAN</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formdescription&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">SPAN</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;&lt;</span><span class="html">TR</span> <span class="attr">style</span><span class="kwrd">=&quot;display:none&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">TH</span> <span class="attr">nowrap</span> <span class="attr">valign</span>=<span class="attr">top</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formlabel&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">nobr</span><span class="kwrd">&gt;</span>Content&amp;nbsp;Type&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> ChoiceField(frm,<span class="str">&quot;ContentType&quot;</span>,<span class="str">&quot;Content Type&quot;</span>,<span class="str">&quot;LSWA Document&quot;</span>); fld.format = <span class="str">&quot;Dropdown&quot;</span>; fld.AddChoice(<span class="str">&quot;LSWA Document&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Folder&quot;</span>, <span class="str">&quot;&quot;</span>);fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">SPAN</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formdescription&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">SPAN</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;&lt;</span><span class="html">TR</span> <span class="attr">style</span><span class="kwrd">=&quot;display:none&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">TH</span> <span class="attr">nowrap</span> <span class="attr">valign</span>=<span class="attr">top</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formlabel&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">nobr</span><span class="kwrd">&gt;</span>Committee&amp;nbsp;Document&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> ChoiceField(frm,<span class="str">&quot;Committee_x0020_Document&quot;</span>,<span class="str">&quot;Committee Document&quot;</span>,<span class="str">&quot;&quot;</span>); fld.format = <span class="str">&quot;Dropdown&quot;</span>; fld.AddChoice(<span class="str">&quot;Agendas&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Minutes&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Actions&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Administration&quot;</span>, <span class="str">&quot;&quot;</span>);fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">SPAN</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formdescription&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">SPAN</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;&lt;</span><span class="html">TR</span> <span class="attr">style</span><span class="kwrd">=&quot;display:none&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">TH</span> <span class="attr">nowrap</span> <span class="attr">valign</span>=<span class="attr">top</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formlabel&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">nobr</span><span class="kwrd">&gt;</span>Document&amp;nbsp;Type&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> ChoiceField(frm,<span class="str">&quot;Document_x0020_Types&quot;</span>,<span class="str">&quot;Document Type&quot;</span>,<span class="str">&quot;&quot;</span>); fld.format = <span class="str">&quot;Dropdown&quot;</span>; fld.AddChoice(<span class="str">&quot;Incoming Correspondence&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Outgoing Correspondence&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Internal Document&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Fax&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;E-mail&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;Memo&quot;</span>, <span class="str">&quot;&quot;</span>);fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">SPAN</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formdescription&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">SPAN</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;&lt;</span><span class="html">TR</span> <span class="attr">style</span><span class="kwrd">=&quot;display:none&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">TH</span> <span class="attr">nowrap</span> <span class="attr">valign</span>=<span class="attr">top</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formlabel&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">nobr</span><span class="kwrd">&gt;</span>Year&lt;font color=red&gt;&lt;/font&gt;&lt;/nobr&gt;&lt;/TH&gt;&lt;TD <span class="kwrd">class</span>=<span class="str">&quot;ms-formbody&quot;</span>&gt;&lt;SCRIPT&gt;fld = <span class="kwrd">new</span> ChoiceField(frm,<span class="str">&quot;Year&quot;</span>,<span class="str">&quot;Year&quot;</span>,<span class="str">&quot;&quot;</span>); fld.format = <span class="str">&quot;Dropdown&quot;</span>; fld.AddChoice(<span class="str">&quot;2000&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2001&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2002&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2003&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2004&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2005&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2006&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2007&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2008&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2009&quot;</span>, <span class="str">&quot;&quot;</span>);fld.AddChoice(<span class="str">&quot;2010&quot;</span>, <span class="str">&quot;&quot;</span>);fld.IMEMode=<span class="str">&quot;&quot;</span>;fld.BuildUI();<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;&lt;</span><span class="html">SPAN</span> <span class="attr">class</span><span class="kwrd">=&quot;ms-formdescription&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">SPAN</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;&lt;/</span><span class="html">TABLE</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;</pre>
<pre>_g_tp_rgctNames = <span class="kwrd">new</span> Array;</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;&lt;</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span><span class="kwrd">var</span> _tp_rgctfld = <span class="kwrd">null</span>;<span class="kwrd">var</span> _tp_ctfld = <span class="kwrd">null</span>;<span class="kwrd">var</span> _g_tp_rgcts = <span class="kwrd">new</span> Array;<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre>&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;</pre>
<pre class="alt">_g_tp_rgctNames.push(<span class="str">&quot;LSWA Document&quot;</span>);</pre>
<pre><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">&#160;</pre>
<pre>            &lt;SCRIPT&gt;</pre>
<pre class="alt">            _tp_rgctfld = <span class="kwrd">new</span> Array;</pre>
<pre>            </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;ContentType&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;SelectFilename&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;FileLeafRef&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;TRUE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Created&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;TRUE&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Title&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;FALSE&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;TRUE&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Modified&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;TRUE&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Modified_x0020_By&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Created_x0020_By&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Comment1&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Corro_x0020_Status&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Committee_x0020_Document&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Document_x0020_Types&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;Year&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">                _tp_ctfld = <span class="kwrd">new</span> Object(<span class="kwrd">null</span>);</pre>
<pre>                _tp_ctfld.stName=<span class="str">&quot;MoveDocu&quot;</span>;</pre>
<pre class="alt">                _tp_ctfld.fRequired = BoolFromString(<span class="str">&quot;FALSE&quot;</span>);</pre>
<pre>                _tp_ctfld.fHidden = BoolFromString(<span class="str">&quot;&quot;</span>);</pre>
<pre class="alt">                _tp_ctfld.fShowInNewForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre>                _tp_ctfld.fShowInEditForm = BoolFromString2(<span class="str">&quot;&quot;</span>, <span class="kwrd">true</span>);</pre>
<pre class="alt">                _tp_ctfld.fReadOnly = BoolFromString(<span class="str">&quot;TRUE&quot;</span>);</pre>
<pre>                _tp_ctfld.stDisplay =<span class="str">&quot;Move Document&quot;</span>;</pre>
<pre class="alt">                    _tp_rgctfld.push(_tp_ctfld);</pre>
<pre>                </pre>
<pre class="alt">            _g_tp_rgcts.push(_tp_rgctfld);</pre>
<pre>            <span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">            </pre>
<pre>&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;</pre>
<pre class="alt">_g_tp_rgctNames.push(<span class="str">&quot;Folder&quot;</span>);</pre>
<pre><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">&#160;</pre>
<pre>            &lt;SCRIPT&gt;</pre>
<pre class="alt">            _tp_rgctfld = <span class="kwrd">new</span> Array;</pre>
<pre>            _g_tp_rgcts.push(_tp_rgctfld);</pre>
<pre class="alt">            <span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre>            </pre>
<pre class="alt">&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;</pre>
<pre><span class="kwrd">function</span> _FixMpCt2Flds()</pre>
<pre class="alt">{</pre>
<pre>    <span class="kwrd">var</span> frm = frmCurrent;</pre>
<pre class="alt">    <span class="kwrd">var</span> rgn1 = frm.rgctNames;</pre>
<pre>    <span class="kwrd">var</span> rgn2 = _g_tp_rgctNames;</pre>
<pre class="alt">    <span class="kwrd">var</span> rgctflds = _g_tp_rgcts;</pre>
<pre>    <span class="kwrd">if</span> (rgctflds.length &lt; rgn1.length)</pre>
<pre class="alt">    {</pre>
<pre>        <span class="kwrd">var</span> rgnew = <span class="kwrd">new</span> Array;</pre>
<pre class="alt">        <span class="kwrd">var</span> i;</pre>
<pre>        <span class="kwrd">var</span> j = 0;</pre>
<pre class="alt">        <span class="kwrd">for</span> (i = 0; i &lt; rgn1.length; i++)</pre>
<pre>        {</pre>
<pre class="alt">            <span class="kwrd">var</span> n1 = rgn1[i];</pre>
<pre>            <span class="kwrd">var</span> n2 = rgn2[j];</pre>
<pre class="alt">            <span class="kwrd">if</span> (n1 != n2)</pre>
<pre>            {</pre>
<pre class="alt">                rgnew.push(<span class="kwrd">new</span> Array);</pre>
<pre>            }</pre>
<pre class="alt">            <span class="kwrd">else</span></pre>
<pre>            {</pre>
<pre class="alt">                rgnew.push(rgctflds[j]);</pre>
<pre>                j++;</pre>
<pre class="alt">            }</pre>
<pre>        }</pre>
<pre class="alt">        _g_tp_rgcts = rgnew;</pre>
<pre>    }</pre>
<pre class="alt">}</pre>
<pre>_FixMpCt2Flds();</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<pre>&#160;</pre>
<pre class="alt">&lt;/SPAN&gt;&lt;/form&gt;</pre>
<pre>&lt;SCRIPT&gt;</pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span></pre>
<pre>&#160;</pre>
<pre class="alt">        <span class="rem">&lt;!-- FooterBanner closes the TD, TR, TABLE, BODY, And HTML regions opened above --&gt;</span></pre>
<pre><span class="attr">&amp;nbsp;</span></pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;&lt;/</span><span class="html">table</span><span class="kwrd">&gt;&lt;/</span><span class="html">PlaceHolder</span><span class="kwrd">&gt;&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;&lt;/</span><span class="html">TR</span><span class="kwrd">&gt;</span></pre>
<pre><span class="kwrd">&lt;/</span><span class="html">TABLE</span><span class="kwrd">&gt;</span></pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">BODY</span><span class="kwrd">&gt;</span></pre>
<pre><span class="kwrd">&lt;/</span><span class="html">HTML</span><span class="kwrd">&gt;</span></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2009/09/05/missing-metadata-with-office-2003-yet-another-duh-moment/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Troubleshooting SPSearch and good practices for moving large files</title>
		<link>http://www.cleverworkarounds.com/2009/08/03/troubleshooting-spsearch-and-good-practices-for-moving-large-files/</link>
		<comments>http://www.cleverworkarounds.com/2009/08/03/troubleshooting-spsearch-and-good-practices-for-moving-large-files/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 05:26:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SAN]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Storage]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/?p=1508</guid>
		<description><![CDATA[Every so often I get back into geek mode and roll up the sleeves and get my SharePoint hands dirty. Not so long ago I was assisting a small WSS3 based organisation with a major disk subsystem upgrade (iSCSI SAN) and locally attached storage upgrade, driven by content database growth and a need to convert [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><!--adsense-->
<p>Every so often I get back into geek mode and roll up the sleeves and get my SharePoint hands dirty. Not so long ago I was assisting a small WSS3 based organisation with a major disk subsystem upgrade (iSCSI SAN) and locally attached storage upgrade, driven by content database growth and a need to convert some sites to site collections. By the end of it all, we had a much better set-up with a much better performing disk subsystem, but I was hit by two problems. One was WSS Search being broken and needing a fix and the other was the appallingly slow speed of copying large files around.</p>
<p>So, let’s talk about fixing broken search and then talk about copying large files.</p>
<h2>1. When SPSearch breaks…</h2>
<p>The SharePoint install in question was a WSS3 site with SP1, and Search Server 2008 had not been installed. The partition that contained the indexes (F:\) had to be moved to another partition (G:), so to achieve this I used the command </p>
<p><font size="3" face="Courier New">stsadm –o </font><a href="http://technet.microsoft.com/en-us/library/cc288507.aspx" target="_blank"><font size="3" face="Courier New">spsearch</font></a><font size="3" face="Courier New"> indexlocation G:\DATA\INDEX</font></p>
<p>Now, 99.9% of the time this will happily do its thing. But today was the 0.01% of the time when it decided to be difficult. Upon executing this command, I received an RPC error. Unfortunately for me, I was out of time, so I decided to completely re-provision search and start all over again. </p>
<p>It didn’t matter whether I tried this in Central Administration-&gt;Operations-&gt;Services on Server, or via the command line below. Both methods would not work.</p>
<p><font size="3" face="Courier New">stsadm -o spsearch -action stop </font></p>
<p>On each attempt, search would get stuck on unprovisioning (stopping) with a sequence of events in the event log (eventID 2457, 2429 and 2428). </p>
<pre class="csharpcode">===========================================================================================</pre>
<pre class="csharpcode">Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 2457
Description: 

The plug-in manager <span class="kwrd">&lt;</span><span class="html">SPSearch.Indexer.1</span><span class="kwrd">&gt;</span> cannot be initialized.
Context: Application 'Search index file on the search server' 

Details:
The system cannot find the path specified. (0x80070003) 

===========================================================================================
Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 2429
Description: 

The plug-in in <span class="kwrd">&lt;</span><span class="html">SPSearch.Indexer.1</span><span class="kwrd">&gt;</span> cannot be initialized.
Context: Application '93a1818d-a5ec-40e1-82d2-ffd8081e3b6e', Catalog 'Search' 

Details:
The specified object cannot be found. Specify the name of an existing object. (0x80040d06) 

===========================================================================================</pre>
<pre class="csharpcode">Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 2428
Description: 

The gatherer object cannot be initialized.
Context: Application 'Search index file on the search server', Catalog 'Search' 

Details:
The specified object cannot be found. Specify the name of an existing object. (0x80040d06) </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>So, as you can see I was stuck. I couldn’t not clear the existing configuration and the search service would never actually stop. In the end, I started to wonder whether the problem was that my failed attempt to change the index partition had perhaps not reapplied permissions to the new location. To be sure I reapplied permissions using the following STSADM command</p>
<p><font size="3" face="courier ne">psconfig -cmd secureresources </font></p>
<p>This seemed to do the trick. Re-executing the stsadm spsearch stop command finally did not come up with an error and the service was listed as stopped. </p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image_thumb.png" width="645" height="207" /></a></p>
<p>Once stopped, we repartitioned the disks accordingly and now all I had to do was start the damn thing <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Through the Central Administration GUI I clicked Start and re-entered all of the configuration settings, including service accounts and the new index location (G:\DATA\INDEX). After a short time, I received the ever helpful “Unknown Error” error message. </p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image_thumb1.png" width="334" height="172" /></a></p>
<p>Rather than change debug settings in web.config, I simply checked the SharePoint logs and the event viewer. Now, I had a new event in the logs.</p>
<pre class="csharpcode">Event Type: Warning
Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 10035
Description:
Could not import the registry hive into the registry because it does not exist <span class="kwrd">in</span> the configuration database.
Context: Application <span class="str">'93a1818d-a5ec-40e1-82d2-ffd8081e3b6e'</span> </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Hmm&#8230; It suggests a registry issue, so I checked the registry.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image_thumb2.png" width="719" height="290" /></a></p>
<p>&#160;</p>
<p>Although the error message really made no sense to me, checking the registry turned out to be the key to solving this mystery. If you look carefully in the above screenshot, note that the registry key DataDirectory was set to “F:\DATA\INDEX”. </p>
<p>I was surprised at this, because I had re-provisioned the SPSearch to use the new location (G:\DATA\INDEX). I would have thought that changing the default index location would alter the value of this key. A delve into the ULS logs showed events like this.</p>
<p><font size="2" face="Courier New">STSADM.EXE (0x0B38) 0&#215;0830 Search Server Common MS Search Administration 95k1 High WSS Search index move: Changing index location from &#8216;F:\data\index&#8217; to &#8216;G:\data\index&#8217;. </font></p>
<p><font size="2" face="Courier New">STSADM.EXE (0x0B38) 0&#215;0830 Search Server Common MS Search Administration 95k2 High WSS Search index move: Index location changed to &#8216;G:\data\index&#8217;. </font></p>
<p><font size="2" face="Courier New">STSADM.EXE (0x0B38) 0&#215;0830 Search Server Common MS Search Administration 0 High CopyIndexFiles: Source directory &#8216;F:\data\index\93a1818d-a5ec-40e1-82d2-ffd8081e3b6e&#8217; not found for application &#8217;93a1818d-a5ec-40e1-82d2-ffd8081e3b6e&#8217;. </font></p>
<p><font size="2" face="Courier New">STSADM.EXE (0x0F10) 0&#215;1558 Windows SharePoint Services Topology 8xqz Medium Updating SPPersistedObject SPSearchServiceInstance Parent=SPServer Name=DAPERWS03. Version: 218342 Ensure: 0, HashCode: 54267293, Id: 305c06d7-ec6d-465a-98be-1eafe64d8752, Stack: at Microsoft.SharePoint.Administration.SPPersistedObject.Update() at Microsoft.SharePoint.Administration.SPServiceInstance.Update() at Microsoft.SharePoint.Search.Administration.SPSearchServiceInstance.Update() at Microsoft.Search.Administration.CommandLine.ActionParameter.Run(StringBuilder&amp; output) at Microsoft.SharePoint.Search.Administration.CommandLine.SPSearch.Execute() at Microsoft.Search.Administration.CommandLine.CommandBase.Run(String command, StringDictionary keyValues, String&amp; output) at Microsoft.SharePoint.StsAdmin.SPStsAdmin.RunOperation(SPGlobalAdmin globalAdmin, String st&#8230; </font></p>
<p><font size="2" face="Courier New"><strong><em>mssearch.exe (0&#215;1654) 0&#215;1694 Search Server Common IDXPIPlugin 0 Monitorable CTripoliPiMgr::InitializeNew &#8211; _CopyNoiseFiles returned 0&#215;80070003 &#8211; File:d:\office\source\search\ytrip\search\tripoliplugin\tripolipimgr.cxx Line:519 </em></strong></font></p>
<p><font size="2" face="Courier New">mssearch.exe (0&#215;1654) 0&#215;1694 Search Server Common Exceptions 0 Monitorable &lt;Exception&gt;&lt;HR&gt;0&#215;80070003&lt;/HR&gt;&lt;eip&gt;0000000001D4127F&lt;/eip&gt;&lt;module&gt;d:\office\source\search\ytrip\search\tripoliplugin\tripolipimgr.cxx&lt;/module&gt;&lt;line&gt;520&lt;/line&gt;&lt;/Exception&gt; </font></p>
<p>Note the second last line above (marked bold and italic). It showed that a function called CopyNoiseFiles returned a code of 0&#215;8007003. This code happens to be “The system <em>cannot find</em> the path specified,” so it appears something is missing.</p>
<p>It then dawned on me. Perhaps the SharePoint installer puts some files into the initially configured index location and despite moving the index to another location, SharePoint still looks to this original location for some necessary files. To test this, I loaded up a blank Windows 2003 VM and installed SharePoint SP1 *without* running the configuration wizard. When I looked in the location of the index files, sure enough – there are some files as shown below.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image_thumb3.png" width="619" height="463" /></a> </p>
<p>It turned out that during our disk reconfiguration, the path of F:\DATA\INDEX no longer existed. So I recreated the path specified in the registry (F:\DATA\INDEX) and copied the contents of the CONFIG folder from my fresh VM install. I then started the search service from Central Administration and… bingo! Search finally started successfully…Wohoo!</p>
<p>Now that I had search successfully provisioned, I re-ran the command to change the index location to G:\DATA\INDEX and then started a full crawl.</p>
<p><font size="3" face="Courier New">C:\&gt;</font><font size="3" face="Courier New">stsadm -o spsearch -indexlocation G:\DATA\INDEX </font></p>
<p><font size="3" face="Courier New">Operation completed successfully. </font></p>
<p><font size="3" face="Courier New">C:\&gt;stsadm -o spsearch -action fullcr</font><font size="3" face="Courier New">awlstart </font></p>
<p><font size="3" face="Courier New">Operation completed successfully. </font></p>
<p>I then checked the event logs and now it seems we are cooking with gas!</p>
<pre class="csharpcode">Event Type: Information
Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 10045
Description: 

Successfully imported the application configuration snapshot into the registry.
Context: Application <span class="str">'93a1818d-a5ec-40e1-82d2-ffd8081e3b6e'</span> 

Event Type: Information
Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 10044
Description: 

Successfully stored the application configuration registry snapshot <span class="kwrd">in</span> the database.
Context: Application <span class="str">'Serve search queries over help content'</span> </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>As a final check, I re-examined the registry and noted that the DataDirectory key had not changed to reflect G:\. Bear that in mind when moving your index to another location. The original path may still be referred to in the configuration.</p>
<h2>2. There are RAID cards and there are RAID cards</h2>
<p>Since part of the upgrade work was to improve disk performance, we had to detach databases and move them around while we upgraded the disk infrastructure and repartitioned existing disk arrays. The server had an on-board Intel RAID controller with two arrays configured. One was a two-disk RAID 0 SCSI and the other was a three-disk RAID 5 SATA array. The performance of the RAID 5 SATA had always been crap – even crappier than you would expect from onboard RAID 5. When I say crap, I am talking around 35 megabytes per second transfer rate – even on the two-disk SCSI RAID 0 array.</p>
<p>Now, 35MB/sec isn’t great, but not completely intolerable. But, what made this much, much worse however, was the extreme slowness in copying large files (ie &gt;4GB). When trying to copy files like this to the array, the throughput dropped to as low as 2MBs. </p>
<p>No matter whether it was Windows Explorer drag and drop or a command line utility like ROBOCOPY, the behaviour was the same. Throughput would be terrific for around 60 seconds, and then it would drop as shown below. </p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/08/image_thumb4.png" width="244" height="177" /></a> </p>
<p>My client called the server vendor and was advised to purchase 4 SCSI disks to replace the SATA’s. Apparently the poor SATA performance was actually because SCSI and SATA were mixed on the same RAID bard and bus. That was a no-no.</p>
<p>Sounded plausible, but of course, after replacing the RAID 5 with the SCSI disks, there was no significant improvement in disk throughput at all. The performance of large files still reflected the pattern illustrated in the screenshot above.</p>
<p>Monitoring disk queue length on the new RAID array showed that disk queues were off the planet in terms of within normal boundaries. Now, I know that some people view disk queue length as a bit of an <a href="http://sqlblog.com/blogs/linchi_shea/archive/2007/11/12/disk-queue-length-some-data-points-may-help.aspx" target="_blank">urban myth</a> in terms of disk performance, but copying the same files to the iSCSI SAN yielded a throughput rate of around 95MBs and the disk queue value rarely spiked above 2. </p>
<p>Damn! My client wasn’t impressed with his well known server vendor! Not only does the onboard RAID card have average to crappy performance to begin with, RAID 5 with large files makes it positively useless.</p>
<h3>Fun with buffers </h3>
<p>To me, this smelt like a buffer type of issue. Imagine you are pouring sand into a bucket and the bucket has a hole in it. If you pour sand into the bucket at a faster rate than the hole allows sand to pour out, then eventually you will overflow the bucket. I suspected this sort of thing was happening here. The periods of high throughput were when the bucket was empty and the sand filled it fast. Then the bucket filled up and things slowed to a crawl while all of that sand passed through the metaphorical hole in the bottom. Once the bucket emptied, there was another all-too-brief burst of throughput as it filled quickly again.</p>
<p>I soon found a terrific article from <a href="http://blogs.technet.com/askperf" target="_blank">EPS Windows Server Performance Team</a> that explain what was going on <a href="http://blogs.technet.com/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx" target="_blank">very clearly</a>.</p>
<p>Most file copy utilities like Robocopy or Xcopy call API functions that try and improve performance by keeping data in a buffer. The idea is that files that are changed or accessed frequently can be pulled from the buffer, thereby improving performance and responsiveness. But there is a trade-off. Adding this cache layer introduces an overhead in creating this buffer in the first place. If you are never going to access to copy this file again, adding it to the buffer is actually a bad idea.</p>
<p>Now imagine a huge file. Not only do you have the buffer overhead, but you now are also filling the buffer (and forcing it to be flushed), over and over again.</p>
<p>With a large file, you are actually better off avoiding the buffer altogether and doing a raw file copy. Any large file on a slow RAID card will still take time, but it’s a heck of a lot quicker than when combined with the buffering overhead.</p>
<h3>Raw file copy methods</h3>
<p>In the aforementioned article from the Microsoft EPS Server performance team, they suggest ESEUTIL as an alternative method. I hope they don’t mind me quoting them…</p>
<blockquote>
<p>For copying files around the network that are very large, my copy utility of choice is ESEUTIL which is one of the database utilities provided with Exchange.&#160; To get ESEUTIL working on a non-Exchange server, you just need to copy the ESEUTIL.EXE and ESE.DLL from your Exchange server to a folder on your client machine.&#160; It&#8217;s that easy.&#160; There are x86 &amp; x64 versions of ESEUTIL, so make sure you use the right version for your operating system.&#160; The syntax for ESEUTIL is very simple: <em>eseutil /y &lt;srcfile&gt; /d &lt;destfile&gt;</em>.&#160; Of course, since we&#8217;re using command line syntax &#8211; we can use ESEUTIL in batch files or scripts.&#160; ESEUTIL is dependent on the Visual C++ Runtime Library which is available as a <a href="http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&amp;displaylang=en">redistributable package</a></p>
</blockquote>
<p>I found an alternative to this, however, that proved its worth to me. It is called <a href="http://www.codesector.com/teracopy.php" target="_blank">Teracopy</a> and we tried the <a href="http://www.codesector.com/download.php" target="_blank">free edition</a> to see what difference it would make in terms of copy times. As it happens, the difference was significant and the time taken to transfer large files around was reduced by a factor of 5. Teracopy also produced a nice running summary of the copy thoughput in MB/sec.The product definitely proved its worth and at a whopping $15 bucks, is not going to break the bank. </p>
<p>So, if you are doing any sort of large file copies and your underlying disk subsystem is not overly fast, then I recommend taking a look at this product. Believe me, it will save you a heap of time.</p>
<h2>3. Test your throughput</h2>
<p>A final note about this saga. Anyone who deals with SQL Server will have likely read articles about best practice disk configuration in terms of splitting data/logs/backups to different disk arrays to maximise throughput. This client had done this, but since Teracopy gave us nice throughput stats, we took the opportunity to test the read/write performance of all disk subsystems and it turned out that putting ALL data onto the SAN array had significantly better performance than using any of the onboard arrays.</p>
<p>This meant that the by-the-book configuration was hamstrung by a poorly performing onboard RAID controller and even if the idea of using separate disks/spindles seemed logical, the cold hard facts of direct throughput testing proved otherwise.</p>
<p>After reconfiguring the environment to leverage this fact, the difference in response time of WSS, when performing bulk uploads was immediately noticeable.</p>
<p>The moral of the story? </p>
<p>If you are a smaller organisation and can’t afford the high end server gear like Compaq/IBM, then take the time to run throughput tests before you go to production. The results may surprise you.</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
<p><!--adsense--></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2009/08/03/troubleshooting-spsearch-and-good-practices-for-moving-large-files/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SPD workflows: &#8220;ERROR: request not found in the TrackedRequests&#8221;</title>
		<link>http://www.cleverworkarounds.com/2009/06/28/spd-workflows-error-request-not-found-in-the-trackedrequests/</link>
		<comments>http://www.cleverworkarounds.com/2009/06/28/spd-workflows-error-request-not-found-in-the-trackedrequests/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 08:08:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Forms Services]]></category>
		<category><![CDATA[InfoPath]]></category>
		<category><![CDATA[SPD]]></category>
		<category><![CDATA[SharePoint Designer]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Workflows]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/?p=1440</guid>
		<description><![CDATA[I’ve written this post to document a dumbass thing that I did and the error that it caused. Hopefully it might help someone googling in desperation sometime… The popularity of the “Tribute to the humble leave form” series over at SharePoint Magazine, has meant that we actually get a few gigs implementing &#8211; surprise, surprise [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><!--adsense--></p>
<p>I’ve written this post to document a dumbass thing that I did and the error that it caused. Hopefully it might help someone googling in desperation sometime…</p>
<p>The popularity of the “<a href="http://sharepointmagazine.net/technical/development/a-tribute-to-the-humble-leave-form" target="_blank">Tribute to the humble leave form</a>” series over at <a href="http://sharepointmagazine.net" target="_blank">SharePoint Magazine</a>, has meant that we actually get a few gigs implementing &#8211; surprise, surprise &#8211; InfoPath leave forms with SharePoint Designer workflows! This was actually quite unexpected, as I wrote that series as a joke and for end-user training purposes.</p>
<p>Now, I fully realise that many people don’t like tools like SharePoint Designer in the hands of mere mortals, but I personally think it is a terrific means to encourage buy-in and user evangelism and I encourage its sustainable use. Although “real developers” may disagree with me here, SPD workflows enable quick results without the embarrassing aftermath of premature code compilation (which always leads to frustration, right girls? <img src='http://www.cleverworkarounds.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  ).</p>
<p>Anyhow enough sexual innuendo – here is my error with my lessons learned</p>
<h2>The symptoms</h2>
<p>Recently, a happily running leave form workflow ground to a halt with an error as shown below. What the screenshot below shows is that the workflow died right after a “Pause for duration” workflow action. (Note the “pausing for 2 minutes” line, just before the actual workflow error).</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image-thumb3.png" width="595" height="282" /></a></p>
<p>Now, the interesting thing here is that the pause action never happened. The workflow bombed out straight away and there was no pause at all. Yet, the fact that the pause action logged to the history list meant that it attempted to do so. It seemed that the pause action ran for long enough to log that it was about to pause, but died when actually trying to.</p>
<p>The pause action occurred in step 2 of my workflow, but it is worthwhile showing you the first workflow step first.</p>
<p>Below is a screenshot of step 1 of the workflow. This first step is called “Modify Item Permissions” and we are using the <a href="http://www.codeplex.com/SPDActivities" target="_blank">codeplex custom workflow actions</a> to modify permissions of the submitted leave form, ensuring that only the requestor of the leave (and their boss) can see or modify the form.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image-thumb4.png" width="548" height="231" /></a></p>
<p>The step in the workflow, called “Manager Approval”, shows where we pause for 2 minutes. The reason we pause is to get around another workflow error that I will explain at the end of the post. After the pause action was completed and the workflow recommenced, it performed a “Collect data from user” task as shown below. This created a task for the requestors manager to approve the leave request.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image-thumb5.png" width="550" height="202" /></a></p>
<p>We know that the “Collect data from user” action never ran, because the “Employee Leave Approval” task never actually got created in the task list. Thus, we know the error occurred at the pause action. Or, did it?</p>
<p>This error occurred consistently whether the workflow was manually started or auto-triggered. Checked all the usual suspects &#8211; timber jobs ok, permissions unchanged and working well, etc. Scanning the ULS logs at this time showed an interesting error with a much less interesting stack trace (that I have pasted at the end of the post for readability).</p>
<p><strong>“Unexpected&#160;&#160;&#160; ERROR: request not found in the TrackedRequests. We might be creating and closing webs on different threads” </strong></p>
<p>Hmm, what is TrackedRequests and why is a request not found? Googling that error message wasn’t much help at all. Although it is quite common, nothing matched my particular context. But then I received a lucky break. When I <strong>cancelled</strong> the running workflow that was in this error state, I received a <strong>new</strong> error that made it quite easy to work out what was going on.</p>
<p><strong>WinWF Internal Error, terminating workflow Id# 02334a17-3211-4d30-902f-bf34e20354c6&#160;&#160;&#160;&#160; <br />Unexpected&#160;&#160;&#160; System.Workflow.Runtime.Hosting.PersistenceException: Object reference not set to an instance of an object. &#8212;&gt; System.NullReferenceException: Object reference not set to an instance of an object.&#160;&#160;&#160;&#160; at DP.Sharepoint.Workflow.Common.RemoveListItemPermissionEntry(SPListItem item, String principalName, Boolean breakRoleInheritance)&#160;&#160;&#160;&#160; </strong></p>
<p>It was this error that gave it away. For a start, the method being called was <strong>DP.Sharepoint.Workflow.Common.RemoveListItemPermissionEntry</strong> and the exception was a <strong>null reference</strong>. RemoveListItemPermissionEntry sounded suspiciously like the permission based workflow actions of the “Modify Item Permissions” step as highlighted below.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/06/image-thumb6.png" width="562" height="241" /></a></p>
<p>But wait… the workflow never failed at this line at all. It actually failed at the first action of the next step (“Manager Approval”)&#160; with the “request not found in the TrackedRequests” error. Interesting, eh?</p>
<p>Let’s put aside the issue of what step and what action the workflow failed on for a moment, and examine the second error message more closely. If you examine the “Modify Item Permissions” action highlighted above, can you think of any reason that I would get a null reference exception?</p>
<p>Ah! What happens if the previous action called “Set Variable”, set a <strong>blank or null value</strong>? I suspect that the “Grant permissions on an item” workflow action will attempt to change permissions of the item to a blank or null user. The result? That workflow action will die with a null reference exception &#8211; precisely what the error states.</p>
<p>When I checked the source of the variable “LineManagerAccount”, it was looking up a contact list for the manager of the requestor. Sure enough, it did turn out that that column was blank for some users. Thus, a simple exercise in input validation combined with a small correction to that list item and the problem was solved.</p>
<h2>Further questions and further information</h2>
<p>I could stop this post there I suppose and perhaps someone, sometime might find this post and think “Wohoo!”. But this problem raised a couple of issues, as well as made it clear to me that I had been stupid in how I designed this one. Let’s tackle them one by one.</p>
<h3>1. When did it die again?</h3>
<p>Clearly the error that caused all of this, occurred at the last action of the “Modify Item Permissions” step. We know this because the step before was where the lookup to the contact list happened, and this is where the null value came from that caused the exception. But then why did the workflow not stop at this point? Why did it continue onward and attempt to move to the “Manager Approval” steps and die on the “Pause for duration” action?</p>
<p>Whether this is default behaviour of SPD workflows or a logic fault in the exception handling code in the codeplex-based “Grant Permission on an Item” action, this makes life hard to troubleshoot because the error message never made sense. I only found out the true root cause when I terminated the workflow manually and got lucky because the offending exception suddenly appeared.</p>
<p>So, the conclusion to draw? If your SPD workflow dies with “ERROR: request not found in the TrackedRequests” in the logs, it may be that the real cause of the problem <strong>is a previous workflow step </strong>and not the step where the workflow actually stopped.</p>
<h3>2. Paul is a dumbass</h3>
<p>Okay, so let’s talk about lessons learnt. Some people reading this may wonder why I never used Active Directory or the user profile store to store manager details for a user and to do the lookup from there. The answer is that this contact list approach simply made sense for this client and this is actually not the dumb thing that I did. The dumb thing that I did was to forget that all of the necessary business logic and data validation steps could have been performed in the InfoPath form itself.</p>
<p>Remember that InfoPath forms can have data connections to all sorts of sources such as SharePoint lists, web services and relational databases. (I am not going into detail on how to do that here because I have already covered it in quite a lot in <a href="http://sharepointmagazine.net/technical/a-humble-tribute-to-the-leave-form-part-5" target="_blank">part 5</a> of the “<a href="http://sharepointmagazine.net/technical/development/a-tribute-to-the-humble-leave-form" target="_blank">Leave Form Tribute</a>” series). We can have a published InfoPath form connect to any SharePoint list or library across the entire farm to look up business logic details, such as an approver. This is something that SharePoint Designer workflows cannot do out of the box – it can only lookup from the site where the workflow has been created.</p>
<p>But, more important than that, we can easily use InfoPath rules and data validation functionality to ensure that the values are not null before submitting.</p>
<p>What this all means is that your SPD workflows end up being simpler and easier to maintain because InfoPath is providing all of the data to the workflow as well as the validation of the data. Therefore, the workflow now doesn’t have to do the lookup work and have unnecessary steps and actions.</p>
<p>For these reasons I think that, if you can, grab all of the data you need for a business process using the InfoPath form using hidden fields. Then publish the form and ensure these hidden fields are published as site columns.</p>
<p>For this particular purpose, I think that InfoPath is a lesser evil than SharePoint Designer workflows.</p>
<h3>3. What are the pause actions there for anyway?</h3>
<p>Finally, I promised I’d explain why I had a pause action in the workflow. This is to get around a race condition with workflows that produces an intermittent error message:</p>
<p>“This task is currently locked by a running workflow and cannot be edited”</p>
<p>I’ve seen this occur in several situations and it pretty much boils down to some workflow actions being synchronous and subsequent actions starting before the previous action properly completed. Consider this example.</p>
<p>One workflow creates or updates an item in a list, say a task list. But the task list also has a workflow attached to it. This means that the first workflow creates the task item and then moves onto the next step. Meanwhile, a new workflow has been triggered for that new task list item. This secondary workflow refers to information stored in the main item which causes the race condition.&#160; If the information in the main item is not committed before this workflow attempts to use it, you’ll get null values when the main item is a new item.&#160; When working with SPD workflows, these null values will show up as ????.&#160; </p>
<p>To resolve the race condition, I had to ensure that the main item was committed before the secondary workflow was started by pausing the workflow.&#160; Why does pausing the workflow cause the changes to be committed?&#160; According to the MSDN article “How Windows SharePoint Services Processes Workflow Activities” <a href="http://msdn.microsoft.com/en-us/library/ms442249.aspx">http://msdn.microsoft.com/en-us/library/ms442249.aspx</a></p>
<blockquote><p>Windows SharePoint Services runs the workflow until it reaches a point where it cannot proceed because it is waiting for some event to occur: for example, a user must designate a task as completed. Only at this &quot;commit point&quot; does Windows SharePoint Services commit the changes made in the previous Windows SharePoint Services-specific workflow activities…</p>
</blockquote>
<p>The not-so-clever workaround is to pause the workflow in between actions. When you add a pause, the workflow “cannot proceed because it is waiting for some event to occur” and therefore makes it a commit point. Not pretty – but works.</p>
<p>I hope that you find this article of use in your SharePoint Designer workflow troubleshooting endeavours. Below, I have pasted the complete stack traces (for the search engines).</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><!--adsense--></p>
<div class="csharpcode"></div>
<div class="csharpcode">
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46 w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected ERROR: request not found in the TrackedRequests. We might be creating and closing webs on different threads. ThreadId = 1, Free call stack = at Microsoft.SharePoint.SPRequestManager.Release(SPRequest request) at Microsoft.SharePoint.SPWeb.Invalidate() at Microsoft.SharePoint.SPWeb.Close() at Microsoft.SharePoint.SPSite.Close() at Microsoft.SharePoint.SPSite.Dispose() at Microsoft.SharePoint.Workflow.SPWorkflowManager.<span class="kwrd">&lt;&gt;</span>c__DisplayClass1.<span class="kwrd">&lt;</span><span class="html">StartWorkflow</span><span class="kwrd">&gt;</span>b__0() at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state) at Microsoft.SharePoint.SPSecurity.<span class="kwrd">&lt;&gt;</span>c__DisplayClass4.<span class="kwrd">&lt;</span><span class="html">RunWithElevatedPrivileges</span><span class="kwrd">&gt;</span>b__2() at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) at Microsoft.SharePoint.SPSecurity.RunWithEl&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;evatedPrivileges(WaitCallback secureCode, Object param) at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) at Microsoft.SharePoint.Workflow.SPWorkflowManager.StartWorkflow(SPListItem item, SPWorkflowAssociation association, SPWorkflowEvent startEvent, Boolean bAutoStart, Boolean bCreateOnly) at Microsoft.SharePoint.Workflow.SPWorkflowManager.StartWorkflow(SPListItem item, SPWorkflowAssociation association, String eventData, Boolean isAutoStart) at Microsoft.SharePoint.Workflow.SPWorkflowManager.StartWorkflow(SPListItem item, SPWorkflowAssociation association, String eventData) at Microsoft.SharePoint.WebControls.SPWorkflowDataSourceView.Insert(IDictionary values) at Microsoft.SharePoint.WebControls.SPWorkflowDataSourceView.Ins&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;ert(IDictionary values, DataSourceViewOperationCallback callback) at Microsoft.SharePoint.WebPartPages.DataFormWebPart.FlatCommit() at Microsoft.SharePoint.WebPartPages.DataFormWebPart.PerformCommit() at Microsoft.SharePoint.WebPartPages.DataFormWebPart.HandleOnSave(Object sender, EventArgs e) at Microsoft.SharePoint.WebPartPages.DataFormWebPart.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includ&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;eStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error) at System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr) at Sys&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;tem.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType) , Allocation call stack (if present) at Microsoft.SharePoint.Library.SPRequest..ctor() at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous) at Microsoft.SharePoint.SPWeb.InitializeSPRequest() at Microsoft.SharePoint.SPWeb.EnsureSPRequest() at Microsoft.SharePoint.SPWeb.get_Request() at Microsoft.SharePoint.SPWeb.InitWebPublic() at Microsoft.SharePoint.SPWeb.get_ServerRelativeUrl() at Microsoft.SharePoint.SPWeb.get_Url() at Microsoft.SharePoint.SPUser.InitMember() at Microsoft.SharePoint.SPUser..ctor(SPWeb web, ISecura&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;bleObject scope, String strIdentifier, Object[,] arrUsersData, UInt32 index, Int32 iByParamId, String strByParamSID, String strByParamEmail, SPUserCollectionType userCollectionType, Boolean isSiteAuditor) at Microsoft.SharePoint.SPUser..ctor(SPWeb web, ISecurableObject scope, String strIdentifier, Object[,] arrUsersData, UInt32 index, Int32 iByParamId, String strByParamSID, String strByParamEmail, SPUserCollectionType userCollectionType) at Microsoft.SharePoint.SPUserCollection.GetByIDNoThrow(Int32 id) at Microsoft.SharePoint.SPSite.get_SystemAccount() at Microsoft.SharePoint.WorkflowActions.Helper.ResolveUserField(WorkflowContext context, Object fvalue) at Microsoft.SharePoint.WorkflowActions.Helper.LookupUser(WorkflowContext context, Guid listId, Int32 listItem, Strin&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;g fieldName) at Microsoft.SharePoint.WorkflowActions.Helper.LookupUser(WorkflowContext context, String listIdOrName, Int32 listItem, String fieldName) at Microsoft.SharePoint.WorkflowActions.LookupActivity.Execute(ActivityExecutionContext provider) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime) at System.Workflow.Runtime.Scheduler.Run() at System.Workflow.Runtime.WorkflowExecutor.RunScheduler() at System.Workflow.Runtime.WorkflowExecutor.RunSome(Object ignored) &#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;at System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService.WorkItem.Invoke(WorkflowSchedulerService service) at System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService.QueueWorkerProcess(Object state) at System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading._ThreadPoolW&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:25:20.46* w3wp.exe (0x0BA8) 0x16F8 Windows SharePoint Services General 0 Unexpected &#8230;aitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack) at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state) </span></p>
<p><span style="font-size: xx-small">&#160; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:27:16.49 w3wp.exe (0x0BA8) 0x1CB4 Windows SharePoint Services Workflow Infrastructure 88xr Unexpected WinWF Internal Error, terminating workflow Id# 02334a17-3211-4d30-902f-bf34e20354c6 </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:27:16.49 w3wp.exe (0x0BA8) 0x1CB4 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected System.Workflow.Runtime.Hosting.PersistenceException: Object reference not set to an instance of an object. &#8212;<span class="kwrd">&gt;</span> System.NullReferenceException: Object reference not set to an instance of an object. at DP.Sharepoint.Workflow.Common.RemoveListItemPermissionEntry(SPListItem item, String principalName, Boolean breakRoleInheritance) at DP.Sharepoint.Workflow.PermissionsService.<span class="kwrd">&lt;&gt;</span>c__DisplayClass1.<span class="kwrd">&lt;</span><span class="html">ProcessGrantRequest</span><span class="kwrd">&gt;</span>b__0() at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state) at Microsoft.SharePoint.SPSecurity.<span class="kwrd">&lt;&gt;</span>c__DisplayClass4.<span class="kwrd">&lt;</span><span class="html">RunWithElevatedPrivileges</span><span class="kwrd">&gt;</span>b__2() at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:27:16.49* w3wp.exe (0x0BA8) 0x1CB4 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected &#8230; at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) at DP.Sharepoint.Workflow.PermissionsService.ProcessGrantRequest(PermissionRequest pr) at DP.Sharepoint.Workflow.PermissionsService.Commit(Transaction transaction, ICollection items) at System.Workflow.Runtime.WorkBatch.PendingWorkCollection.Commit(Transaction transaction) at System.Workflow.Runtime.WorkBatch.Commit(Transaction transaction) at System.Workflow.Runtime.VolatileResourceManager.Commit() at System.Workflow.Runtime.WorkflowExecutor.DoResourceManagerCommit() at System.Workflow.Runtime.Hosting.WorkflowCommitWorkBatchService.CommitWorkBatch(CommitWorkBatchCallback commitWorkBatchCallback) at System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchSer&#8230; </span></p>
<p><span style="font-size: xx-small">06/25/2009 12:27:16.49* w3wp.exe (0x0BA8) 0x1CB4 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected &#8230;vice.CommitWorkBatch(CommitWorkBatchCallback commitWorkBatchCallback) at System.Workflow.Runtime.WorkflowExecutor.CommitTransaction(Activity activityContext) at System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation) &#8212; End of inner exception stack trace &#8212; at System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation) at System.Workflow.Runtime.WorkflowExecutor.ProtectedPersist(Boolean unlock) </span></p>
</p></div>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2009/06/28/spd-workflows-error-request-not-found-in-the-trackedrequests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why InfoPath rocks</title>
		<link>http://www.cleverworkarounds.com/2009/03/05/why-infopath-rocks/</link>
		<comments>http://www.cleverworkarounds.com/2009/03/05/why-infopath-rocks/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 12:31:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Forms Services]]></category>
		<category><![CDATA[InfoPath]]></category>
		<category><![CDATA[Offbeat]]></category>

		<guid isPermaLink="false">http://www.cleverworkarounds.com/2009/03/05/why-infopath-rocks/</guid>
		<description><![CDATA[At the San Diego Best Practices SharePoint conference, I sat quietly and listened to the governance godfather himself, Robert Bogue, discussing with the other SharePoint &#34;big kids&#34; various reasons why InfoPath sucks in many situations and some of its current design faults. I mean, anybody who has used forms services knows what a pain redeployment [...]<p class="tags">No Tags</p>]]></description>
			<content:encoded><![CDATA[<p><!--adsense-->
<p>At the San Diego Best Practices SharePoint conference, I sat quietly and listened to the governance godfather himself, <a href="http://www.thorprojects.com/blog/default.aspx" target="_blank">Robert Bogue</a>, discussing with the other SharePoint &quot;big kids&quot; various reasons why InfoPath sucks in many situations and some of its current design faults. I mean, anybody who has used forms services knows what a pain redeployment is, how much of a pain managed code is, the horrible performance of web services, branding crap and the like. Thus, all were perfectly valid points.</p>
<p>But irrespective of how correct those points are, I&#8217;d like to <strong>categorically state why </strong>InfoPath 2007 and Forms Services are the <strong>best</strong> pieces of technology that Microsoft has ever invented.</p>
<p>The simple reason is this. </p>
<p><u>My wife likes it!</u></p>
<p>To fully explain the implications of why InfoPath rocks, I have created an <a href="http://www.cleverworkarounds.com/2009/03/04/the-one-best-practice-to-rule-them-all-part-4/" target="_blank">IBIS issue map</a> that makes the argumentation quite clear.</p>
<p><a href="http://www.cleverworkarounds.com/wp-content/uploads/2009/03/image13.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="image" src="http://www.cleverworkarounds.com/wp-content/uploads/2009/03/image-thumb13.png" width="978" border="0" /></a> </p>
<p>I rest my case.</p>
<p>&#160;</p>
<p>Thanks for reading</p>
<p>Paul Culmsee</p>
<p><a href="http://www.sevensigma.com.au">www.sevensigma.com.au</a></p>
</p>
<p> <!--adsense--></p>
<p class="tags">No Tags</p>]]></content:encoded>
			<wfw:commentRss>http://www.cleverworkarounds.com/2009/03/05/why-infopath-rocks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
