<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5663158290595373160</id><updated>2011-11-27T19:08:30.736-05:00</updated><title type='text'>Mighty Dogs</title><subtitle type='html'>Sharepoint Tips and Tricks.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default?start-index=101&amp;max-results=100'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>117</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6350587869554022998</id><published>2010-08-27T15:05:00.001-04:00</published><updated>2010-08-27T15:05:30.876-04:00</updated><title type='text'>Infopath Performance tips #2</title><content type='html'>In my last post, I mentioned that I&amp;#39;d recently gone through one of my forms and identified several causes of slow performance.  I was able to reduce the form&amp;#39;s load time from 40 to 2 seconds.  Most of that performance gain came from moving file attachments outside the form for storage.  I&amp;#39;ll be talking about how I did that in my next post.  &lt;br&gt; Today I&amp;#39;m going to talk about Web Service calls.  When I was testing my load times, I found that even the quickest web service call took at least 0.5 seconds.  Since my form originally had 7 such calls, that time was really stacking up.  I went through my form and eliminated all my Web Service calls that were being called during the On Load event. :&lt;br&gt; &lt;br&gt;First, I replaced Web Service calls with native APIs whenever possible.  For example, I was pulling in information about the current user using the Sharepoint User Profile web service.  I replaced this with a call to the User Profile Manager.  Here&amp;#39;s a snippet where I get the user&amp;#39;s Department:&lt;br&gt;  ServerContext context = ServerContext.GetContext(myWeb.Site);&lt;br&gt;UserProfileManager upMgr = new UserProfileManager(context);&lt;br&gt;UserProfile currentProfile = upMgr.GetUserProfile(loginName);&lt;br&gt;departmentField.SetValue(currentProfile[&amp;quot;Department&amp;quot;].toString());&lt;br&gt; &lt;br&gt;Some Web Service calls just can&amp;#39;t be replaced...so I hid them. For instance, on my form I was contacting our financial system and pulling in the latest budget numbers.  This information needed to appear on my form, and the web service was the only way to get at that information.  What I did was move the budget information off the default view and put it on a new budget view instead.  &lt;br&gt; That eliminated the need to populate the information on the form load.  My form already uses &lt;a href="http://blogs.msdn.com/b/infopath/archive/2006/05/01/tabs.aspx"&gt;Button Tabs&lt;/a&gt; to move between views.  All I had to do was add my Web Service call to the budget tab.  That way the budget web service doesn&amp;#39;t get called until it is needed. The user doesn&amp;#39;t notice the slight delay because the page is being redrawn.  &lt;br&gt; You could use the same approach with a hidden section that is displayed by clicking on a button, or selecting a radio option.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6350587869554022998?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6350587869554022998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6350587869554022998' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6350587869554022998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6350587869554022998'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2010/08/infopath-performance-tips-2.html' title='Infopath Performance tips #2'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7549703460932101913</id><published>2010-08-25T16:29:00.001-04:00</published><updated>2010-08-25T16:29:58.585-04:00</updated><title type='text'>Infopath Performance tips #1</title><content type='html'>In the next few posts I&amp;#39;m going to share some of my experiences with Infopath performance tuning.  Recently I took a look at one of my earliest forms to try to improve performance.  &lt;br&gt;&lt;br&gt;The form in question was taking around 20 seconds to load when new, and up to 40 seconds to load when loaded with data.  Obviously, this was not acceptable.  I did a code review and got the load time down to a consistent 2 seconds. &lt;br&gt; &lt;br&gt;Here&amp;#39;s what I found:&lt;br&gt;1) Web Service calls are sloooooow.  That includes calls to Web Services on the Sharepoint server for things like User Profiles.  &lt;br&gt;2) File Attachments = Death.  Any file that you attach to your Infopath form is stored as encoded text within your form.  That means if you have a 5MB Word Document attached, your Infopath document is suddenly 5MB bigger.  That leads to:&lt;br&gt; 3) Post Back events make your form look slow.  This is because every time you fire a post-back event, a copy of your form is uploaded to the server...your action is performed...and an updated version of your form is downloaded from the server.  If your form is full of attachments, you can imagine how slow this can become.  Even if your form isn&amp;#39;t large, you&amp;#39;re still looking at a half-second during which your form is locked up.&lt;br&gt; &lt;br&gt;The fixes I implemented on my form were:&lt;br&gt;1) Get rid of all Web Service calls.  Those Web Service calls I couldn&amp;#39;t eliminate I hide by putting them into View Changes when the user is already expecting a short wait.  I eliminated all Web Service calls from my On-Load events.&lt;br&gt; 2) Move file attachments outside your form.  All my attachments are now stored in a separate Document Library.  My Infopath form contains links to the files which are displayed to the user as clickable links.&lt;br&gt;3) Combine multiple Post Back events instead of firing them one at a time.  I did this by using Views to create a Wizard type interface.  Users select several Radio Button options but my post back doesn&amp;#39;t fire until they click a Next button at which point I do all my processing at once.  &lt;br&gt; &lt;br&gt;In my following posts I&amp;#39;ll give examples for each, including the code I&amp;#39;m using.  First up will be how I replaced my call to the User Profile web service.&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7549703460932101913?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7549703460932101913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7549703460932101913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7549703460932101913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7549703460932101913'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2010/08/infopath-performance-tips-1.html' title='Infopath Performance tips #1'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2757687448183654592</id><published>2010-08-13T14:34:00.001-04:00</published><updated>2010-08-13T14:34:03.853-04:00</updated><title type='text'>Relink Infopath Documents Web Part</title><content type='html'>We&amp;#39;ve been archiving our old documents lately, and we usually do this by moving old Infopath documents to an archive Site.  When you do this, you need to relink the Infopath documents to the new Site Collection.  &lt;br&gt;&lt;br&gt; Microsoft gives you a tool to do this, the Relink Documents view that&amp;#39;s on every Form Library.  The problem with this is that you have to select each document manually, and you&amp;#39;re limited to 100 documents at a time.  There are hacks out there that help with both of these problems, but I wanted something better.&lt;br&gt; &lt;br&gt;After some searching, I found this project: &lt;a href="http://sprelinkdocuments.codeplex.com/"&gt;http://sprelinkdocuments.codeplex.com/&lt;/a&gt;  This is a Windows app that can be run on the server.  The app asks you for the GUID of the form library.  The creator of the script helpfully provided his source code, so I took that and wrapped it in a Web Part.&lt;br&gt; &lt;br&gt;When you add the Web Part to your site, it checks the URL of the hosting page to see if it is on the Relink view page.  If it is, it parses the URL of the page to figure out the name of the Form Library.  If it isn&amp;#39;t on the Relink view page, it just shows a drop-down menu with a list of all the Form Libraries on the site.  &lt;br&gt; &lt;br&gt;I&amp;#39;ve forwarded a copy of my source to the owner of the original project.  It should be posted to the Codeplex site soon.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2757687448183654592?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2757687448183654592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2757687448183654592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2757687448183654592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2757687448183654592'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2010/08/relink-infopath-documents-web-part.html' title='Relink Infopath Documents Web Part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3952724781420506392</id><published>2010-08-09T16:48:00.001-04:00</published><updated>2010-08-09T16:48:48.101-04:00</updated><title type='text'>New Tool Created - Group Synch</title><content type='html'>&lt;div&gt;I just posted a new tool on the CodePlex this afternoon.  Here&amp;#39;s a lin: &lt;a href="http://spgroupsynch.codeplex.com/"&gt;http://spgroupsynch.codeplex.com/&lt;/a&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;The tool synchronizes groups between Site Collections in Sharepoint.  You show it a Site Collection to start from, it pulls all the Groups and Group Membership and then copies it over to another Site Collection.  It&amp;#39;s a one-way push only, although you could get that if you run the tool again with the To and From sites reversed now that I think about it.&lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt;I wrote the tool over the weekend because my manager was worried about the ability to get our custom workflows running on multiple site collections.  Our workflows use Group Memberships to control access to forms and assign tasks...and we have literally thousands of them.  Basically every job title at every location gets a group, eg Corporate CEO, HospitalA CFO, etc.  Trying to keep all these groups up to date is already a daunting task in our single site collection.  Just thinking of maintaining multiple copies of these groups updated across a couple dozen site collections was giving me nightmares.&lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt;This was a fun little script to write.  I used the basic framework that I originally came up with building my SPWakeup app.  This handles things like Logging, Run-Time options, etc.  In this version I replaced asking for a mail server IP at runtime and used the SPUtility.Sendemail() instead.  It&amp;#39;s a much cleaner way to handle mail, and should avoid some time-out issues I&amp;#39;ve been having with our internal mail server. &lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt;This is also the first time I&amp;#39;ve really taken advantage of Class constructors. In the past I&amp;#39;d just been createing my class object, and then manually setting the properties. This has been a silly way to do things, so I forced myself to work with constuctors on this project. I&amp;#39;m very happy with the results.&lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt;I think I can also say that I&amp;#39;ve finally gotten a real handle on working with SPGroup and SPUser objects.  I&amp;#39;ve been working a great deal with Permissions lately, so I&amp;#39;ve been knee-deep in SPMembers for the last few months.  When I was writing this tool, I actually wrote all the major functions without ever debugging or building.  When I launched it for the first time this afternoon, I was really pleased that everything worked the way I expected it to the first time.&lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3952724781420506392?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3952724781420506392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3952724781420506392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3952724781420506392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3952724781420506392'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2010/08/new-tool-created-group-synch.html' title='New Tool Created - Group Synch'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-300227617283636179</id><published>2009-10-05T17:03:00.001-04:00</published><updated>2009-10-05T17:03:59.183-04:00</updated><title type='text'>Standard Submit/Save for Infopath</title><content type='html'>&lt;div class="gmail_quote"&gt;Last week I was asked to update the submit option on 5 of my old Infopath forms.  Originally these forms just used the built in Save button on the toolbar.  I was asked to give the user a menu to choose their hospital, and then submit the document to a matching folder.&lt;br&gt;  &lt;br&gt;I&amp;#39;d done something similar on another form recently, so I decided to adapt that code, and make it generic enough that I could use the resulting code for all 5 updates.  What I&amp;#39;ve come up with is something that I plan to use as the basis of all my future forms.&lt;br&gt;  &lt;br&gt;Here&amp;#39;s what you need to do if you want to try it:&lt;br&gt;1) Create a Submit connection with the default name of &amp;quot;Main submit&amp;quot;.&lt;br&gt;2) Create a Web Reference called ProfileService that points to /_vti_bin/UserProfileService.asmx on your server, ie &lt;a href="http://myserver/_vti_bin/UserProfileService.asmx" target="_blank"&gt;http://myserver/_vti_bin/UserProfileService.asmx&lt;/a&gt;&lt;br&gt;  3) Create a reference to Microsoft.Sharepoint.DLL.&lt;br&gt;&lt;br&gt;Your form will need the following:&lt;br&gt;1) FileName field:  Used to hold the file name once the form is submitted, ie file - 01-01-2001.xsn.  The file name is built using the Name field + the current date.  If there are duplicates, we add +1 to the name, ie file-2 - 01-01-2001.xsn.&lt;br&gt;  2) Name field:  This can be any text field, and is used to generate the file name.  It should be a field that is likely to be unique, but we do check for duplicate filenames, so it doesn&amp;#39;t have to be absolutely unique. &lt;br&gt;3) [Optional] Log field:  Used to log changes to the form.  My example form logs Creation, Submission, and Saves.  &lt;br&gt;4) [Optional] Errors field: Used to hold any errors that pop up.  This example form just logs the error.  In most of my real forms, when I encounter an error, I switch to a special Error view where I show the user what went wrong, and give them a button to report the error to our help desk.&lt;br&gt;  5) [Optional] FolderChoices field:  Used to build the list of available folders. (This needs to be a repeating field)&lt;br&gt;6) [Optional] SelectedFolder field: Grabs the name of the folder that the user has selected. (This should be a drop-down menu which gets its values from the FolderChoices field)&lt;br&gt;  &lt;br&gt;Your form will need a Save button.  Have that button call StartSaveSubmitForm().  The code will figure out whether the document has already been saved, and either generate a new file name and submit, or save to the existing document.&lt;br&gt;  &lt;br&gt;If you want to submit to a folder, use the Loading event below to populate your FolderChoices field with all the folders that exist in your Form Library.&lt;br&gt;&lt;br&gt;You&amp;#39;ll need to disable the Save button if your required fields are still blank.  You&amp;#39;ll also want to disable the Name and Folder fields once the document has been submitted to avoid confusion.  (The filename is only generated the first time you save the document, so changing the Folder field will not save the doc to a new folder, and changing the Name field will not rename the document.)&lt;br&gt;  &lt;br&gt;If you don&amp;#39;t want to submit to a folder, set SubmitToFolder to False.&lt;br&gt; If you don&amp;#39;t want to use logging, comment out the references.&lt;br&gt; If you don&amp;#39;t want to use error logging, comment out the references.&lt;br&gt;&lt;br&gt;Here is the code from a stripped down form using this option.  &lt;br&gt;&lt;br&gt;using Microsoft.Office.InfoPath;&lt;br&gt;using System;&lt;br&gt;using System.Windows.Forms;&lt;br&gt;  using System.Xml;&lt;br&gt;using System.Xml.XPath;&lt;br&gt;using mshtml;&lt;br&gt;using Microsoft.SharePoint;&lt;br&gt;using System.Collections;&lt;br&gt;&lt;br&gt;namespace submitcode&lt;br&gt;{&lt;br&gt;    public partial class FormCode&lt;br&gt;    {&lt;br&gt;        public void InternalStartup()&lt;br&gt;          {&lt;br&gt;            EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);&lt;br&gt;            ((ButtonEvent)EventManager.ControlEvents[&amp;quot;Save_Button&amp;quot;]).Clicked += new ClickedEventHandler(Save_Button_Clicked);&lt;br&gt;          }&lt;br&gt;&lt;br&gt;        public void FormEvents_Loading(object sender, LoadingEventArgs e)&lt;br&gt;        {&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;            //Set the Load variables for this Form&lt;br&gt;              //////////////////////////////////////////////////////////////////////////////&lt;br&gt;&lt;br&gt;            string fileName = &amp;quot;/my:myFields/my:FileName&amp;quot;;&lt;br&gt;            string libraryName = &amp;quot;Library&amp;quot;; //Name of the form Library we&amp;#39;re submitting to&lt;br&gt;              string folderChoicesFieldXPath = &amp;quot;/my:myFields/my:FolderChoices&amp;quot;; //XPath for the repeating field that will hold our folder choices            &lt;br&gt;            bool submitToFolder = true;//If you don&amp;#39;t want to use folders, change this to false&lt;br&gt;  &lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;            &lt;br&gt;            //Check to see if the filename has been set&lt;br&gt;            XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;              XPathNavigator fileNameField = xPathNav.SelectSingleNode(fileName, NamespaceManager);&lt;br&gt;&lt;br&gt;            if (fileNameField.Value.ToString() == &amp;quot;&amp;quot;)//Doc hasn&amp;#39;t been saved yet&lt;br&gt;            {&lt;br&gt;                 LogComment(&amp;quot;Document created.&amp;quot;);&lt;br&gt;                 if (submitToFolder)//If we are submitting to a folder, build the list of folder names&lt;br&gt;                {&lt;br&gt;                    GetSubFolders(libraryName, folderChoicesFieldXPath);&lt;br&gt;                }&lt;br&gt;              }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        public void Save_Button_Clicked(object sender, ClickedEventArgs e)&lt;br&gt;        {&lt;br&gt;            StartSaveSubmitForm();&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        private void StartSaveSubmitForm()&lt;br&gt;          {&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;            //Set the Submit variables for this Form&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;  &lt;br&gt;            string folderXPath = &amp;quot;/my:myFields/my:FolderPicker&amp;quot;;//If you are submitting to a folder point to list, otherwise leave blank&lt;br&gt;            string fileNameXPath = &amp;quot;/my:myFields/my:FileName&amp;quot;;//The filename field used to set your form&amp;#39;s name, IE: test - 01-01-2009.xsn  &lt;br&gt;              string nameXPath = &amp;quot;/my:myFields/my:NameField&amp;quot;; //The field used to generate the first part of the filename. The current date will be post-pended            &lt;br&gt;            string libraryName = &amp;quot;Library&amp;quot;; //Name of the Form Library&lt;br&gt;              bool submitToFolder = true;//If you don&amp;#39;t want to use folders, change this to false&lt;br&gt;&lt;br&gt;            ///////////////////////////////////////////////////////////////////////////////&lt;br&gt;            &lt;br&gt;            //Call Submit or Save method depending on whether the document has been saved&lt;br&gt;              XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;            XPathNavigator fileNameField = xPathNav.SelectSingleNode(fileNameXPath, NamespaceManager);&lt;br&gt;&lt;br&gt;            if (fileNameField.Value.ToString() == &amp;quot;&amp;quot;)//Document hasn&amp;#39;t been saved yet, so submit it&lt;br&gt;              {&lt;br&gt;                SubmitForm(folderXPath, fileNameXPath, nameXPath, libraryName, submitToFolder);&lt;br&gt;            }&lt;br&gt;            else //document has already been submitted, save changes&lt;br&gt;            {&lt;br&gt;                  SaveForm(folderXPath, fileNameXPath, nameXPath, libraryName, submitToFolder);&lt;br&gt;            }            &lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private void LogComment(string comment)&lt;br&gt;        {&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;              //Set the Log variables for this Form&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;&lt;br&gt;            string logXPath = &amp;quot;/my:myFields/my:Log&amp;quot;;&lt;br&gt;&lt;br&gt;              //////////////////////////////////////////////////////////////////////////////&lt;br&gt;            &lt;br&gt;            XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;            XPathNavigator logField = xPathNav.SelectSingleNode(logXPath, NamespaceManager);&lt;br&gt;  &lt;br&gt;            string log = logField.Value.ToString();&lt;br&gt;&lt;br&gt;            string newEntry = DateTime.Now.ToString() + &amp;quot; - &amp;quot; + FindCurrentUser() + &amp;quot; - &amp;quot; + comment + &amp;quot;\n\n&amp;quot; + log;&lt;br&gt;            logField.SetValue(newEntry);&lt;br&gt;          }&lt;br&gt;&lt;br&gt;        private void ReportError(string errorMessage, string fullError)&lt;br&gt;        {&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;            //Set the Error Logging variables for this Form&lt;br&gt;              //////////////////////////////////////////////////////////////////////////////&lt;br&gt;&lt;br&gt;            string errorXPath = &amp;quot;/my:myFields/my:ErrorMessage&amp;quot;;&lt;br&gt;&lt;br&gt;            //////////////////////////////////////////////////////////////////////////////&lt;br&gt;  &lt;br&gt;            XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;            XPathNavigator errorMessageField = xPathNav.SelectSingleNode(errorXPath, NamespaceManager);&lt;br&gt;&lt;br&gt;            LogComment(&amp;quot;Encountered error on form.&amp;quot;);&lt;br&gt;              errorMessageField.SetValue(errorMessage + &amp;quot;\n&amp;quot; + fullError);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private string FindCurrentUser()&lt;br&gt;        {&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                //Use Web Service to return information about the current user&lt;br&gt;                  ProfileService.UserProfileService profileService = new ProfileService.UserProfileService();&lt;br&gt;                profileService.UseDefaultCredentials = true;&lt;br&gt;                profileService.Url = SPContext.Current.Site.Url.ToString() + &amp;quot;/_vti_bin/UserProfileService.asmx&amp;quot;;&lt;br&gt;                  ProfileService.PropertyData[] userProps = null;&lt;br&gt;                try&lt;br&gt;                {&lt;br&gt;                    // Passing null to this method causes the profile of the current user to be returned.&lt;br&gt;                     userProps = profileService.GetUserProfileByName(null);&lt;br&gt;                 }&lt;br&gt;                catch (Exception ex)&lt;br&gt;                {&lt;br&gt;                    string errormessage = &amp;quot;Unable to get current user profile.&amp;quot;;&lt;br&gt;                    ReportError(errormessage, ex.Message.ToString());&lt;br&gt;                  }&lt;br&gt;                ProfileService.ValueData[] values = userProps[4].Values;//4th item is Preferred Name&lt;br&gt;                if (values.Length &amp;gt; 0)&lt;br&gt;                {&lt;br&gt;                    return values[0].Value.ToString();&lt;br&gt;                  }&lt;br&gt;                else&lt;br&gt;                {&lt;br&gt;                    return this.Application.User.UserName.ToString();&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;            catch (Exception ex)&lt;br&gt;            {&lt;br&gt;                  string errorMessage = &amp;quot;Error finding Preferred Name for current user.&amp;quot;;&lt;br&gt;                ReportError(errorMessage, ex.Message.ToString());&lt;br&gt;                return this.Application.User.UserName.ToString();//Default to returning username&lt;br&gt;              }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private void SaveForm(string folderXPath, string fileNameXPath, string nameXPath, string libraryName, bool submitToFolder)&lt;br&gt;        {&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;                  XPathNavigator folderField = xPathNav.SelectSingleNode(folderXPath, NamespaceManager);&lt;br&gt;&lt;br&gt;                FileSubmitConnection fs = (FileSubmitConnection)this.DataConnections[&amp;quot;Main submit&amp;quot;];&lt;br&gt;  &lt;br&gt;                //Check to see if Submit location ends with a /, if not, add one.&lt;br&gt;                if (fs.FolderUrl.EndsWith(&amp;quot;/&amp;quot;))&lt;br&gt;                { } //All clear&lt;br&gt;                else&lt;br&gt;                {&lt;br&gt;                      fs.FolderUrl = fs.FolderUrl.ToString() + &amp;quot;/&amp;quot;;&lt;br&gt;                }&lt;br&gt;&lt;br&gt;                if (fs.FolderUrl.Contains(folderField.Value.ToString()))//Sets right folder when saving immediately after submit&lt;br&gt;                  {&lt;br&gt;                }&lt;br&gt;                else&lt;br&gt;                {&lt;br&gt;                    if (submitToFolder)//If we are submitting to a folder, and the data conn isn&amp;#39;t pointed to it yet, do so now&lt;br&gt;                      {&lt;br&gt;                        fs.FolderUrl = fs.FolderUrl.ToString() + folderField.Value.ToString() + &amp;#39;/&amp;#39;;&lt;br&gt;                    }&lt;br&gt;                }&lt;br&gt;&lt;br&gt;                LogComment(&amp;quot;Saved the document.&amp;quot;);&lt;br&gt;  &lt;br&gt;                fs.Execute();&lt;br&gt;            }&lt;br&gt;            catch (Exception ex)&lt;br&gt;            {&lt;br&gt;                string errorMessage = &amp;quot;Error when saving existing document.&amp;quot;;&lt;br&gt;                ReportError(errorMessage, ex.Message.ToString());&lt;br&gt;              }&lt;br&gt;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private void SubmitForm(string folderXPath, string fileNameXPath, string nameXPath, string libraryName, bool submitToFolder)&lt;br&gt;        {&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                  XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;                XPathNavigator folderField = xPathNav.SelectSingleNode(folderXPath, NamespaceManager);&lt;br&gt;&lt;br&gt;                FileSubmitConnection fs = (FileSubmitConnection)this.DataConnections[&amp;quot;Main submit&amp;quot;];&lt;br&gt;  &lt;br&gt;                //Check to see if Submit location ends with a /, if not, add one.&lt;br&gt;                if (fs.FolderUrl.EndsWith(&amp;quot;/&amp;quot;))&lt;br&gt;                { } //All clear&lt;br&gt;                else&lt;br&gt;                {&lt;br&gt;                      fs.FolderUrl = fs.FolderUrl.ToString() + &amp;quot;/&amp;quot;;&lt;br&gt;                }&lt;br&gt;&lt;br&gt;                if (submitToFolder)//If we want to submit to a subfoler, set that folder now&lt;br&gt;                { fs.FolderUrl = fs.FolderUrl.ToString() + folderField.Value.ToString() + &amp;#39;/&amp;#39;; }&lt;br&gt;  &lt;br&gt;                //Generate a unique filename for our document&lt;br&gt;                string fileName = SetFileName(fileNameXPath, libraryName, nameXPath);&lt;br&gt;                LogComment(&amp;quot;Submitted document as &amp;quot; + fs.FolderUrl.ToString() + fileName);&lt;br&gt;  &lt;br&gt;                //Submit the document&lt;br&gt;                fs.Execute();&lt;br&gt;            }&lt;br&gt;            catch (Exception ex)&lt;br&gt;            {&lt;br&gt;                string errorMessage = &amp;quot;Error when trying to submit new document.&amp;quot;;&lt;br&gt;                  ReportError(errorMessage, ex.Message.ToString());&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private string SetFileName(string fileNameXPath, string libraryName, string nameXPath)&lt;br&gt;        {&lt;br&gt;            XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;              XPathNavigator fileNameField = xPathNav.SelectSingleNode(fileNameXPath, NamespaceManager);&lt;br&gt;            XPathNavigator nameField = xPathNav.SelectSingleNode(nameXPath, NamespaceManager);&lt;br&gt;&lt;br&gt;            //Create a filename based on the Name Field and Today&amp;#39;s Date&lt;br&gt;              string fileName = nameField.Value.ToString() + &amp;quot; - &amp;quot; + DateTime.Today.ToShortDateString();&lt;br&gt;            fileName = fileName.Replace(&amp;#39;/&amp;#39;, &amp;#39;-&amp;#39;);&lt;br&gt;&lt;br&gt;            //Check to see if a file with the same name already exists&lt;br&gt;              bool isDuplicate = CheckForDuplicateFileName(fileName, libraryName);&lt;br&gt;&lt;br&gt;            int x = 2;//If we have a duplicate, we&amp;#39;ll add -X to the filename, starting with 2&lt;br&gt;            while (isDuplicate)//Keep generating filename + X until we get a unique name&lt;br&gt;              {&lt;br&gt;                fileName = GenerateNewFileName(nameField.Value.ToString(), Convert.ToString(x));&lt;br&gt;                isDuplicate = CheckForDuplicateFileName(fileName, libraryName);&lt;br&gt;                x++;&lt;br&gt;              }&lt;br&gt;&lt;br&gt;            //Set File Name Field to our new File Name&lt;br&gt;            fileNameField.SetValue(fileName);&lt;br&gt;            &lt;br&gt;            //Return our filename&lt;br&gt;            return fileName;&lt;br&gt;        }&lt;br&gt;  &lt;br&gt;        private string GenerateNewFileName(string nameFieldValue, string x)&lt;br&gt;        {&lt;br&gt;            string newFileName = nameFieldValue + &amp;quot;-&amp;quot; + x + &amp;quot; - &amp;quot; + DateTime.Today.ToShortDateString();&lt;br&gt;              newFileName = newFileName.Replace(&amp;#39;/&amp;#39;, &amp;#39;-&amp;#39;);&lt;br&gt;            return newFileName;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private bool CheckForDuplicateFileName(string fileName, string libraryName)&lt;br&gt;        {&lt;br&gt;              bool foundduplicate = true;//Return value has to be created and returned outside the elevated security&lt;br&gt;&lt;br&gt;            //Elevated security sites can&amp;#39;t be opened with SPContext, open the site normally and get the GUID&lt;br&gt;              //Then open the site again with elevated privelages&lt;br&gt;            Guid siteGuid = new Guid();&lt;br&gt;            Guid webGuid = new Guid();&lt;br&gt;            using (SPSite getGuidSite = SPContext.Current.Site)&lt;br&gt;            {&lt;br&gt;                  using (SPWeb getGuidWeb = getGuidSite.OpenWeb())&lt;br&gt;                {&lt;br&gt;                    siteGuid = getGuidSite.ID;&lt;br&gt;                    webGuid = getGuidWeb.ID;&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;  &lt;br&gt;            SPSecurity.RunWithElevatedPrivileges(delegate()//Run with elevated privelages so we can find docs even if the current user doesn&amp;#39;t have access&lt;br&gt;            {&lt;br&gt;                using (SPSite mySite = new SPSite(siteGuid))&lt;br&gt;                  {&lt;br&gt;                    using (SPWeb myWeb = mySite.OpenWeb(webGuid))&lt;br&gt;                    {&lt;br&gt;                        SPList requestList = myWeb.Lists[libraryName];&lt;br&gt;                        SPQuery query = new SPQuery();&lt;br&gt;                          query.Query = &amp;quot;&amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef Name=&amp;#39;Title&amp;#39; /&amp;gt;&amp;lt;Value Type=&amp;#39;Text&amp;#39;&amp;gt;&amp;quot; + fileName + &amp;quot;.xml&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;&amp;quot;;&lt;br&gt;                        query.ViewAttributes = &amp;quot;Scope=\&amp;quot;Recursive\&amp;quot;&amp;quot;;//Search subfolders too&lt;br&gt;                          SPListItemCollection listItemColl = requestList.GetItems(query);&lt;br&gt;                        if (listItemColl.Count == 0)&lt;br&gt;                        {&lt;br&gt;                            foundduplicate = false;//No duplicates found&lt;br&gt;                          }&lt;br&gt;                        else&lt;br&gt;                        {&lt;br&gt;                            foundduplicate = true;//Found duplicate, we&amp;#39;ll need to create a new filename&lt;br&gt;                        }&lt;br&gt;                      }&lt;br&gt;                }&lt;br&gt;            });&lt;br&gt;&lt;br&gt;            return foundduplicate;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private void GetSubFolders(string libraryName, string folderChoicesFieldXPath)&lt;br&gt;        {&lt;br&gt;              ArrayList folderArray = GrabFolderList(libraryName);//Get a list of the folders&lt;br&gt;            PopulateFolders(folderArray, folderChoicesFieldXPath);//Use the folder list to populate our repeating field&lt;br&gt;        }&lt;br&gt;  &lt;br&gt;        private void PopulateFolders(ArrayList folderArray, string folderChoicesFieldXPath)&lt;br&gt;        {&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                //Attach to repeating field facility list&lt;br&gt;                XPathNavigator xPathNav = MainDataSource.CreateNavigator();&lt;br&gt;                  XPathNavigator Loc = xPathNav.SelectSingleNode(folderChoicesFieldXPath, this.NamespaceManager);&lt;br&gt;                Loc.SetValue(&amp;quot;&amp;quot;);&lt;br&gt;                XPathNavigator templateNode = Loc.Clone();&lt;br&gt;  &lt;br&gt;                //Loop through all facilities and add them to the repeating field&lt;br&gt;                for (int r = 0; r &amp;lt; folderArray.Count; r++)&lt;br&gt;                {&lt;br&gt;                    string value = folderArray[r].ToString();&lt;br&gt;                      XPathNavigator newNode = templateNode.Clone();&lt;br&gt;                    newNode.SetValue(value);&lt;br&gt;                    Loc.InsertBefore(newNode);&lt;br&gt;                }&lt;br&gt;                Loc.DeleteSelf();//Delete close used to populate list&lt;br&gt;              }&lt;br&gt;            catch (Exception ex)&lt;br&gt;            {&lt;br&gt;                string errorMessage = &amp;quot;Error when trying to populate folder List.&amp;quot;;&lt;br&gt;                ReportError(errorMessage, ex.Message.ToString());&lt;br&gt;              }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        private ArrayList GrabFolderList(string libraryName)&lt;br&gt;        {&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                ArrayList folderArray = new ArrayList();&lt;br&gt;                using (SPSite mySite = SPContext.Current.Site)&lt;br&gt;                  {&lt;br&gt;                    using (SPWeb myWeb = mySite.OpenWeb())&lt;br&gt;                    {&lt;br&gt;                        SPFolderCollection folders = myWeb.GetFolder(libraryName).SubFolders;&lt;br&gt;                        foreach (SPFolder currentFolder in folders)&lt;br&gt;                          {&lt;br&gt;                            if (currentFolder.Name.ToString() != &amp;quot;Forms&amp;quot;)//Grab every folder name except for Forms&lt;br&gt;                            {&lt;br&gt;                                folderArray.Add(currentFolder.Name.ToString());&lt;br&gt;                              }&lt;br&gt;                        }&lt;br&gt;&lt;br&gt;                    }&lt;br&gt;                }&lt;br&gt;                return folderArray;&lt;br&gt;            }&lt;br&gt;            catch (Exception ex)&lt;br&gt;            {&lt;br&gt;                  string errorMessage = &amp;quot;Error when trying to get sub folders from Library.&amp;quot;;&lt;br&gt;                ReportError(errorMessage, ex.Message.ToString());&lt;br&gt;                ArrayList emptyArray = new ArrayList();&lt;br&gt;                  return emptyArray;&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;/div&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-300227617283636179?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/300227617283636179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=300227617283636179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/300227617283636179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/300227617283636179'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/10/standard-submitsave-for-infopath.html' title='Standard Submit/Save for Infopath'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5410625587069808130</id><published>2009-07-17T11:24:00.001-04:00</published><updated>2009-07-17T11:24:43.122-04:00</updated><title type='text'>Using Queries to open files</title><content type='html'>This is pretty basic information, but I had trouble finding a simple code snippet outlining how this works.  Here is super short snippet that finds and opens a file by it&amp;#39;s Title field.  &lt;br&gt;&lt;br&gt;//Begin by opening your List&lt;br&gt; SPList docList = web.Lists[&amp;quot;Requests&amp;quot;];&lt;br&gt;&lt;br&gt;//Build your query.  In this example, fileName is the name of a file we&amp;#39;re already saved to the list&lt;br&gt;SPQuery query = new SPQuery();&lt;br&gt;query.Query = &amp;quot;&amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef Name=&amp;#39;Title&amp;#39; /&amp;gt;&amp;lt;Value Type=&amp;#39;Text&amp;#39;&amp;gt;&amp;quot; + fileName + &amp;quot;&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;&amp;quot;;&lt;br&gt; &lt;br&gt;//Now use your query to pull all the matching documents from our list.  &lt;br&gt;SPListItemCollection listItemColl = docList.GetItems(query);&lt;br&gt;&lt;br&gt;//In this example, we&amp;#39;re assumign that we&amp;#39;ll always only get a single document back.  &lt;br&gt; //In practice, you should check listItemColl.Count to ensure that you&amp;#39;re finding the doc.&lt;br&gt; SPListItem listItem = listItemColl.List.Items[0];&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;The meat of the snippet is the Query string: &amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef Name=&amp;#39;Title&amp;#39; /&amp;gt;&amp;lt;Value Type=&amp;#39;Text&amp;#39;&amp;gt;&amp;quot; + fileName + &amp;quot;&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;&lt;br&gt;I&amp;#39;d highly recommend downloading U2U&amp;#39;s CAML Builder to simplify building your query.  Just remember to strip out the &amp;lt;Query&amp;gt; tag U2U&amp;#39;s tool likes to insert.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5410625587069808130?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5410625587069808130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5410625587069808130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5410625587069808130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5410625587069808130'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/07/using-queries-to-open-files.html' title='Using Queries to open files'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5564335913385961104</id><published>2009-07-06T16:36:00.001-04:00</published><updated>2009-07-06T16:36:27.888-04:00</updated><title type='text'>Infopath Form Migration hints</title><content type='html'>&lt;div class="gmail_quote"&gt; &lt;div lang="EN-US" vlink="purple" link="blue"&gt; &lt;div&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Last week, my manager had me open a ticket with Microsoft to talk about Infopath form migration.  We've been finding that it is time-consuming to migrate a form designed on the test server to the staging or production servers.  &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Microsoft had some very good recommendations.  I've taken what they suggested and applied it to a purchase requisition form I&amp;#39;m working on.  &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt;It used to take me about 30 minutes to migrate my form to a new server.  Now all it takes is a 1 minute re-publish.  No other changes are necessary.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Data Sources&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;With the exception of the Submit data source, I'm trying not to use these anymore on my own forms.  Their major draw-back, in my opinion, is that you cannot tell what fields are using a Data Source without opening the Field Properties.  When you have a few hundred fields, this quickly becomes annoying.  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Begin by creating your Data Source as normal.  Once it has been created, open Tools…Data Sources.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Select the Data Source and click the Convert button.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;In the Window that pops up, you want to keep the Connection link type set to "Relative to Site Collection"&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Type in the following URL for the location &lt;a href="http://server/DataConn/XXXXX"&gt;http://Server/DataConn/XXXXX&lt;/a&gt;, where Server is the address of your Sharepoint Server, and DataConn is a Data Connection Library on that server.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Make sure that XXXXX is unique for your form and your data source.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;img border="0" src="cid:image005.png@01C9FE49.DB2B8560" width="391" height="285"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;That "Relative to site collection option" means that your form will look for a Library called DataConn in the root of whatever site it finds itself on.  This is what lets us move our forms from server to server.  &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Click OK and your Data Source will be converted into a file and uploaded to the DataConn library. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt;The DataConn library requires that new documents are Approved before they can be referenced.  Browse to the Library, find your new document and use the context menu to approve it.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;We now need to copy our new Data Source file to other servers where we want to use our form.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Begin by downloading a copy of the file.  Before we upload the file to the new server, we need to modify it so that the Data Source is pointed to the new server.  Luckily, the Data Source is just an XML file.  Open it using Notepad or any other Text Editor.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;You'll find that the references to the server are easy to find.  I've high-lighted them below.  Just change the references to the correct server path and save your changes.  &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;&amp;lt;?MicrosoftWindowsSharePointServices ContentTypeID=&amp;quot;0x010100B4CBD48E029A4ad8B62CB0E41868F2B0&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;&amp;lt;udc:DataSource MajorVersion=&amp;quot;2&amp;quot; MinorVersion=&amp;quot;0&amp;quot; xmlns:udc=&amp;quot;&lt;a href="http://schemas.microsoft.com/office/infopath/2006/udc" target="_blank"&gt;http://schemas.microsoft.com/office/infopath/2006/udc&lt;/a&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;udc:Name&amp;gt;Main submit&amp;lt;/udc:Name&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;udc:Description&amp;gt;Format: UDC V2; Connection Type: SharePointLibrary; Purpose: WriteOnly; Generated by Microsoft Office InfoPath 2007 on 2009-07-06 at 15:03:35 by CORP\kenna.&amp;lt;/udc:Description&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;udc:Type MajorVersion=&amp;quot;2&amp;quot; MinorVersion=&amp;quot;0&amp;quot; Type=&amp;quot;SharePointLibrary&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;udc:SubType MajorVersion=&amp;quot;0&amp;quot; MinorVersion=&amp;quot;0&amp;quot; Type=&amp;quot;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;/udc:Type&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;udc:ConnectionInfo Purpose=&amp;quot;WriteOnly&amp;quot; AltDataSource=&amp;quot;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;udc:WsdlUrl/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;udc:SelectCommand&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:ListId/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:WebUrl/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:ConnectionString/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:ServiceUrl UseFormsServiceProxy=&amp;quot;false&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:SoapAction/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:Query/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;/udc:SelectCommand&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;udc:UpdateCommand&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:ServiceUrl UseFormsServiceProxy=&amp;quot;false&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:SoapAction/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:Submit/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &amp;lt;udc:FileName&amp;gt;Specify a filename or formula&amp;lt;/udc:FileName&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                                &lt;span style="COLOR: #c0504d"&gt;&amp;lt;udc:FolderName AllowOverwrite=&amp;quot;0&amp;quot;&amp;gt;&lt;a href="http://serverAddress/LibraryName"&gt;http://serverAddress/LibraryName&lt;/a&gt;&amp;lt;/udc:FolderName&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;/udc:UpdateCommand&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                                &amp;lt;!--udc:Authentication&amp;gt;&amp;lt;udc:SSO AppId=&amp;#39;&amp;#39; CredentialType=&amp;#39;&amp;#39; /&amp;gt;&amp;lt;/udc:Authentication--&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;                &amp;lt;/udc:ConnectionInfo&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 8pt"&gt;&amp;lt;/udc:DataSource&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;This example is for a Submit Data Source.  Other Data Sources will look slightly different, and may have more than one field that needs updating.  If you're pulling data from a List, you may need to know the List GUID.  &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Now that you have your Data Source file updated, you just need to upload it the DataConn library on the new server and Approve it. Repeat for each server that you need to use your form on.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Web References in Code-Behind&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Next up were Web References being used with code-behind in our forms.  It turns out that these references can be easily fixed with a single additional line of code.  &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Begin by creating your Web Reference as usual.  Once created, take a look at the Web Reference properties.  You&amp;#39;ll see the URL being referenced.  This is what we&amp;#39;ll need to update on the new server.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt;In the case of my Purchase Req form, I'm calling the UserGroup web service that comes standard with Sharepoint.  The URL that is referenced,  /_vti_bin/usergroup.asmx, will exist on any Sharepoint server.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; COLOR: green; FONT-SIZE: 10pt"&gt;//Open current Site&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; COLOR: blue; FONT-SIZE: 10pt"&gt;using&lt;/span&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; (&lt;span style="COLOR: teal"&gt;SPSite&lt;/span&gt; mySite = &lt;span style="COLOR: teal"&gt;SPContext&lt;/span&gt;.Current.Site){&lt;span style="COLOR: green"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; COLOR: green; FONT-SIZE: 10pt"&gt;//Create Web Reference&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;GetGroupMembers.&lt;span style="COLOR: teal"&gt;UserGroup&lt;/span&gt; getUsersFromGroup = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; GetGroupMembers.&lt;span style="COLOR: teal"&gt;UserGroup&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; COLOR: green; FONT-SIZE: 10pt"&gt;//Redirect URL&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;getUsersFromGroup.Url = mySite.Url.ToString() + &lt;span style="COLOR: maroon"&gt;&amp;quot;/_vti_bin/usergroup.asmx&amp;quot;&lt;/span&gt;;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5564335913385961104?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5564335913385961104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5564335913385961104' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5564335913385961104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5564335913385961104'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/07/infopath-form-migration-hints.html' title='Infopath Form Migration hints'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6600282372637100378</id><published>2009-06-29T15:58:00.001-04:00</published><updated>2009-06-29T15:58:15.677-04:00</updated><title type='text'>Removing permissions from a Sharepoint list item</title><content type='html'>&lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;I recently came across an interesting problem while working on an Infopath form.  As part of the submission process, I needed to remove all the permissions from my new document.  This seemed easy to do using by calling Item.BreakRoleInheritence = true and then removing all the existing permissions from the item.&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;When I published my form, I found that my approach generated an error: &lt;/span&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;An exception of type &amp;#39;System.UnauthorizedAccessException&amp;#39; occurred in Microsoft.SharePoint.dll but was not handled in user code. &lt;/span&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;Additional information: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))&lt;/span&gt;&lt;/p&gt;  &lt;div style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;This error occured for any user who had Contribute access to the form library.  &lt;/span&gt;&lt;/div&gt;  &lt;div style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/div&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;After a bit of searching, I found this article: &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/c3d2b304-7fcc-40d2-86ce-61d9b21b03d7"&gt;&lt;font color="#0000ff"&gt;http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/c3d2b304-7fcc-40d2-86ce-61d9b21b03d7&lt;/font&gt;&lt;/a&gt;  Look for the reply made by Kjetil Gullen on July 27.&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;div style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;The answer lies with how the .BreakRoleInheritence interacts with web.AllowUnsafeUpdates = true.  I won't go into the full explanation as the poster does an excellent job, but below is a code snippet that shows how to do this correctly.&lt;/span&gt;&lt;/div&gt;  &lt;div style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                &lt;span style="COLOR: #2b91af"&gt;SPSecurity&lt;/span&gt;.RunWithElevatedPrivileges(&lt;span style="COLOR: blue"&gt;delegate&lt;/span&gt;()&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                    {&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;span style="COLOR: #2b91af"&gt;SPWeb&lt;/span&gt; _webInUserContext = &lt;span style="COLOR: #2b91af"&gt;SPContext&lt;/span&gt;.Current.Web;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;span style="COLOR: #2b91af"&gt;SPSite&lt;/span&gt; _siteInUserContext = &lt;span style="COLOR: #2b91af"&gt;SPContext&lt;/span&gt;.Current.Site;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;span style="COLOR: #2b91af"&gt;Guid&lt;/span&gt; _webGuid = _webInUserContext.ID;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;span style="COLOR: #2b91af"&gt;Guid&lt;/span&gt; _siteGuid = _siteInUserContext.ID;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SPSite&lt;/span&gt; _site = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SPSite&lt;/span&gt;(_siteGuid))&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        {&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            _site.AllowUnsafeUpdates = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;span style="COLOR: #9bbb59"&gt;//Allow Unsafe Updates for the Site&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            &lt;span style="COLOR: #2b91af"&gt;SPWeb&lt;/span&gt; _web = _site.OpenWeb(_webGuid);&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            _web.AllowUnsafeUpdates = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;span style="COLOR: #9bbb59"&gt;//Allow Unsafe Updates for the Web&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            &lt;span style="COLOR: #2b91af"&gt;SPList&lt;/span&gt; docList = _web.Lists[&lt;span style="COLOR: #a31515"&gt;&amp;quot;Requests&amp;quot;&lt;/span&gt;];&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            &lt;span style="COLOR: #2b91af"&gt;SPListItem&lt;/span&gt; itemListItem = docList.Items.GetItemById(itemListID);&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            itemListItem.Web.AllowUnsafeUpdates = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;span style="COLOR: #9bbb59"&gt;//Web as referenced by the item&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            itemListItem.BreakRoleInheritance(&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;);&lt;span style="COLOR: #9bbb59"&gt;//Break your inheritence&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            itemListItem.Web.AllowUnsafeUpdates = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;span style="COLOR: #9bbb59"&gt;//Breaking inheritence resets&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                                                                       &lt;span style="COLOR: #9bbb59"&gt;//Unsafe Updates, reenable it&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            &lt;span style="COLOR: #9bbb59"&gt;//Remove the permissions one by one&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;SPRoleAssignment&lt;/span&gt; spra &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; itemListItem.RoleAssignments)&lt;/span&gt;&lt;/p&gt;  &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            {&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                                spra.RoleDefinitionBindings.RemoveAll();&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                                spra.Update();&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                            }&lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        &lt;/span&gt;&lt;/p&gt; &lt;p style="MARGIN: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: &amp;#39;Courier New&amp;#39;; FONT-SIZE: 10pt"&gt;                        });}&lt;/span&gt;&lt;span style="FONT-FAMILY: &amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;; FONT-SIZE: 10pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;/span&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6600282372637100378?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6600282372637100378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6600282372637100378' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6600282372637100378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6600282372637100378'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/06/removing-permissions-from-sharepoint.html' title='Removing permissions from a Sharepoint list item'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5741880460753356703</id><published>2009-04-22T15:35:00.003-04:00</published><updated>2009-04-22T15:38:20.660-04:00</updated><title type='text'>Displaying a User's Sharepoint Profile Picture</title><content type='html'>&lt;div&gt;This week I was building a web part and needed to display the profile picture for a user.  I figured this would be easy enough to do, but as is usually the case with Sharepoint, I was wrong.  Several hours and multiple Google searches later, I put together a neat solution:&lt;/div&gt;  &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;UserProfileManager&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; profileManager = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 51);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 51);font-size:85%;" &gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;UserProfileManager&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;();&lt;/span&gt; &lt;p&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;UserProfile&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; userProfile = profileManager.GetUserProfile(loginName);&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;try&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;pictureURL = userProfile[&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"PictureURL"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;].Value.ToString();&lt;/span&gt;&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;catch&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;pictureURL = &lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"/_layouts/images/no_pic.gif"&lt;/span&gt;&lt;/span&gt;; &lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;p&gt;}&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5741880460753356703?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5741880460753356703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5741880460753356703' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5741880460753356703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5741880460753356703'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/04/displaying-users-sharepoint-profile.html' title='Displaying a User&apos;s Sharepoint Profile Picture'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7907279116088144738</id><published>2009-04-09T15:20:00.001-04:00</published><updated>2009-04-09T15:20:55.058-04:00</updated><title type='text'>New Utility Created - SPFormsMaintenance</title><content type='html'>I&amp;#39;ve just posted this to the CodePlex: &lt;a href="http://spformsutility.codeplex.com/"&gt;http://spformsutility.codeplex.com/&lt;/a&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;It&amp;#39;s a utility that I&amp;#39;m running overnight to activate new Infopath forms on our production server.  When an existing form is upgrading, IIS is restarted as part of the upgrade process.  I&amp;#39;ve been upgrading our forms on Production with a batch script, and wrote this to handle things more gracefully.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The utility verifies every form it finds, and only processes them if no errors are found.  Once upgraded on the server, the form is archived, and an email is sent to me letting me know what was done.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7907279116088144738?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7907279116088144738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7907279116088144738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7907279116088144738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7907279116088144738'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/04/new-utility-created-spformsmaintenance.html' title='New Utility Created - SPFormsMaintenance'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8152021955370683279</id><published>2009-02-19T16:20:00.001-05:00</published><updated>2009-02-19T16:20:54.498-05:00</updated><title type='text'>Infopath Coding</title><content type='html'>I&amp;#39;ve been working on some Infopath forms recently. &amp;nbsp;We&amp;#39;re rebuilding our Purchase Requisition system, which was previously a Notes Database as a Sharepoint site using several custom Infopath forms and workflows. &amp;nbsp;I&amp;#39;ve been working on the forms while D spends all his time on the workflows.&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;These are the first fairly complex forms I&amp;#39;ve built in Infopath, and have required some extensive code behind. &amp;nbsp;In particular, I needed to use some web service calls to allow the user to search for groups in our AD by keyword. &amp;nbsp;Once the matches came back, I then had to allow them to select a match and click a button to add the item to a new row in a repeating table.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;And that is what I&amp;#39;d been stuck on for the last two days. &amp;nbsp;How to add a new blank row to a repeating table to hold my new value. &amp;nbsp;I&amp;#39;d figured out how to add a new row very quickly, and that worked fine for the first 2 rows. &amp;nbsp;After that, though, every new row I added resulted in an additional copy of the first row.&lt;/div&gt; &lt;div&gt;So, I ended up with:&lt;/div&gt;&lt;div&gt;Value 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Value 1&lt;/div&gt;&lt;div&gt;Value 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Value 2&lt;/div&gt;&lt;div&gt;Value 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instead of &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value 3&lt;/div&gt;&lt;div&gt;Value 4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Value 4&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;It was very frustrating. &amp;nbsp;I searched all over, and found several different approaches, and couldn&amp;#39;t get any of them to work. &amp;nbsp;Finally, I stumbled on this &lt;a href="http://www.infopathdev.com/forums/t/8172.aspx?PageIndex=3"&gt;discussion&lt;/a&gt;. &amp;nbsp;And there was my salvation.&lt;/div&gt; &lt;div&gt;All I had to do is make sure that I used the .InsertBefore option, and then cleared my field values &lt;span class="Apple-style-span" style="font-style: italic;"&gt;after &lt;/span&gt;I added the new row to the table, not before.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;So, I after 2 days of banging my head against my desk, my solution turned out to be swapping the order 2 lines of code, and changing &amp;nbsp;.InsertAfter to .InsertBefore.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8152021955370683279?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8152021955370683279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8152021955370683279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8152021955370683279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8152021955370683279'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/02/infopath-coding.html' title='Infopath Coding'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8918852201608757192</id><published>2009-02-09T15:23:00.003-05:00</published><updated>2009-02-09T21:22:17.868-05:00</updated><title type='text'>Working with GridView</title><content type='html'>I was asked by our VP to create a simple web part that could display all the birthdays in the current month.&lt;div&gt;This was a simple enough project, so I quickly coded it up, and showed it to our Dev.  He pointed out that I had used Labels to add my names and birthdays to the web part and that it would make more sense to use a GridView.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That made sense, so I rewrote the web part.  When I displayed it, I thought my columns were too close together.  Now GridView gives you two ways to set column spacing .CellPadding and .CellSpacing.  Both of these affect all four directions: top, bottom, left and right.  I wanted just to set left or right, but couldn't find any way to do that.  &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did a search, and found several people asking the same question, and the advice that came back was to set the column spacing in CSS.  That didn't make me happy, as I prefer to keep everything in code so it is simpler to roll out later.  I know, I know, CSS should be used for layout, but that really doesn't make sense for a web part that is meant to be reused multiple times.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I asked our dev for more advice and he said, just set the padding to the individual cells.  Bingo!  I wrote the following to loop through all my cells in the first column and add some padding:&lt;/div&gt;&lt;div&gt; for (int x = 0; x &amp;lt; displayGrid.Rows.Count; x++)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;displayGrid.Rows[x].Cells[0].Attributes.CssStyle.Add(HtmlTextWriterStyle.PaddingRight, "20px");&lt;br /&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; That's a simple way to add some horizontal spacing to a GridView without affecting your Vertical spacing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8918852201608757192?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8918852201608757192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8918852201608757192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8918852201608757192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8918852201608757192'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/02/working-with-gridview.html' title='Working with GridView'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3699883604895213212</id><published>2009-02-03T14:52:00.000-05:00</published><updated>2009-02-03T14:53:01.333-05:00</updated><title type='text'>New version of Random Image web part</title><content type='html'>It&amp;#39;s been a long time since my last post. &amp;nbsp;The Holidays and a new job and manager have put my off my usual schedule. &amp;nbsp;Today I finally got around to looking at a problem with my Random Image web part that was first complained about in late November. &amp;nbsp;I&amp;#39;ve never been able to reproduce the problem on any of my servers (I&amp;#39;m up to 4 test environments at the moment) so I wasn&amp;#39;t sure where to even start to fix the problem.&lt;div&gt; Luckily, the user reporting the problem posted links to a couple of pages that described the problem and posted a fix. &amp;nbsp;I was able to implement the new code and a few minutes later had the new version posted. &amp;nbsp;You&amp;#39;ll find it at: &lt;a href="http://www.codeplex.com/randomimage2"&gt;http://www.codeplex.com/randomimage2&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Another reason I haven&amp;#39;t posted much is that I&amp;#39;ve been banging my head against another web part that I just can&amp;#39;t get to work. &amp;nbsp;I wanted to make simple Silverlight based slideshow web part. &amp;nbsp;There are a few examples out there on how to do this, but all of them attach the images to the project. &amp;nbsp;I wanted to point the web part to a Picture Library and generate the slide show from that.&lt;/div&gt; &lt;div&gt;It&amp;#39;s been a night-mare. &amp;nbsp;The web part portion of the project was very easy, and getting that web part to display a Silverlight control was also simple. &amp;nbsp;Getting silverlight to display the images has so far proved to be impossible. &amp;nbsp;A large part of that is that I cannot attach my debugger to the Silverlight code, which makes finding and fixing bugs ridiculously difficult.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;ve given myself two weeks off before I spend any more time on this project.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3699883604895213212?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3699883604895213212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3699883604895213212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3699883604895213212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3699883604895213212'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/02/new-version-of-random-image-web-part.html' title='New version of Random Image web part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2188304883809610723</id><published>2009-01-07T09:53:00.001-05:00</published><updated>2009-01-07T09:53:21.676-05:00</updated><title type='text'>Login trouble</title><content type='html'>Our VP was getting prompted to login to the sharepoint server.&amp;nbsp; This is odd, because we&amp;#39;ve set up our server as a Local Intranet site on all our clients, and IE is supposed to pass along login credentials for these sites.&amp;nbsp; After a bit of hunting, I found that his Windows account had a password stored for the server.&amp;nbsp; This is found under User Management in the Control Panel.&amp;nbsp; Removing the password fixed the log in problem.&lt;br&gt; &lt;br&gt;I&amp;#39;ve found a reference to this on the web.&amp;nbsp; Apparently when Windows has a password stored for a site, it uses that to try to login, and ignores the fact that the site is on the Intranet.&amp;nbsp; Annoying little bug, but easy to fix once you know what is happening.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2188304883809610723?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2188304883809610723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2188304883809610723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2188304883809610723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2188304883809610723'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2009/01/login-trouble.html' title='Login trouble'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-9212897528243842736</id><published>2008-11-03T13:51:00.001-05:00</published><updated>2008-11-03T13:51:48.270-05:00</updated><title type='text'>Posted Quest XML Builder utility</title><content type='html'>I just posted the utility I wrote for generating XML files for use with the Notes to Sharepoint migration tool by Quest Software.&lt;div&gt;You can download a copy here:&amp;nbsp;&lt;a href="http://www.codeplex.com/csvtoinfopath/Release/ProjectReleases.aspx?ReleaseId=19023"&gt;http://www.codeplex.com/csvtoinfopath/Release/ProjectReleases.aspx?ReleaseId=19023&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-9212897528243842736?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/9212897528243842736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=9212897528243842736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9212897528243842736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9212897528243842736'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/11/posted-quest-xml-builder-utility.html' title='Posted Quest XML Builder utility'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8223067610121242036</id><published>2008-10-27T15:50:00.001-04:00</published><updated>2008-10-27T15:50:25.494-04:00</updated><title type='text'>Wrote a new utility over the weekend</title><content type='html'>This isn&amp;#39;t something I&amp;#39;m going to post to Codeplex because it is just too specialized.&lt;div&gt;We&amp;#39;re currently using a tool from Quest software called Note Migrator for Sharepoint. &amp;nbsp;It helps you migrate data from Notes databases to Sharepoint sites. &amp;nbsp;One of the features allows you to import directly into Infopath forms.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, with Infopath migrations, you first need to build an XML document which includes lots of tags like:&amp;nbsp;&amp;lt;ppm:replace src=&amp;quot;AttachmentsAttachments&amp;quot; encode=&amp;quot;attachment&amp;quot; &amp;nbsp;/&amp;gt;. &amp;nbsp;There&amp;#39;s a different tag for every type of field. &amp;nbsp;The first file I built took me about an hour, not because it is difficult, but because of all the tedious copy/paste/edit routine involved.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This weekend, I built a little utility to help make the task easier. &amp;nbsp;It reads in all the Infopath XML tags, and displays them alphabetically. &amp;nbsp;You then select the field type for each, and enter the corresponding Notes field name. &amp;nbsp;When you have everything filled out, the utility generates the XML document for you and displays it so you can check it for errors. &amp;nbsp;If there&amp;#39;s a problem you can adjust your entries until everything looks right.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Today I tried it out, caught a few bugs that I&amp;#39;d missed over the weekend, and eventually was able to run a full import using the XML it generated. &amp;nbsp;There&amp;#39;s still a lot of copy/pasteing involved, but I&amp;#39;m much faster now. &amp;nbsp;Since we have something like 70 applications to migrate, every improvement helps.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8223067610121242036?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8223067610121242036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8223067610121242036' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8223067610121242036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8223067610121242036'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/10/wrote-new-utility-over-weekend.html' title='Wrote a new utility over the weekend'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1146458027613599250</id><published>2008-10-13T16:44:00.001-04:00</published><updated>2008-10-13T16:44:15.153-04:00</updated><title type='text'>Bug fix for Migration Tool uploaded</title><content type='html'>&lt;div dir="ltr"&gt;I wrote a CSV to Infopath migration tool ages ago and posted it to Codeplex. &amp;nbsp;At the time, I&amp;#39;d been tasked with migrating a Notes database to Sharepoint, and came up with an idea that I could dump the Notes database to a CSV file and rig together a tool to generate Infopath files based on that. &amp;nbsp;I spent a couple of weeks working on it after hours, and came up with something that worked.&lt;div&gt; Barely.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Then, the project went onto the back-burner, and we decided to go with the Notes to Sharepoint migration tool that Quest software makes. &amp;nbsp;I forgot about the project, and abandoned working it.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Last week, VP asked me about the original project that started all this. &amp;nbsp;I told him that the original site I&amp;#39;d built was gone, as I&amp;#39;d not migrated it when we moved our test server to new hardware. &amp;nbsp;He told me to rebuild the site, which I was quickly able to do, as I&amp;#39;d saved the Infopath templates I&amp;#39;d originally created. &amp;nbsp;I then fired up my migration tool, and found that....it was better than I&amp;#39;d remembered. &amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Don&amp;#39;t get me wrong, it&amp;#39;s a fairly limited tool (no file attachments, repeating field support is iffy at best) but it was very simple to use, and I was quickly able to migrate the 2,000 or so records from the database over to Sharepoint. &amp;nbsp;I then looked at the Codeplex site and discovered, to my surprise, that I had over 80 downloads. &amp;nbsp;I also had a bug report from early September that I hadn&amp;#39;t noticed. &amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I quickly reproduced the bug, and wrote a fix for it. &amp;nbsp;I&amp;#39;ve just posted this new version. &amp;nbsp;I&amp;#39;ve also decided that the tool is good enough that it deserves some more work. &amp;nbsp;I&amp;#39;m going to rewrite it to get rid of some of my more atrocious design flaws. &amp;nbsp;For example, I&amp;#39;m currently writing every file twice. &amp;nbsp;The first time, writes a copy of a blank file. &amp;nbsp;I then read the file I&amp;#39;ve just written, edit it, then write it again, replacing the original file. &amp;nbsp;Yes, I&amp;#39;m aware now that this is completely insane.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;So, I think I have the makings of a pretty good, and valuable tool. &amp;nbsp;The foundation isn&amp;#39;t the best, but I should be able to rework that pretty easily. &amp;nbsp;The basic approach and interface are pretty good though, I think. &amp;nbsp;I don&amp;#39;t think I&amp;#39;ll ever be able to handle file attachments, but for simple migrations, this could be a very useful bit of software.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If you want to download the current version, it&amp;#39;s available at&amp;nbsp;&lt;a href="http://www.codeplex.com/csvtoinfopath"&gt;http://www.codeplex.com/csvtoinfopath&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1146458027613599250?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1146458027613599250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1146458027613599250' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1146458027613599250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1146458027613599250'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/10/bug-fix-for-migration-tool-uploaded.html' title='Bug fix for Migration Tool uploaded'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3279646145199001481</id><published>2008-10-07T15:52:00.001-04:00</published><updated>2008-10-07T15:52:07.414-04:00</updated><title type='text'>New version of SPWakeUp just posted</title><content type='html'>&lt;div dir="ltr"&gt;As usual, you&amp;#39;ll find it at: &lt;a href="http://www.codeplex.com/spwakeup"&gt;http://www.codeplex.com/spwakeup&lt;/a&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This new version is just a bug fix, no new features. &amp;nbsp;I&amp;#39;d been noticing that on my production server, I was seeing waaaay too many MySites. &amp;nbsp;Turns out the script that was checking for Site Collections was badly broken. &amp;nbsp;Nothing to cause any serious problems, but it was generating URLs that just didn&amp;#39;t exist, and processing the same Web App hundreds of times. &amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The fix turned out to be one line of code. &amp;nbsp;While I was at it, I did some general clean-up of the logging stuff, and changed the descriptions to make it obvious when a URL is a Site Collection and when it is a Sub Web.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Here&amp;#39;s how I described the fix on the CodePlex site:&lt;/div&gt;&lt;div&gt;SPWakeup works by building a list of web applications on a server, then checks  each web app for all its Site Collections, then checks each Site Collection for  all its Sub Webs. This bug arose from the code that checked Web Apps for Site  Collections.&lt;br&gt;I pull a list of Site Collections by first building a new web  app instance using the URL of the current listed Web App: SPWebApplication  webApp = new SPSite(pullcurrentsite).WebApplication;&lt;br&gt;&lt;br&gt;The problem here is  my initial web app list also includes some Site Collections. So my list looks  like  this:&lt;br&gt;&lt;a href="http://webapp"&gt;http://webapp&lt;/a&gt;&lt;br&gt;&lt;a href="http://webapp/sitecollection1"&gt;http://webapp/sitecollection1&lt;/a&gt;&lt;br&gt;&lt;a href="http://webapp/sitecollection2"&gt;http://webapp/sitecollection2&lt;/a&gt;&lt;br&gt;etc&lt;br&gt;&lt;br&gt;When  I create my new WebApp instance in the code above, I pull the current URL from  my list. Since I&amp;#39;m building a Web App, it ignores the Site Collection portion of  the URL, and just uses the webapp. That means that I end up processing the same  web app multiple times. &lt;br&gt;&lt;br&gt;I got around this by just doing a list.Contains  check before building the webapp. That prevents the webapp from being scanned  more than once. Which speeds things up considerably, and prevents those  non-existent URLs from being created.&lt;br&gt;&lt;br&gt;&lt;br&gt;I also cleaned up some of the  logging code, and eliminated an if/else statement that was never being called.&lt;br&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3279646145199001481?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3279646145199001481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3279646145199001481' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3279646145199001481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3279646145199001481'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/10/new-version-of-spwakeup-just-posted.html' title='New version of SPWakeUp just posted'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5611274577434115804</id><published>2008-09-29T17:13:00.001-04:00</published><updated>2008-09-29T17:13:54.648-04:00</updated><title type='text'>New versions of pretty much everything</title><content type='html'>&lt;div dir="ltr"&gt;I&amp;#39;ve just posted new versions of my Random Image web part, and Random Image Smart Part web part. &amp;nbsp;I&amp;#39;m working on the Drop Down Menu Filter web part, and should have it posted tomorrow. &amp;nbsp;The reason for all this was finding a bug that prevented adding more than one Random Image web part to a page. &amp;nbsp;Turns out I&amp;#39;d forgotten to dispose of my Site Collection. &amp;nbsp;&lt;div&gt; So, as part of the bug fix, I migrated the projects to Visual Studio 2008. &amp;nbsp;I should have everything finished tomorrow, unless my afternoon gets busy. &amp;nbsp; &amp;nbsp;With any luck, I&amp;#39;ll also have time to fix the bug I&amp;#39;ve found with SPWakeup that pops up when you don&amp;#39;t have access to a subsite.&lt;/div&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5611274577434115804?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5611274577434115804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5611274577434115804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5611274577434115804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5611274577434115804'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/new-versions-of-pretty-much-everything.html' title='New versions of pretty much everything'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-698903537048936928</id><published>2008-09-23T12:23:00.001-04:00</published><updated>2008-09-23T12:23:36.871-04:00</updated><title type='text'>Trouble with Immediate Alerts job on my test box</title><content type='html'>&lt;div dir="ltr"&gt;We&amp;#39;re about to do a test run of the Emergency Preparedness sites I&amp;#39;ve built. &amp;nbsp;Tomorrow, we&amp;#39;ll be pretending there is a fire at one of our hospitals to test how well the email alerts work, and to see what problems people run into with the site.&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;d been avoiding turning on email alerts because I didn&amp;#39;t want to bother anyone with all the test documents I was generating, trying things out. &amp;nbsp;Now that I was less than 24 hours from the test, I decided to turn them on for myself, just to test that everything was OK. &amp;nbsp;Good thing I did. &amp;nbsp;Alerts on this test server were broken.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Luckily, I was able to easily find a fix from this site: &amp;nbsp;&lt;a href="http://cairocafe.blogspot.com/2008/05/moss-2007-alerts-demystified.html"&gt;http://cairocafe.blogspot.com/2008/05/moss-2007-alerts-demystified.html&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Turns out, you just need to re-add the timer job from the command line. &amp;nbsp;Here&amp;#39;s the actual fix:&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size: 78%;"&gt;stsadm.exe -o setproperty -url &lt;a href="http://mywss30server/mysite"&gt;http://server.mycompany.com&lt;/a&gt;&amp;nbsp;-pn alerts-enabled -pv true&lt;br&gt; &lt;/span&gt;&lt;span style="font-size: 78%;"&gt;stsadm.exe -o setproperty -url &lt;/span&gt;&lt;a href="http://mywss30server/mysite"&gt;&lt;span style="font-size: 78%;"&gt;http://server.mycompany.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 78%;"&gt;&amp;nbsp;-pn job-immediate-alerts -pv &amp;quot;every 2 minutes&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 10px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 10px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-698903537048936928?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/698903537048936928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=698903537048936928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/698903537048936928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/698903537048936928'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/trouble-with-immediate-alerts-job-on-my.html' title='Trouble with Immediate Alerts job on my test box'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4811369701510766778</id><published>2008-09-22T13:34:00.001-04:00</published><updated>2008-09-22T13:34:41.285-04:00</updated><title type='text'>New version of SPWakeUp</title><content type='html'>&lt;div dir="ltr"&gt;The new version adds the option to exclude sites. &amp;nbsp;It took me a little longer than I expected to add this feature. &amp;nbsp;My first approach was to build an ArrayList of exclude sites. &amp;nbsp;Then, I just put and if/else check around every attempt to add a site to the wake-up list. &amp;nbsp;&lt;div&gt; This worked fine for exact matches, but sub-sites were sneaking through. &amp;nbsp;For example, if I&amp;#39;m blocking &lt;a href="http://www.server.com/mysite"&gt;www.server.com/mysite&lt;/a&gt; then &lt;a href="http://www.server.com/mysite/userA"&gt;www.server.com/mysite/userA&lt;/a&gt; would be allowed. &amp;nbsp;Turns out I&amp;#39;d been a bit lazy. &amp;nbsp;My if statement was just if (excludeList.Contains(currentsite)). &amp;nbsp;Seems, OK, right? &amp;nbsp;The problem is that the ArrayList.Contains method only returns on exact matches. &amp;nbsp;The fix is the iterate through my exclude list and plug each entry into a string, then use the string.Contains method instead. &amp;nbsp;The string.Contains method returns true on substring matches, so as long as the first part of the URL is a match, you&amp;#39;ll catch the sub-site.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;ve got my first bug report. &amp;nbsp;Apparently spwakeup is failing on servers that use Forms Authentication. &amp;nbsp;Since I don&amp;#39;t have any test servers or even production servers that use Forms Authentication this is going to be tricky to fix. &amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;As usual, you&amp;#39;ll find the lastest version on &lt;a href="http://www.codeplex.com/SPWakeUp"&gt;http://www.codeplex.com/SPWakeUp&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4811369701510766778?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4811369701510766778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4811369701510766778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4811369701510766778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4811369701510766778'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/new-version-of-spwakeup_22.html' title='New version of SPWakeUp'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7166401773081161640</id><published>2008-09-16T16:09:00.002-04:00</published><updated>2008-09-16T20:54:26.286-04:00</updated><title type='text'>Infopath forms and hidden buttons</title><content type='html'>&lt;span style="font-family:sans-serif;font-size:85%;"&gt;I've been building som&lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;e forms for a site called Emergency Preparedness this week.  One of the things I wanted to do with the form was get rid of the button bar at the top and bottom and replac&lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;e them with a couple of simple buttons.  I decided I wanted a button that said Submit when someone first created out a document, and Save Changes when they were editing an existing document.  It wasn't immediately obvious how to do this, so I wanted to write down how I accomplished it.&lt;/span&gt;&lt;br /&gt;&lt;div dir="ltr"&gt;&lt;div class="gmail_quote"&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;I started by creating two new fields for my form called NewDocument and FileName.  I didn't add these to the layout of the form, so they won't appear when creating a document.  Next I added two buttons, side by side at the bottom of the form, one labelled Submit, the other Save Changes.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBUXnCIyTI/AAAAAAAAAGk/4Y3CZ1j3Ybg/s1600-h/noname.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBUXnCIyTI/AAAAAAAAAGk/4Y3CZ1j3Ybg/s200/noname.gif" alt="" id="BLOGGER_PHOTO_ID_5246786330478299442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;I set the Submit button to be invisible when the field NewDocument was&lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt; set to "No".  I set the Sav&lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;e Change button to be invisible when the field NewDocument was set to anything other than "No".&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBUj1d_BJI/AAAAAAAAAGs/sUkNLRn50IA/s1600-h/2.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBUj1d_BJI/AAAAAAAAAGs/sUkNLRn50IA/s200/2.gif" alt="" id="BLOGGER_PHOTO_ID_5246786540511626386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;I then created a submit option for the form that pointed to the document library I wanted to use, and set the file name to value of the field FileName.  I made sure to check the Allow overwrite if file exists box.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CkvVbJNTM4g/SNBUthonZ4I/AAAAAAAAAG0/1ZstdZgTZPI/s1600-h/3.gif"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_CkvVbJNTM4g/SNBUthonZ4I/AAAAAAAAAG0/1ZstdZgTZPI/s200/3.gif" alt="" id="BLOGGER_PHOTO_ID_5246786706986198914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;Now it was time to wire up the buttons.  On the Submit button, I set the following &lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;rules:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CkvVbJNTM4g/SNBU449ikEI/AAAAAAAAAG8/TjwVFiB7wgY/s1600-h/4.gif"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_CkvVbJNTM4g/SNBU449ikEI/AAAAAAAAAG8/TjwVFiB7wgY/s200/4.gif" alt="" id="BLOGGER_PHOTO_ID_5246786902226538562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;Notice that clicking this button sets the FileName field to the current date+time.  I'll probably up&lt;/span&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;date this to include some information from other fields or the submitter's name, but using the now() option ensures I get a unique file name.  The button then sets the NewDocument field to No and then submits the form using the submit option I've already created.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBVCwAj-AI/AAAAAAAAAHE/gGcXqTsh6ho/s1600-h/5.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBVCwAj-AI/AAAAAAAAAHE/gGcXqTsh6ho/s200/5.gif" alt="" id="BLOGGER_PHOTO_ID_5246787071621986306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;Less happens on the Save Changes button because all we're doing is saving an existing document.  Remember that our Submit option pulls the name of the file from the field FileName.  This field was set when the document was first created, so we end up using the same file name...which means that we overwrite the existing file.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;So we end up with a form that displays the Submit button when it is first created, and Save Changes every time it is opened after that. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;This isn't the only way to do this, of course.  You could create a single button, and then use conditional formatting to change the text shown on the button, and the rules that run when the button is pressed.  For that matter, I don't really need the NewDocument field, instead I could key off of whether the FileName field was blank. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:sans-serif;font-size:85%;"&gt;But, I like this approach because it is simple, and easy to follow.  It should be easy for anyone to look at it and figure out how it all works if something needs to be updated in the future.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7166401773081161640?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7166401773081161640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7166401773081161640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7166401773081161640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7166401773081161640'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/infopath-forms-and-hidden-buttons_16.html' title='Infopath forms and hidden buttons'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CkvVbJNTM4g/SNBUXnCIyTI/AAAAAAAAAGk/4Y3CZ1j3Ybg/s72-c/noname.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6789416688398740931</id><published>2008-09-15T13:52:00.001-04:00</published><updated>2008-09-16T21:01:12.893-04:00</updated><title type='text'>SPWakeup fixes and a new feature</title><content type='html'>&lt;div dir="ltr"&gt;I just released another new version of SPWakeup.  Download a copy here:  &lt;a href="http://www.codeplex.com/spwakeup"&gt;http://www.codeplex.com/spwakeup&lt;/a&gt;&lt;br /&gt;This new version fixes a bunch of bugs that popped up in the last version.  The biggest of which was causing it to crash on some servers when run against localhost.  I've got 3 test servers and 1 production farm available to me.  The script worked on all but one of them.  So, lucky for me it crashed on one of my own boxes.  It would have made fixing the bug much harder if I never got to see the error.&lt;br /&gt;&lt;br /&gt;I've also added a new runtime option called -discover.  This tells the script to search the server looking for all the local web applications.  It's pretty nifty, and I think in the next version, I'll turn it on by default. &lt;br /&gt;&lt;br /&gt;The next option I want to add is something suggested on the app discusion page...a way to ignore sites.  It shouldn't be a problem to add this, as I'm already pulling out duplicates, I just need to decide the best way to set an ignore list.  My first impulse is to copy the current -site/sites.conf approach with -igore:/ignore.conf.  So, if you wanted to ignore a single site, you'd run spwakeup.exe -ignore:http://&lt;a href="http://site.domain.com/"&gt;site.domain.com&lt;/a&gt;.  If you wanted to ignore a bunch of sites, you'd list them in a text file called ignore.conf. &lt;br /&gt;&lt;br /&gt;I'm going to think on this for a day or two before committing myself. &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6789416688398740931?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6789416688398740931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6789416688398740931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6789416688398740931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6789416688398740931'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/spwakeup-fixes-and-new-feature.html' title='SPWakeup fixes and a new feature'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6690311781304667991</id><published>2008-09-13T13:52:00.004-04:00</published><updated>2008-09-13T14:12:59.724-04:00</updated><title type='text'>A new version of SPWakeup</title><content type='html'>I've finally gotten around to updating this app.   SPWakeup was the first .Net application I've ever written, and as such, was written just as I'd write a Perl script.  Specifically, it ignored all the Sharepoint hooks that .Net gives you and just shells out the command line.&lt;br /&gt;&lt;br /&gt;I could have done this app with batch scripting to be honest, and only wrote it in C# as a way to get my feet wet.  As a result, it was pitifully slow.  I timed it waking my test box from a cold start, and it took nearly 3 minutes just to crawl the server building the list of sites.&lt;br /&gt;&lt;br /&gt;So, ever since I released it, I've been wanting to rewrite it, but I got busy with other things.  I'm not a programmer by trade, and administration has a way of filling your days.  Long story short, things slowed up in the last month or so, and I got drawn into writing some Web Parts, which was a lot of fun, and taught me more of the Sharepoint options that .Net gives you.&lt;br /&gt;&lt;br /&gt;On Friday, I was supposed to be working with a department head to customize a site, but she bailed on me, so I found myself with an empty afternoon.   I copied the spwakeup project folder over to my dev machine and started to work.  Most of the program I was able to keep unaltered -- the HTML fetcher, the logging, the initialization of the app.   I concentrated on the functions that found the Site Collections and then searched through each Site Collection looking for Sub Sites.&lt;br /&gt;&lt;br /&gt;By the end of the day, my rewrite was running more or less error free.  I headed home, and spent another couple of hours polishing up a few rough edges and putting in some error catching.  The result is a much, much faster application.  The time it takes to parse the site list has dropped to just a few seconds on my test box.&lt;br /&gt;&lt;br /&gt;I still have some work to do, especially with how the script handles being pointed at http://localhost, and how it reacts when it finds a Sub Site it doesn't have access to.  But, the new version is much better than the old, I think.&lt;br /&gt;&lt;br /&gt;Tell me what you think.  You can download a copy from &lt;a href="http://www.codeplex.com/spwakeup"&gt;http://www.codeplex.com/spwakeup&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6690311781304667991?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6690311781304667991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6690311781304667991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6690311781304667991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6690311781304667991'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/new-version-of-spwakeup.html' title='A new version of SPWakeup'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3097397842613504935</id><published>2008-09-08T16:06:00.001-04:00</published><updated>2008-09-08T16:06:56.820-04:00</updated><title type='text'>Yet another Random Image rewrite</title><content type='html'>&lt;div dir="ltr"&gt;Hopefully, this will be the last. &amp;nbsp;I&amp;#39;ve been getting a Virtual Machine running on my laptop for dev work. &amp;nbsp;This way I won&amp;#39;t need to cycle IIS on our shared test server so often, which was starting to annoy people. &amp;nbsp;&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;I had a bit of trouble migrating what I&amp;#39;d already written to Visual Studio on my new virtual server, so I just created a new web part and pasted my code in. &amp;nbsp;I did a bit of house-cleaning on what I&amp;#39;d written. &amp;nbsp;The biggest change was getting rid of an array I&amp;#39;d been using to store the filenames of all the images. &amp;nbsp;I reasoned that this would slow things down if the web part was pointed to a library with hundreds of images. &amp;nbsp;Now I&amp;#39;m just getting a count total and grabbing one at random.&amp;nbsp;&lt;/div&gt; &lt;div&gt;Here&amp;#39;s the snippet in question:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random randomnumber = new Random();&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pic = randomnumber.Next(allItems.Count);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = siteaddress + &amp;quot;/&amp;quot; + (string)allItems[pic].Url;&lt;br&gt; &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;ve also added a new bit that sets the images Alt tag to the Title of the image. &amp;nbsp;I wanted to do something with the URL that the image links to, but I have figured that one out yet.&lt;/div&gt;&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;You can download a copy from&amp;nbsp;&lt;a href="http://www.codeplex.com/randomimage2"&gt;http://www.codeplex.com/randomimage2&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3097397842613504935?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3097397842613504935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3097397842613504935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3097397842613504935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3097397842613504935'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/yet-another-random-image-rewrite.html' title='Yet another Random Image rewrite'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7398064626720502490</id><published>2008-09-04T16:24:00.001-04:00</published><updated>2008-09-04T16:24:43.541-04:00</updated><title type='text'>Rewrote the Random Image Web Part</title><content type='html'>&lt;div dir="ltr"&gt;I did a quick rewrite of the Random Image Web Part today. &amp;nbsp;It now no longer relies on the Smart Part, but is a stand-alone web part. &amp;nbsp;It was a surprisingly easy change to make. &amp;nbsp;In the end I only needed to add 1 line of code, and change 1 line of code. &amp;nbsp;I&amp;#39;ve put this new version up on CodePlex here:&amp;nbsp;&lt;a href="http://www.codeplex.com/randomimage2"&gt;http://www.codeplex.com/randomimage2&lt;/a&gt;&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;I was originally going to keep both versions under the same project, but decided it would be confusing keeping the two version&amp;nbsp;separate. &amp;nbsp;Since the two versions are so similar, I&amp;#39;m going to try to keep their released versions synchronized. &amp;nbsp;&lt;/div&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7398064626720502490?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7398064626720502490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7398064626720502490' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7398064626720502490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7398064626720502490'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/rewrote-random-image-web-part.html' title='Rewrote the Random Image Web Part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4079209726894619255</id><published>2008-09-03T16:54:00.002-04:00</published><updated>2008-09-04T19:17:08.493-04:00</updated><title type='text'>Random Image Web Part up on Codeplex</title><content type='html'>&lt;div dir="ltr"&gt;I've just released by Random Image web part on the Codeplex.  Here's a link: &lt;a href="http://www.codeplex.com/randomimage"&gt;http://www.codeplex.com/randomimage&lt;/a&gt;&lt;div&gt;This is a very, very simple web part that displays a random image from a picture library every time it is refreshed.  It is based on the Smart Part web part created by Jan Tielens.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm uploading it mostly because I haven't seen anything similar available for download, but also because I think it might be helpful for other people trying to figure out how to create web parts for Sharepoint.  &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been having trouble finding good examples out there that clearly show how to do simple things like: Get and set a property for a web part; Access files from within a library; Pass filters to other web parts.  What I've tried to do with the web parts I've built is comment each section as clearly as I can, so that it's obvious how each bit of code works.  &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I mostly do this for myself because, to be honest, I'm still learning.  If I don't comment what I've done, and comment it excessively, I'm liable to forget how I've done something.  Hopefully my example will help other people out there trying to wrap there head around the same problems.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4079209726894619255?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4079209726894619255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4079209726894619255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4079209726894619255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4079209726894619255'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/random-image-web-part-up-on-codeplex.html' title='Random Image Web Part up on Codeplex'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1440284488303796427</id><published>2008-09-03T14:37:00.001-04:00</published><updated>2008-09-03T14:37:21.929-04:00</updated><title type='text'>Fixed a bug with Random Image Web Part</title><content type='html'>&lt;div dir="ltr"&gt;&lt;div&gt;The original version didn&amp;#39;t work with image libraries located in sub-site collections. (Any site collection that wasn&amp;#39;t the root site collection) &amp;nbsp;This isn&amp;#39;t a problem with my production server, because everything on that server is held in one site collection. &amp;nbsp;It was breaking on our test servers though, where we&amp;#39;ve used multiple site collections to keep design changes from bleeding over. &amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The fix was very simple, and that was to pull the name of the current site collection, and use that to build the URL. &amp;nbsp;&lt;/div&gt;&lt;div&gt;Here are the 2 lines of code that made the fix:&lt;/div&gt;&lt;div&gt;I added this line:&lt;/div&gt; &lt;div&gt;string collection = SPContext.Current.Site.Url;&lt;/div&gt;&lt;div&gt;Then updated the string called image to include the site collection in the URL.&lt;/div&gt;&lt;div&gt;string image = collection + &amp;quot;/&amp;quot;+ (string)imagelist[pic];&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;m finding that a major drawback of the Smart Part is that you seem to loose the ability to attach the debugger. &amp;nbsp;That makes fixing fiddly little problems like this more difficult, as you&amp;#39;re reduced to trial and error.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;(Or am I wrong about not being able to attach the debugger to my process? &amp;nbsp;Anyone know?)&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1440284488303796427?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1440284488303796427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1440284488303796427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1440284488303796427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1440284488303796427'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/09/fixed-bug-with-random-image-web-part.html' title='Fixed a bug with Random Image Web Part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4621140323344788270</id><published>2008-08-28T16:43:00.001-04:00</published><updated>2008-08-28T16:43:25.516-04:00</updated><title type='text'>Random Image Web Part</title><content type='html'>&lt;div dir="ltr"&gt;On our production site, we have a random image that is displayed showing pictures of our various hospitals.&amp;nbsp; We purchased a copy of Data Springs Flash Image rotater, but have never been happy with it.&amp;nbsp; The flash image sometimes appears blank when the client&amp;#39;s flash player is of the wrong version, or it&amp;#39;s cache gets out of wack.&lt;br&gt; &lt;br&gt;Today I decided to write a new random image web part, using the excellent Smart Part web part written by Jan Tielens.&amp;nbsp; It turned out to be a fairly easy excercise, and I was able to get the whole thing running after about two hours work.&amp;nbsp; The only difficult part was figuring out why the web part kept adding /UserControls/ to my image URLs and dealing with it.&lt;br&gt; &lt;br&gt;This web part displays a random image every time the page is loaded.&amp;nbsp; You configure it by specifying the Picture Library you want to use as the source for the pictures.&amp;nbsp; I need to add some error-checking code to handle missing Libraries and incorrect file types, but even as is, it seems to work fine.&lt;br&gt; &lt;br&gt;Here is the code:&lt;br&gt;&lt;br&gt;using System;&lt;br&gt;using System.Data;&lt;br&gt;using System.Configuration;&lt;br&gt;using System.Collections;&lt;br&gt;using System.Web;&lt;br&gt;using System.Web.Security;&lt;br&gt;using System.Web.UI;&lt;br&gt;using System.Web.UI.WebControls;&lt;br&gt; using System.Web.UI.WebControls.WebParts;&lt;br&gt;using System.Web.UI.HtmlControls;&lt;br&gt;using Microsoft.SharePoint.WebControls;&lt;br&gt;using Microsoft.SharePoint;&lt;br&gt;using Microsoft.SharePoint.WebPartPages;&lt;br&gt;using Microsoft.SharePoint.WebPartPages.Communication;&lt;br&gt; using System.Collections.Generic;&lt;br&gt;using System.Text.RegularExpressions;&lt;br&gt;&lt;br&gt;public partial class RandomImage : System.Web.UI.UserControl&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _libname = null;//Name of ImageLibrary&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ArrayList imagelist = new ArrayList(); &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /// Grab name of List and Column used to populate dropdown list.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [WebBrowsable(true),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebDisplayName(&amp;quot;Image Library Name&amp;quot;),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebDescription(&amp;quot;Please specify which Image Library contains the pictures you want to display.&amp;quot;),&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; Personalizable(PersonalizationScope.Shared)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string NameofLibrary&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return this._libname; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { this._libname = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_libname != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Open the current web site&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb site = SPContext.Current.Web;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Open the specified list&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList list = site.Lists[NameofLibrary];&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItemCollection allItems = list.Items;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SPListItem currentitem in allItems)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagelist.Add(currentitem.Url);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random randomnumber = new Random();&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int pic = randomnumber.Next(imagelist.Count -1);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string image = (string)imagelist[pic];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image = Image1.ResolveClientUrl(image);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image = image.Replace(&amp;quot;UserControls/&amp;quot;, &amp;quot;&amp;quot;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Image1.ImageUrl = image;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Image1.Visible = true;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4621140323344788270?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4621140323344788270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4621140323344788270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4621140323344788270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4621140323344788270'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/08/random-image-web-part.html' title='Random Image Web Part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6334134217880578174</id><published>2008-08-25T15:25:00.000-04:00</published><updated>2008-08-25T15:30:50.542-04:00</updated><title type='text'>Making a connectible web part</title><content type='html'>&lt;div dir="ltr"&gt;For the last couple of days, I&amp;#39;ve been working on creating a custom web part to use as a filter.&amp;nbsp; I had no problems getting the web part created, and even reading in values from a Sharepoint list to populate a drop-down menu.&amp;nbsp; What I had trouble with was configuring my web part to act as a connection provider. &lt;br&gt; &lt;br&gt;All the examples I found via Google were written to create a Provider and Consumer web part and connect them to each other.&amp;nbsp; I couldn&amp;#39;t find anything that explained how to create a provider that could be connected to a generic list web part.&amp;nbsp; Finally today, I stumbled on a new approach, and was able to get my connection working with some help from D.&lt;br&gt; &lt;br&gt;Here&amp;#39;s what I ended up with:&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;(snipped out a bunch of code to get to the good stuff)&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//This First bit creates your connection provider and gives it a name&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br&gt; [ConnectionProvider(&amp;quot;Department&amp;quot;, &amp;quot;Text&amp;quot;)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ITransformableFilterValues SetConnectionInterface()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//The following section just lists out the various properties that your connection&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//can have.&amp;nbsp; Most of them just return true or false.&amp;nbsp; Most are self-explanatory.&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool AllowAllValue&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {return true ; }&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool AllowEmptyValue &lt;span style="color: rgb(0, 153, 0);"&gt;//This is really useful. It means that you don&amp;#39;t have to return a filter value if you don&amp;#39;t want to.&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return true; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool AllowMultipleValues&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {return false; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//This is the name that appears in the settings window&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//when you connect your web part to another web part&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//on the page.&amp;nbsp; You can use whatever name you want&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/////////////////////////////////////////////////////////////////////////&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;br&gt;public string ParameterName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return &amp;quot;Drop-down Menu Filter Value&amp;quot;; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//This is where we&amp;#39;re actually defining what value gets sent&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//to the other web part via our connection.&amp;nbsp; In my case, I had&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//a dropdown box called departmentPicker.&amp;nbsp; I&amp;#39;m sending the &lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//text value of the selected item.&amp;nbsp; (Notice that I run a quick check&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;// and if the value is set to the default &amp;quot;Select...&amp;quot; I just return null.&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//I built this from an example that was returning multiple values.&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//I&amp;#39;m only returning a single value, but I used their approach of&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//returning a list which works fine for single values as well.&amp;nbsp; This&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//way if I want to return multiple values in the future, I can reuse&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;//this code and not have to rewrite anything.&lt;/span&gt;&lt;br style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//////////////////////////////////////////////////////////////////////////////////&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;br&gt;public System.Collections.ObjectModel.ReadOnlyCollection&amp;lt;string&amp;gt; ParameterValues&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnsureChildControls();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;string&amp;gt; department = new List&amp;lt;string&amp;gt;();&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (departmentPicker.SelectedItem.Text == &amp;quot;Select...&amp;quot;)&lt;span style="color: rgb(0, 153, 0);"&gt;//If it is still set to the default, return null&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; department.Add(departmentPicker.SelectedItem.Text);&lt;span style="color: rgb(0, 153, 0);"&gt;//If it is set to any other value, add that value to our list&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ObjectModel.ReadOnlyCollection&amp;lt;string&amp;gt; result = new System.Collections.ObjectModel.ReadOnlyCollection&amp;lt;string&amp;gt;(department);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result; &lt;span style="color: rgb(0, 153, 0);"&gt;//return the filter value&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6334134217880578174?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6334134217880578174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6334134217880578174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6334134217880578174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6334134217880578174'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/08/making-connectible-web-part.html' title='Making a connectible web part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6785604497901035322</id><published>2008-07-30T13:30:00.001-04:00</published><updated>2008-07-30T13:30:04.856-04:00</updated><title type='text'>Setting the default home page on a site</title><content type='html'>&lt;div dir="ltr"&gt;&lt;p&gt;VP was showing me a site he was building based on the Lending Library template. He wanted to change the default home page from default.aspx to librarian.aspx. I told him, &amp;#39;No problem! You can can that in Site Settings.&amp;#39; But when I went to show him where that setting is, I couldn&amp;#39;t find it. &lt;/p&gt;  &lt;div&gt;Back at my desk, I went to the top level portal site, and found the setting listed, but it was still not available on the Lending Library site. I gave it a moments thought and decided that it must be relying on a missing Feature. Sure enough, once I enabled the Publishing feature the option to change the home page appeared in Site Settings. &lt;/div&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6785604497901035322?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6785604497901035322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6785604497901035322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6785604497901035322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6785604497901035322'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/07/setting-default-home-page-on-site.html' title='Setting the default home page on a site'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8274547598031886679</id><published>2008-07-25T13:49:00.001-04:00</published><updated>2008-07-25T13:49:35.123-04:00</updated><title type='text'>Fun with List Permissions</title><content type='html'>&lt;div dir="ltr"&gt;D asked me today whether it was possible to show a user only the documents they had created themselves in a list.&amp;nbsp; I said yes, and then spent half an hour trying to find the setting.&lt;br&gt;&lt;br&gt;It turns out this option only appears only if your List or Document Library has unique permissions.&amp;nbsp; If it is inheriting permissions from the parent site, the settings appear to be inaccessible. &lt;br&gt; &lt;br&gt;Once you&amp;#39;ve gotten unique permissions, the option appears under Advanced Settings on the List Settings screen.&amp;nbsp; You also have the ability to only allow users to edit their own documents, both very nice options to have.&lt;br&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8274547598031886679?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8274547598031886679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8274547598031886679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8274547598031886679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8274547598031886679'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/07/fun-with-list-permissions.html' title='Fun with List Permissions'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4086830266130837410</id><published>2008-07-21T12:42:00.001-04:00</published><updated>2008-07-21T12:42:56.433-04:00</updated><title type='text'>Dead Site Notification Message</title><content type='html'>&lt;div dir="ltr"&gt;VP recently asked me if we had a way to delete MySites after a person had left the company.&amp;nbsp; This is a question I&amp;#39;d been waiting for, so I already had an answer ready.&amp;nbsp; I showed him the option that Sharepoint has to find Unused sites and automatically delete them if the sites&amp;#39; owner didn&amp;#39;t take an action.&lt;br&gt; &lt;br&gt;I set up our test server to check for dead sites to generate an example email.&amp;nbsp; VP noticed that the email suggests that the user can delete the site immediately if so desired, and provides a link to the Site Settings page.&amp;nbsp; Unfortunately, the option to delete a site is buried with about 30 other commands on the Site Settings page.&amp;nbsp; If you&amp;#39;ve never deleted a site before, it can take several minutes to find the option.&lt;br&gt; &lt;br&gt;After a bit of searching, I found the file that is used to generate the site warning.&amp;nbsp; It&amp;#39;s called DEADWEB.XML and is located under the 12 hive in \TEMPLATE\1033\XML.&amp;nbsp; The file is just a simple XML, and I was quickly able to find the text of the message that gets sent out.&amp;nbsp; I edited the following line for clarification:&amp;nbsp; &amp;quot;If the site is not being used, please go to SITE, and select &amp;quot;Delete This Site&amp;quot; to remove the Web site. This is the last option listed under the Site Administration column.&amp;quot;&lt;br&gt; &lt;br&gt;The notices should run again tonight.&amp;nbsp; We&amp;#39;ll see if my change works as expected then.&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4086830266130837410?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4086830266130837410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4086830266130837410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4086830266130837410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4086830266130837410'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/07/dead-site-notification-message.html' title='Dead Site Notification Message'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4497506474859304943</id><published>2008-07-01T13:43:00.001-04:00</published><updated>2008-07-01T13:43:17.618-04:00</updated><title type='text'>Removing a solution from Sharepoint</title><content type='html'>Today we tried out a third party solution, decided we didn&amp;#39;t like it, and had to remove it.&amp;nbsp; Strangely enough, this has never come up before.&amp;nbsp; I&amp;#39;ve added and deployed plenty of solutions, but have never needed to get rid of one.&lt;br&gt; &lt;br&gt;The process is a mirror image of adding a solution.&amp;nbsp; First you Retract it from all the Web Applications that it was deployed to: stsadm -o retractsolution -name Whatever.wsp -allcontenturls -immediate&lt;br&gt;Once that finishes you can then Delete the solution: stsadm -o deletesolution -name Whatever.wsp&lt;br&gt; Nothing to it.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4497506474859304943?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4497506474859304943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4497506474859304943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4497506474859304943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4497506474859304943'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/07/removing-solution-from-sharepoint.html' title='Removing a solution from Sharepoint'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6986995804180999564</id><published>2008-06-24T14:26:00.001-04:00</published><updated>2008-06-24T14:26:27.104-04:00</updated><title type='text'>Interesting workflow problem</title><content type='html'>One of our users complained about not getting email notifications when a document was waiting for her approval today.&amp;nbsp; I looked at the workflow in question, which was a simple canned approval workflow and noted that her name was listed correctly.&amp;nbsp; &lt;br&gt; &lt;br&gt;To be on the safe side, I removed her entry, then readded her.&amp;nbsp; I then saved my change, and created a test document -- no email.&amp;nbsp; I checked the Task list used by the workflow, and saw that my document was listed, and had the user listed as the approver.&amp;nbsp; I then looked at User Alerts and saw one listed for the user.&amp;nbsp; I deleted the existing Alert, and then created a new one.&amp;nbsp; &lt;br&gt; &lt;br&gt;As soon as I tried to add the user&amp;#39;s name to the Alert, Sharepoint popped up an error saying that the user didn&amp;#39;t have an email address.&amp;nbsp; Aha!&amp;nbsp; I pulled up her account in Active Directory, and sure enough, the email address was blank.&amp;nbsp; A quick call to our help desk got her account updated.&lt;br&gt; Now I just need to wait for Shared Services to run it&amp;#39;s nightly incremental import.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6986995804180999564?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6986995804180999564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6986995804180999564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6986995804180999564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6986995804180999564'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/interesting-workflow-problem.html' title='Interesting workflow problem'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3743019053983320628</id><published>2008-06-24T14:04:00.001-04:00</published><updated>2008-06-24T14:04:17.351-04:00</updated><title type='text'>Updating Lists</title><content type='html'>I came across a problem today that I&amp;#39;d predicted weeks ago.&amp;nbsp; Our Sentinel Events site contains a couple dozen Lists that are used to track events for different facilities.&amp;nbsp; I used a custom list type to create these lists so that they all had the same customized Views.&lt;br&gt; &lt;br&gt;The problem with a custom list is that it is a one-time mold.&amp;nbsp; You can stamp out as many copies of the list as you want, but once the copy is made, it stands alone; no future changes are inheritable.&amp;nbsp; I predicted when I started that the day would come that I&amp;#39;d need to make a change to the list, and would then be forced to manually update every copy of the list.&amp;nbsp; Today that happened.&lt;br&gt; &lt;br&gt;When I first was working on the site, I was using a custom Content Query Web Part to pull data from all my lists and display it as a single list.&amp;nbsp; I got my custom web query working, but couldn&amp;#39;t make it look and work as nicely as the List Roll-Up web part sold by Bamboo Solutions.&amp;nbsp; In the end, it was cheaper to buy their pre-built solution that for me to spend any more time working with my own.&amp;nbsp; &lt;br&gt; &lt;br&gt;However, while I was working with my custom web part, I had run into problems with the fields names.&amp;nbsp; To pull the right fields, you need to reference them by the name used by the system.&amp;nbsp; My original field names had spaces and special characters, which made figuring out the field names challenging.&amp;nbsp; To save time, I changed the names of my fields.&amp;nbsp; Unfortunately for me, I&amp;#39;d already created my lists, which all referenced the old field names.&lt;br&gt; &lt;br&gt;Today Dave noticed the error and asked me to fix it.&amp;nbsp; Luckily, only 3 of the fields had had their names changed.&amp;nbsp; I was able to update all my lists in about twenty minutes.&amp;nbsp; Note for the future -- test everything before you start rolling out you lists.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3743019053983320628?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3743019053983320628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3743019053983320628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3743019053983320628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3743019053983320628'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/updating-lists.html' title='Updating Lists'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4489275324739130684</id><published>2008-06-23T14:41:00.001-04:00</published><updated>2008-06-23T14:41:17.727-04:00</updated><title type='text'>Sharepoint Site Restore</title><content type='html'>I did something today that I&amp;#39;ve never managed to do before.&amp;nbsp; I took a backup of a site running on one server, and restored it to a different server.&amp;nbsp; That should be a pretty basic operation, but it&amp;#39;s one I&amp;#39;ve never been able to do successfully.&lt;br&gt; &lt;br&gt;Truth be told, the restore that I have isn&amp;#39;t 100%.&amp;nbsp; Two of the web parts aren&amp;#39;t functioning, and I&amp;#39;m missing some of the graphics used by the custom Master Page we use.&amp;nbsp; That said, I am very happy.&lt;br&gt;&lt;br&gt; I began by building the server from the OS up.&amp;nbsp; Once the OS was installed and patched, I installed SQL Server 2005, and then patched it to Service Pack 2.&amp;nbsp; Then I installed MOSS 2007.&amp;nbsp; Once MOSS was installed, I immediately patched WSS to Service Pack 1, and then MOSS to Service Pack 1.&amp;nbsp; &lt;br&gt; &lt;br&gt;Next I configured the services on my new server, and created a Shared Services provider.&amp;nbsp; Once that was done, I needed to install the Fab 40 templates, and the 5 custom Web Parts we use on our portal.&amp;nbsp; All that took about 8 hours of work.&lt;br&gt; &lt;br&gt;Now I was ready to restore from my backup.&amp;nbsp; I copied the latest nightly backup from production to my new server.&amp;nbsp; I then used the Central Admin site to restore from this backup file.&amp;nbsp; This completed with errors.&lt;br&gt;&lt;br&gt; Looking through the error log, the restore process was unable to attach the web site to the content database.&amp;nbsp; I then tried to attach them using Central Admin and was given an error telling me to use the command line.&amp;nbsp; I then used the command stsadm -o addcontentdb to attach the site to the database.&lt;br&gt; &lt;br&gt;That worked, and I was able to partially load the page.&amp;nbsp; It complained about missing referenced web parts.&amp;nbsp; My restore had wiped my previous installation of the 3rd party web parts.&amp;nbsp; I readded the missing web parts (3 by copying the DLL files into the bin and editting the web.config, 2 by redeploying the features).&amp;nbsp; A quick IISReset and I was in business.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4489275324739130684?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4489275324739130684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4489275324739130684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4489275324739130684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4489275324739130684'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/sharepoint-site-restore.html' title='Sharepoint Site Restore'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4245683734948383923</id><published>2008-06-19T16:24:00.001-04:00</published><updated>2008-06-19T16:24:12.095-04:00</updated><title type='text'>Server changes</title><content type='html'>I just made a couple of adjustments to the search service on our production portal.&amp;nbsp; First, I bumped the Incremental indexing up to 15 minutes.&amp;nbsp; It had been running every hour.&amp;nbsp; Checking the logs, I could see that this job was finishing in 3 to 5 minutes.&amp;nbsp; I&amp;#39;ll keep an eye on my change.&lt;br&gt; &lt;br&gt;I also switched the indexer from using the 2 web front end boxes for indexing to running exclusively on the admin box.&amp;nbsp; I&amp;#39;ve heard conflicting information on this.&amp;nbsp; Some sources say it is better to spread the indexing load across multiple boxes, some say it is better to segregate the task so end users aren&amp;#39;t affected.&lt;br&gt; &lt;br&gt;I decided this second argument made more sense in our case, particularly because indexing doesn&amp;#39;t seem to be putting much of a strain on the admin box.&amp;nbsp; I&amp;#39;ll need to revisit this decision if we ever start indexing network drives, and when the number of documents stored on the portal goes up.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4245683734948383923?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4245683734948383923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4245683734948383923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4245683734948383923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4245683734948383923'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/server-changes.html' title='Server changes'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7144762784289612677</id><published>2008-06-11T13:25:00.001-04:00</published><updated>2008-06-11T13:25:39.011-04:00</updated><title type='text'>Customizing the Content Query Web Part</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div&gt;Whew!&amp;nbsp; That was a lot of work.&amp;nbsp; I&amp;#39;m still working on the Sentinel Event  site.&amp;nbsp; We have a group of Lists and want to have a single web part display  entries from all the lists in one place.&amp;nbsp; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;We looked at a web part from Bamboo Solutions that does this, but a) it&amp;#39;s  not free, and b) there&amp;#39;s a delay from when you add an item to when it appears in  the web part.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;I was able to get the same sort of thing working with a content query web  part, but that only showed the Title of the document, and no other information.&amp;nbsp;  I spent the morning seeing what I could do to improve on this.&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;Here are the instructions I  used: &lt;a href="http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx"&gt;http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;To start with, you need to  take your existing content query web part and export it.&amp;nbsp; Once you have the XML  file, you need to customize one of the lines to pull in additional columns.&amp;nbsp;  &lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;Here&amp;#39;s the line in  the WebPart you need to customize:&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;property  name=&amp;quot;CommonViewFields&amp;quot; type=&amp;quot;string&amp;quot;&amp;gt;Title, Text;Date,  DateTime;PublishingContactName, Note;Injury, Choice;Phone,  Note&amp;lt;/property&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;Note the format, it&amp;#39;s case  sensitive, and the spaces have to be used as shown above.&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;Once your web part has been updated, you&amp;#39;ll need to  upload it to your Web Part gallery.&amp;nbsp; Once there, you&amp;#39;ll be able to add the web  part back to your page...and it won&amp;#39;t look any different.&amp;nbsp; To display the new  columns, you need to customize you CSS.&lt;/font&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;nbsp; This is found in the file ItemStyle.xsl, which is held at the  Site Collection level under Style Library...XSL Style Sheets.&amp;nbsp;  &lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;I just copied an existing  template and added a table for formatting.&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:template  name=&amp;quot;Andrew&amp;quot; match=&amp;quot;Row[@Style=&amp;#39;Andrew&amp;#39;]&amp;quot;  mode=&amp;quot;itemstyle&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:variable  name=&amp;quot;SafeLinkUrl&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:call-template  name=&amp;quot;OuterTemplate.GetSafeLink&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:with-param  name=&amp;quot;UrlColumnName&amp;quot; select=&amp;quot;&amp;#39;LinkUrl&amp;#39;&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:variable  name=&amp;quot;DisplayTitle&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:call-template  name=&amp;quot;OuterTemplate.GetTitle&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:with-param  name=&amp;quot;Title&amp;quot; select=&amp;quot;@Title&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:with-param  name=&amp;quot;UrlColumnName&amp;quot; select=&amp;quot;&amp;#39;LinkUrl&amp;#39;&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:variable  name=&amp;quot;LinkTarget&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:if  test=&amp;quot;@OpenInNewWindow = &amp;#39;True&amp;#39;&amp;quot; &amp;gt;_blank&amp;lt;/xsl:if&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;div id=&amp;quot;linkitem&amp;quot;  class=&amp;quot;item link-item bullet&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;table cellpadding =  &amp;quot;5&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;tr&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;td&amp;gt;  &amp;lt;xsl:call-template  name=&amp;quot;OuterTemplate.CallPresenceStatusIconTemplate&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;a href=&amp;quot;{$SafeLinkUrl}&amp;quot;  target=&amp;quot;{$LinkTarget}&amp;quot; title=&amp;quot;{@LinkToolTip}&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;xsl:value-of  select=&amp;quot;$DisplayTitle&amp;quot;/&amp;gt;&amp;lt;/a&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/td&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;td&amp;gt;&amp;lt;xsl:value-of  select=&amp;quot;@PublishingContactName&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;td&amp;gt;Phone:  &amp;lt;xsl:value-of select=&amp;quot;@Phone&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;td&amp;gt;Injury?:  &amp;lt;xsl:value-of select=&amp;quot;@Injury&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/tr&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/table&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/div&amp;gt;  &lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;/xsl:template&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;Once you save the file and  check it back in you can refresh the page and see your changes.&amp;nbsp;  Hooray!&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;One note:&amp;nbsp; I ran into trouble  early on because my column names contained spaces and special characters like  &amp;#39;?&amp;#39;.&amp;nbsp; That made it hard to find the name that was used to reference the  columns.&amp;nbsp; The linked site has a way to find these names...but that didn&amp;#39;t work  in my case.&amp;nbsp; I ended up renaming the columns.&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&lt;/font&gt;&lt;/font&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7144762784289612677?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7144762784289612677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7144762784289612677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7144762784289612677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7144762784289612677'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/customizing-content-query-web-part.html' title='Customizing the Content Query Web Part'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5619677153078406228</id><published>2008-06-10T13:25:00.001-04:00</published><updated>2008-06-10T13:25:22.240-04:00</updated><title type='text'>Calendar and Filtering on Workflow status</title><content type='html'>Several months ago I created a Change Management app for our Help Desk Manager.&amp;nbsp; He called me over today because he couldn&amp;#39;t find a linked document.&amp;nbsp; It turned out the document was just hiding in a sub-folder.&amp;nbsp; While I was at his desk, he showed me the calendar he&amp;#39;d created to track the approved documents.&lt;br&gt; &lt;br&gt;After talking to him, I realized that he was manually copying details from the documents once they&amp;#39;d been approved.&amp;nbsp; I offered to create him a new Calendar view on the existing Library that would filter out unapproved items.&amp;nbsp; Basically, I&amp;#39;d give him the same calendar without him having to do any work.&lt;br&gt; &lt;br&gt;I created a new calendar view in the Document Library and set the date fields appropriately.&amp;nbsp; I then tried to set my filter to show only approved documents.&amp;nbsp; I&amp;#39;d assumed that I&amp;#39;d set the filter &amp;quot;Is equal to: Approved&amp;quot;.&amp;nbsp; This didn&amp;#39;t work, so I hunted around, and quickly realized that although the status column displayed &amp;quot;Approved&amp;quot; or &amp;quot;In Progress&amp;quot; the actual value of the field was a number.&amp;nbsp; &lt;br&gt; &lt;br&gt;I was in a bit of a hurry, so I figured out the values of the numbers by trial an error.&amp;nbsp; Later, I found that you can see the values directly by create a Datasheet view.&amp;nbsp; There&amp;#39;s also a list of the values here: &lt;a href="http://www.sharepointblogs.com/dwise/archive/2006/12/11/howto-filter-a-view-based-on-workflow-status.aspx"&gt;http://www.sharepointblogs.com/dwise/archive/2006/12/11/howto-filter-a-view-based-on-workflow-status.aspx&lt;/a&gt;&lt;br&gt; &lt;br&gt;For the record, Approved = 16.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5619677153078406228?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5619677153078406228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5619677153078406228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5619677153078406228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5619677153078406228'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/calendar-and-filtering-on-workflow.html' title='Calendar and Filtering on Workflow status'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1422786971888862355</id><published>2008-06-05T16:34:00.001-04:00</published><updated>2008-06-05T16:34:55.593-04:00</updated><title type='text'>List Templates and Custom Types</title><content type='html'>For a little over a week, I&amp;#39;ve been working on a site called Sentinel Events.&amp;nbsp; The purpose of this site is to record some events for facilities, and send out a notification to a list of people each time a new event is created.&lt;br&gt; I originally created a custom workflow to send out these notifications, but for one reason or another changed my mind and decided to use the built-in Alert option instead.&amp;nbsp; Because Alerts can&amp;#39;t be configured to pay attention to folders, I need to create a List for each facility.&amp;nbsp; This led me to work with List Templates:&amp;nbsp; basically you create a list and get it set up the way you want, then save the list as a template.&amp;nbsp; Now you can quickly stamp out duplicates of this first list using the template.&lt;br&gt; There is one big drawback to this approach: if you ever need to change something about your lists, you have to manually update each list with the change.&amp;nbsp; There&amp;#39;s no way to change the List Template and have that change push out.&lt;br&gt; That led me to Custom Types.&amp;nbsp; This lets you define a document type by setting your fields, setting the order, toggling whether the field is required, etc.&amp;nbsp; You can then require your list to use this custom type when creating new documents.&amp;nbsp; Now here&amp;#39;s the fun part...if you update your custom settings, all the documents that were created using the template are updated automatically.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1422786971888862355?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1422786971888862355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1422786971888862355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1422786971888862355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1422786971888862355'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/list-templates-and-custom-types.html' title='List Templates and Custom Types'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-134536610137013100</id><published>2008-06-03T17:25:00.002-04:00</published><updated>2008-06-03T17:44:23.482-04:00</updated><title type='text'>Building a test box</title><content type='html'>I was thinking this afternoon, as I built what seems to be the 50th version of our test box, that Microsoft is really going out of their way to make my life difficult.  This is partly my fault, as I'll get to later, but consider the steps required to build a Sharepoint Development environment.&lt;br /&gt;&lt;br /&gt;First, you pretty much have to develop for Sharepoint on a Sharepoint server;  You cannot do any testing unless you're on a server, for instance.  Annoyingly, MS won't let you install Sharepoint on XP or Vista, you must install on Windows Server.  So, to get a dev server up requires the following steps:&lt;br /&gt;1) Install Windows Server 2003.  Standard or Enterprise, your choice.  Don't install 64bit though, some of the SDKs you'll want to use won't install on 64bit.&lt;br /&gt;2) Patch your new Windows machine up to Service Pack 2 and install all the various fixes and security patches -- over 50 by my last count.&lt;br /&gt;3) Install .Net 2.0 and 3.0.&lt;br /&gt;4) Install service packs for .Net 2.0 and 3.0.&lt;br /&gt;5) Install SQL Server 2005.  (I wish I could use SQL Lite for my dev box, but I've been unable to restore a Sharepoint backup that was running on a SQL Server install to a SQL Lite server.  MS's advice: install SQL Server)&lt;br /&gt;6) Install service pack for SQL Server.&lt;br /&gt;7) Install Sharepoint Server 2007.  Hooray!  But we're not done yet.&lt;br /&gt;8) Install WSS Service Pack.&lt;br /&gt;9) Install Sharepoint Server service pack.&lt;br /&gt;10) Configure your Sharepoint server -- Shared Services, Enable all the services, set up searching, etc.&lt;br /&gt;11) Install Visual Studio.&lt;br /&gt;12) Install Visual Studio service pack.&lt;br /&gt;13) Install Sharepoint Designer.&lt;br /&gt;OK!  You now have a working, blank Sharepoint dev machine.  But you probably want to bring over some of your existing site, right?  Custom master pages, Web Parts, etc?&lt;br /&gt;Here's the additional steps that come next for me:&lt;br /&gt;14) Install the Fab 40 templates from Microsoft.&lt;br /&gt;15) Install the custom web parts that we had an outside vendor build for us.&lt;br /&gt;16) Install the web parts we bought from Data Springs.&lt;br /&gt;17) Either migrate a top level site via stsadm -o import, or restore from backup.&lt;br /&gt;&lt;br /&gt;So that gives me 17 steps.  I've gotten this down to about 8 hours of work. &lt;br /&gt;&lt;br /&gt;The obvious question is why aren't I doing this on a virtual machine?  And the answer is that I am, of course.  Months ago I built out nice images and gave them to my developers.  Everything was pre-configured and ready to go.  They don't use them.   This isn't their fault exactly, our company is cheap with hardware, so their work machines only have 2GB or RAM.  You try to run Visual Studio on top of a Windows Server virtual machine that is also running SQL Server and Sharepoint with only 1GB of RAM for your virtual environment. &lt;br /&gt;&lt;br /&gt;The same cheapness limits my dev server class machines to 2GB.  The only way to make performance good enough is to run them in a real environment.  I've been tempted to bring in my desktop from home running Linux and virtualizing the dev box on that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-134536610137013100?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/134536610137013100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=134536610137013100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/134536610137013100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/134536610137013100'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/building-test-box.html' title='Building a test box'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4974904526997021390</id><published>2008-06-02T13:21:00.001-04:00</published><updated>2008-06-02T13:21:43.918-04:00</updated><title type='text'>Custom Workflow</title><content type='html'>&lt;div&gt;VP asked me to create a new site last week.&amp;nbsp; The actual content of the  site was nothing special, just a single document type that didn&amp;#39;t even warrant  creating an Infopath form.&amp;nbsp; There was one tricky part: a diagram that specified exactly who  should be notified when a new document was created...depending on what folder  the document was created in.&lt;/div&gt; &lt;div&gt;I took a look at the canned workflows that ship with Sharepoint, but none  of them could handle what we wanted to do.&amp;nbsp; That left me with building&amp;nbsp;a custom  workflow.&amp;nbsp; Now there are two options here: Sharepoint Designer and Visual  Studio.&amp;nbsp; Visual Studio custom workflows are coded from the ground up, XML  documents, C# code, the works.&amp;nbsp; I sat through a 1-day intro class for building this type  of workflow, and to be honest I mostly just remember that it was bewildering and  difficult.&amp;nbsp; &lt;/div&gt; &lt;div&gt;Since time was a factor that left me with the Sharepoint Designer custom workflow option.&amp;nbsp; This is  a kind of workflow-light.&amp;nbsp; If you&amp;#39;re familiar with Simple Actions in Lotus  Notes, it&amp;#39;s very similar.&amp;nbsp; You pick from a list of simple actions and conditions like Send  Email and Document Status, and fill in a few parameters.&amp;nbsp; You can string as  many steps together as you like, but you&amp;#39;re limited to simple If/Else type  logic.&amp;nbsp; Even with these limitations, I was able to get a workflow created to do what we wanted fairly easily.&amp;nbsp;  Then I ran into a snag.&lt;/div&gt; &lt;div&gt;Since my workflow is supposed to notify a group of people that a new document  has been created, the email needs to link back to the new document.&amp;nbsp; Unfortunately, all of the built-in options to create a URL link don&amp;#39;t work.&amp;nbsp; Let me write that again, all the options that Sharepoint Designer gives you to create a URL link to a document don&amp;#39;t work.&amp;nbsp; They all build slightly different URLs that are supposed to point to the document, but don&amp;#39;t actually point to anything.&amp;nbsp; Oh, and they also don&amp;#39;t insert the HTML tags that make the code clickable. &lt;/div&gt;  &lt;div&gt;Eventually I was able to figure out how to build my own URL by hand coding  some HTML and looking up the ID of the current document.&amp;nbsp; Here&amp;#39;s the line of  code that I came up with:&lt;/div&gt; &lt;div&gt;&lt;font size="2" face="Helv"&gt;&lt;font size="2" face="Helv"&gt;&amp;lt;a  href=&lt;a href="http://server/site/Lists/ListName/DispForm.aspx?ID="&gt;http://server/site/Lists/ListName/DispForm.aspx?ID=&lt;/a&gt;&lt;b&gt;[Lookup  current document ID]&lt;/b&gt;&amp;gt;Link to Document&amp;lt;/a&amp;gt;&lt;br&gt;The [Lookup current document ID] is an option that returns the ID number of the current document.&amp;nbsp; This code should work for any site, just replace server with your server name, site with the name of the site, and ListName with the name of the list you&amp;#39;re working with.&amp;nbsp; This URL will work even if the documents are located within folders on the list.&lt;br&gt; &lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4974904526997021390?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4974904526997021390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4974904526997021390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4974904526997021390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4974904526997021390'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/06/custom-workflow.html' title='Custom Workflow'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2637042077294794521</id><published>2008-05-22T11:13:00.001-04:00</published><updated>2008-05-22T11:13:41.094-04:00</updated><title type='text'>Back from vacation</title><content type='html'>I was away for a nice, long weekend in Montreal.&amp;nbsp; Upon my return I discovered that our test box had been down since I left, and there were half a dozen small fires that needed putting out.&amp;nbsp; It&amp;#39;s nice to be missed.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2637042077294794521?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2637042077294794521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2637042077294794521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2637042077294794521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2637042077294794521'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/back-from-vacation.html' title='Back from vacation'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2042199083381437998</id><published>2008-05-14T14:18:00.002-04:00</published><updated>2008-05-14T20:10:27.818-04:00</updated><title type='text'>Sharepoint Error Messages</title><content type='html'>Why are Sharepoint error messages so useless?  I had a user who was trying  to approve a workflow task.  Every time she tried to open the task to approve it,  the web site shot back an error message starting with "Value does not fall  within the expected range. at Microsoft.SharePoint.SPList.GetItemById(Int32 id,  String strRootFolder, Boolean cacheRowsetAndId)".  Similar text filled the rest  of the screen.&lt;br /&gt;In the end, it turned out to be a simple permission problem -- the user  didn't have Approver access to the Library.  That's it.  About the simplest  problem in the world.  But nothing in the error message said anything  about an access error, or insufficient rights.  Bad Microsoft, no cookie.&lt;br /&gt;And while I'm thinking about it, it would be very nice if the Workflow  checked to see that a person had Approver rights to the Library before they were added as an approver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2042199083381437998?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2042199083381437998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2042199083381437998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2042199083381437998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2042199083381437998'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/sharepoint-error-messages.html' title='Sharepoint Error Messages'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3931847382250477301</id><published>2008-05-13T16:43:00.002-04:00</published><updated>2008-05-13T17:44:22.373-04:00</updated><title type='text'>Unexpected Search Problem</title><content type='html'>So, I've finally gotten my Test server indexing a network share.  For testing, the network team gave me an account with full access to everything on the Department shares.  The initial index ran overnight for about 10 hours, which was not unexpected.  Now we've got it running and my tests show that all is working, even PDFs.&lt;br /&gt;&lt;br /&gt;What I've found is that I have access to files that are waaaaaaay too personal. (Use your imagination)  I've also found a few financial files that should be locked down.  Now I've always had access to these files, they're all stored in public folders, I've just never had a way to find them before.  I can already see that I'm going to face a challenge educating upper management: Don't ban the tool for revealing our bad security, fix the security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3931847382250477301?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3931847382250477301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3931847382250477301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3931847382250477301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3931847382250477301'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/unexpected-search-problem.html' title='Unexpected Search Problem'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4718488644596976979</id><published>2008-05-12T14:57:00.001-04:00</published><updated>2008-05-12T14:57:44.836-04:00</updated><title type='text'>File Search Revisited</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div class="ExternalClass25B59B9C80364D1D9BBA3E4C37E3E1C4"&gt; &lt;div&gt;Now that our test box is back in business, I was able to go through an  configure Search again.&amp;nbsp; Sharepoint helpfully automatically configures all&amp;nbsp;your  Web Apps as sources for you, so to get basic Searching up and running all you  need to do is define a schedule for Full and Incremental crawls.&amp;nbsp; I like to go  once a month for Full crawls and every 20 minutes for Incrementals.&lt;/div&gt; &lt;div&gt;My next stop was to get PDF searching working.&amp;nbsp; Search uses iFilters to  make this work, and...it&amp;#39;s&amp;nbsp;a bit of a pain.&amp;nbsp; Put quickly you need to:&lt;/div&gt; &lt;div&gt;1) Download and install the iFilter from Adobe or Foxit.&lt;/div&gt; &lt;div&gt;2) Add the location of the iFilter to the system path.&lt;/div&gt; &lt;div&gt;3) Add pdf as a File Type to your Search Service Provider via the&amp;nbsp;Central  Administration site.&lt;/div&gt; &lt;div&gt;4) Update the GUID for the current iFilter DLL in the Registry.&lt;/div&gt; &lt;div&gt;5) Download an icon to use for pdf files, and update the icons XML  file.&lt;/div&gt; &lt;div&gt;6) Restart the osearch Windows Service.&lt;/div&gt; &lt;div&gt;7) Restart IIS.&lt;/div&gt; &lt;div&gt;8) Run a Full Index.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Yikes!&amp;nbsp; That&amp;#39;s a lot of steps.&amp;nbsp; Of course, you need to repeat them all if  you want to add additional file types.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So, once I got all that working, it was time to take another look at  indexing file shares.&amp;nbsp; This is something I had just started work on when we had  our big April crash.&amp;nbsp; In all the rebuilding work that followed that disaster, I  hadn&amp;#39;t had a chance to revisit it.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;For the file share I wanted to index, I needed to specify a different  network account.&amp;nbsp; Sharepoint does this via Rules.&amp;nbsp; At first this didn&amp;#39;t make  sense to me.&amp;nbsp; You&amp;#39;re already setting up a Source document...why not specify the  account there?&amp;nbsp; The advantage of using a Rule to store the account is that you  can have multiple accounts used in the same source.&lt;/div&gt; &lt;div&gt;Say that you have the following file share:&lt;/div&gt; &lt;div&gt;Share--&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |--Dir1&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |--Dir2&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |--Dir3&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;You can set up your source as &lt;a href="file://share/"&gt;\\Share&lt;/a&gt;.&lt;/div&gt; &lt;div&gt;Now you can set a rule that says &lt;a href="file://share/"&gt;\\Share\&lt;/a&gt;* uses  AccountA to crawl. Dir1, Dir2,&amp;nbsp;and Dir3 will be crawled using the same  account.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;But say that AccountA doesn&amp;#39;t have access to Dir2.&amp;nbsp; All you do is create a  second rule that says &lt;a href="file://share/Dir2/"&gt;\\Share\Dir2\&lt;/a&gt;* uses  AccountB.&amp;nbsp;&amp;nbsp;Now Dir1 and Dir3 will continue to use AccountA, but Dir2 will use  AccountB.&amp;nbsp; If you had used Sources to control account access, you would have had  to write a Source for each Directory.&amp;nbsp; Pretty slick, eh?&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;You can also use rules to bypass certain subdirectories.&amp;nbsp; In my example  above, you could create a rule that excludes Dir3 from being crawled.&amp;nbsp; That  wouldn&amp;#39;t affect the Source document, and the other rules continue to function  normally.&amp;nbsp; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So that&amp;#39;s where I&amp;#39;m at now...waiting for our Department share to finish  crawling.&amp;nbsp; If memory serves, this takes about 10 hours to complete.&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4718488644596976979?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4718488644596976979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4718488644596976979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4718488644596976979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4718488644596976979'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/file-search-revisited.html' title='File Search Revisited'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8548500359834352521</id><published>2008-05-08T15:41:00.001-04:00</published><updated>2008-05-08T15:41:19.512-04:00</updated><title type='text'>Patched the Dev Server today</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div&gt;D was testing a workflow and ran into the email bug that we first  noticed back in February.&amp;nbsp; This is a bug that causes the first workflow notification to appear as raw HTML code.&amp;nbsp; Luckily, I wrote down the KB # at the time, #937906, so was  able to quickly find it again.&amp;nbsp; The patch I&amp;#39;d installed back then was the 64bit  version, so I needed to download a new copy for our 32bit Dev server.&lt;br&gt;And this is when Microsoft decided to annoy me.&amp;nbsp; You can&amp;#39;t just download the patch, you have to request permission to download the patch.&amp;nbsp; Why?&amp;nbsp; What possible reason could there be to have your customer jump through this hoop?&lt;br&gt; &lt;br&gt;More baffling, the web page that you use to request permission to download the patch asks you what software the patch will be used for.&amp;nbsp; Excuse me?&amp;nbsp; It&amp;#39;s a patch.&amp;nbsp; By definition it&amp;#39;s only good for one piece of software.&amp;nbsp; Once you are approved to download the patch, you receive an email with a download link and a password to unzip the file.&amp;nbsp; Again...why?&amp;nbsp; &lt;br&gt; &lt;br&gt;Years ago I owned a radio tuner card for my PC.&amp;nbsp; This was a very simple card that installed into an ISA slot, and used a patch cable to output sound to your sound card.&amp;nbsp; One day I was upgrading my computer and moved the card to my new machine.&amp;nbsp; I couldn&amp;#39;t find the floppy with the software that allowed you to tune the radio on the card.&amp;nbsp; (Yes, floppy disk...I told you it was a long time ago).&amp;nbsp; &lt;br&gt; The company had a web site (which was rare at the time) but they wouldn&amp;#39;t make the software available for download.&amp;nbsp; At the time, I remember being just as baffled as I am today.&amp;nbsp; What possible reason could there be not to make the software available?&amp;nbsp; The software only works with your own hardware.&amp;nbsp; If you don&amp;#39;t have the hardware, the software is useless.&amp;nbsp; I eventually talked a customer support rep into mailing me a new disk with the radio software, but it would have been so much cheaper and faster to just make the software available for download.&lt;br&gt; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;br&gt;Ten years later and I&amp;#39;m in the same situation.&amp;nbsp; If I didn&amp;#39;t already have the software, I wouldn&amp;#39;t have anything to patch.&amp;nbsp; Why are you paying someone to maintain all this extra code when a simple link to the file would suffice?&amp;nbsp; And that&amp;#39;s assuming that the system was completely automated.&amp;nbsp; It&amp;#39;s entirely possible that Microsoft is paying someone to monitor a queue and send out links as the requests come in.&amp;nbsp; &lt;br&gt; &lt;br&gt;&lt;/div&gt; &lt;div&gt;Well, eventually I got my patch.&amp;nbsp; And I installed it.&amp;nbsp; And everyone is happy.&amp;nbsp; I think I&amp;#39;ll try to dig up that radio card this weekend.&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8548500359834352521?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8548500359834352521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8548500359834352521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8548500359834352521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8548500359834352521'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/patched-dev-server-today.html' title='Patched the Dev Server today'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1517909480349157304</id><published>2008-05-07T17:13:00.001-04:00</published><updated>2008-05-07T17:13:31.542-04:00</updated><title type='text'>Server Crash Cause Found!</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div&gt;At long last we&amp;#39;ve found the cause of April&amp;#39;s crash.&amp;nbsp; If you remember,  early in April, D added an updated DLL to the web front end boxes and ran an  IISReset.&amp;nbsp; When IIS came back up, the portal was inaccessible.&lt;/div&gt; &lt;div&gt;I called Microsoft, and after struggling for about three hours, we were  able to get the site back up by creating a new Web App, extending the Site, and  then changing the Port of the new Web App to 80.&amp;nbsp; It was an ugly afternoon, but  we got the site running and called it a day.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Ever since, I&amp;#39;ve been working with Microsoft to try and figure out what  went wrong.&amp;nbsp; Today we finally have an answer.&amp;nbsp; A copy of  Microsoft.Sharepoint.Search.DLL that was located in the Web Apps bin directory  was broken.&amp;nbsp; I&amp;#39;d left the original, broken Web App on the servers (in a stopped state).&amp;nbsp;  We were able to move the Web App to a new Application Pool to segregate it from  our production site and bring it back online.&amp;nbsp; Removing the DLL fixed the  problem. &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So, that&amp;#39;s great.&amp;nbsp; Now I know what caused all the heart-ache in the first  place.&amp;nbsp; The new mystery is what happened to that DLL?&lt;/div&gt; &lt;div&gt;A look at the file shows it to be the same version as the DLL in the GAC.&amp;nbsp;  A close comparison of the file sizes, however, suggests that it is the 32bit  version of the file -- all our production servers are 64bit. Apparently there&amp;#39;s no easy way to tell if a DLL is 32 or 64 bit short of poaking around with a hex editor.&lt;br&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So, where did this 32bit version of the file come from?&amp;nbsp; There are only two  plausible possibilities:&lt;/div&gt; &lt;div&gt;1) Someone copied the file from our test server, overwritting the 64bit  file.&amp;nbsp; D was copying files into the bin directory that day, but he says he  copied only his own custom DLL.&amp;nbsp; I believe him.&amp;nbsp; Of the other people who had  access to the server, none had any reason to copy files.&lt;/div&gt; &lt;div&gt;2) A server patch updated the file with the wrong version.&amp;nbsp; This looked promising at first.&amp;nbsp; There was a  patch installed on April 1st.&amp;nbsp; And the patch was was for IIS.&amp;nbsp; But, a look into the KB article about the patch  shows that it didn&amp;#39;t contain the DLL in question.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So, I&amp;#39;m pretty sure we&amp;#39;re looking at #1 -- especially when you consider that the broken file appeared on both Web Front End boxes.&amp;nbsp; The question now becomes, is it worth  finding out who copied the file?&amp;nbsp; The damage is already done; the lesson has  been learned. We&amp;#39;ve already changed the process for updating DLL files on  the server.&amp;nbsp; At this point, I think I&amp;#39;m going to let sleeping dogs lie, and just  be happy that I have an explanation for what happened.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1517909480349157304?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1517909480349157304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1517909480349157304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1517909480349157304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1517909480349157304'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/server-crash-cause-found.html' title='Server Crash Cause Found!'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6774384113552604402</id><published>2008-05-07T11:09:00.002-04:00</published><updated>2008-05-23T22:35:45.041-04:00</updated><title type='text'>Virtual Environments</title><content type='html'>D has asked for a staging server.  He wants a Sharepoint environment we can use to allow normal users to try out new applications before we roll them into production.  It's a good idea, and one that we talked about in the past, but never acted on.&lt;br /&gt;I don't have any additional hardware at the moment, so I've created a virtual machine on the current Dev server.  I've been a big fan of VMWare for years, but I decided to go with Microsoft's Virtual PC for this machine.  Mostly as an opportunity to familiarize myself with it.&lt;br /&gt;I'd already build out an image with Server 2k3 and MOSS installed.  I'd build this image months ago for our team to use on their workstations as personal dev environments.  I took that image and adapted it into a full fledged server.&lt;br /&gt;So far so good, but the performance seems much worse than I'd expected.  I'll do some tweaking, but if I can't improve things, I'm going to have to switch back to VMWare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6774384113552604402?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6774384113552604402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6774384113552604402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6774384113552604402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6774384113552604402'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/05/virtual-environments.html' title='Virtual Environments'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3815334754095921109</id><published>2008-04-23T16:10:00.001-04:00</published><updated>2008-04-23T16:10:44.676-04:00</updated><title type='text'>Using Sharepoint Designer to Backup/Restore a Site</title><content type='html'>&lt;div&gt;I mentioned in an earlier post today that I&amp;#39;d rebuilt the dev server.&amp;nbsp;  After my first rebuild of the test server, I had a running server, but could not  restore the old sites from backup.&amp;nbsp; The server was left running this way for  about a week while I worked on other problems.&amp;nbsp; During this time, D created a new site and started working on some Infopath forms.&amp;nbsp; When I warned  her that I was going to rebuild the server again, she asked me to backup the  site she&amp;#39;d created.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;For this backup, I used the Sharepoint Designer tool.&amp;nbsp; Sharepoint Designer  allows you to backup sites, but has a&amp;nbsp;size limit of 25MB.&amp;nbsp; (There are some work-arounds for this that you can find via Google, but I wouldn&amp;#39;t recommend going that route).&amp;nbsp; This means it isn&amp;#39;t practical for a full site backup, but was perfect  for a single site.&amp;nbsp; Once I had the dev server back up, I was able to quickly  restore the site.&amp;nbsp; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Here are the steps for backing up a site using Sharepoint Designer:&lt;/div&gt; &lt;div&gt;Launch Sharepoint Designer and click File...Open Site.&amp;nbsp; Enter the URL of  the Site you want to backup -- drop the file.aspx from the end of the URL.&amp;nbsp; For  example: &lt;a href="http://corp-wsstest/FixedAssetCIP/"&gt;http://server.mycompany.com/site&lt;/a&gt;&lt;/div&gt; &lt;div&gt;With the site open in Designer, click Site...Administration...Backup Web  Site.&amp;nbsp; You&amp;#39;ll be given the option to backup sub-sites of the current site as a  checkbox option.&amp;nbsp; If you click on Advanced, you&amp;#39;ll have the option of changing  where Designer stores its temporary files.&amp;nbsp; Click OK and you&amp;#39;ll get the standard  Save As dialog.&amp;nbsp; Backup files use the .CMP extension.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Restoring a site from a Designer backup is a little more complicated:&lt;/div&gt; &lt;div&gt;Begin by creating a new, empty site for your backup to be restored to.&amp;nbsp;  From Designer, click File...New...Web Site.&amp;nbsp; On the dialog box, click on the  General templates, and select the Empty Web Site template.&lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;At the bottom of the dialog, type the URL of the new site and click  OK.&lt;br&gt;&lt;br&gt;&lt;/div&gt;  &lt;div&gt;Once the new, empty site has been created, open it in Designer, and click  Site...Administration...Restore Web Site.&amp;nbsp; Find the .CMP backup file and click  OK.&amp;nbsp; That&amp;#39;s pretty much all there is to it.&amp;nbsp; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Much quicker and easier than using the command line and more reliable that  using the Restore option off the Central Administration Site.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3815334754095921109?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3815334754095921109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3815334754095921109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3815334754095921109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3815334754095921109'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/using-sharepoint-designer-to.html' title='Using Sharepoint Designer to Backup/Restore a Site'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4693402692709409985</id><published>2008-04-23T14:54:00.001-04:00</published><updated>2008-04-23T14:54:30.057-04:00</updated><title type='text'>Quick Batch Script for installing the "Fantastic 40" Sharepoint Templates</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div&gt;After rebuilding the Dev Server, one of my first tasks was re-installing  the Fantastic 40 templates that Microsoft gives away.&amp;nbsp; Half of these  templates are .STP files which need to be added to a Site Collection via the  GUI.&amp;nbsp; The other 20 are .WSP files, and need to be added via the command  line.&lt;/div&gt; &lt;div&gt;&lt;br&gt;You can download the templates from here: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5807b5ef-57a1-47cb-8666-78c1363f127d&amp;amp;DisplayLang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=5807b5ef-57a1-47cb-8666-78c1363f127d&amp;amp;DisplayLang=en&lt;/a&gt;&lt;br&gt; &lt;br&gt;All the .WSP templates rely on a template called the ApplicationTemplateCore.&amp;nbsp; There are 3 steps to installing this file:&lt;br&gt;stsadm –o addsolution –filename ApplicationTemplateCore.wsp&lt;br&gt;stsadm –o deploysolution –name ApplicationTemplateCore.wsp -allowgacdeployment -immediate&lt;br&gt; stsadm -o copyappbincontent&lt;br&gt;&lt;br&gt;&lt;/div&gt; &lt;div&gt;Once you&amp;#39;ve gotten the Application Core installed, the rest of the .WSP  templates are installed via the same 2 command lines.&amp;nbsp; The last time I did this,  I was smart enough to create a batch file to install them all for me.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Here&amp;#39;s that batch file:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename AbsenceVacationSchedule.wsp&lt;br&gt;stsadm -o  deploysolution -name AbsenceVacationSchedule.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename  BudgetingTrackingMultipleProjects.wsp&lt;br&gt;stsadm -o deploysolution -name  BudgetingTrackingMultipleProjects.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename BugDatabase.wsp&lt;br&gt;stsadm -o deploysolution  -name BugDatabase.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename CallCenter.wsp&lt;br&gt;stsadm -o deploysolution  -name CallCenter.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ChangeRequest.wsp&lt;br&gt;stsadm -o  deploysolution -name ChangeRequest.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ComplianceProcessSupport.wsp&lt;br&gt;stsadm -o  deploysolution -name ComplianceProcessSupport.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ContactsManagement.wsp&lt;br&gt;stsadm -o  deploysolution -name ContactsManagement.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename DocumentLibraryReview.wsp&lt;br&gt;stsadm -o  deploysolution -name DocumentLibraryReview.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename EventPlanning.wsp&lt;br&gt;stsadm -o  deploysolution -name EventPlanning.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ExpenseReimbursementApproval.wsp&lt;br&gt;stsadm  -o deploysolution -name ExpenseReimbursementApproval.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename HelpDesk.wsp&lt;br&gt;stsadm -o deploysolution  -name HelpDesk.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename InventoryTracking.wsp&lt;br&gt;stsadm -o  deploysolution -name InventoryTracking.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ITTeamWorkspace.wsp&lt;br&gt;stsadm -o  deploysolution -name ITTeamWorkspace.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename JobRequisition.wsp&lt;br&gt;stsadm -o  deploysolution -name JobRequisition.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename KnowledgeBase.wsp&lt;br&gt;stsadm -o  deploysolution -name KnowledgeBase.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename LendingLibrary.wsp&lt;br&gt;stsadm -o  deploysolution -name LendingLibrary.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename PhysicalAssetTracking.wsp&lt;br&gt;stsadm -o  deploysolution -name PhysicalAssetTracking.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename ProjectTrackingWorkspace.wsp&lt;br&gt;stsadm -o  deploysolution -name ProjectTrackingWorkspace.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename RoomEquipmentReservations.wsp&lt;br&gt;stsadm -o  deploysolution -name RoomEquipmentReservations.wsp -allowgacdeployment  -immediate&lt;/div&gt; &lt;div&gt;stsadm -o addsolution -filename SalesLeadPipeline.wsp&lt;br&gt;stsadm -o  deploysolution -name SalesLeadPipeline.wsp -allowgacdeployment -immediate&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4693402692709409985?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4693402692709409985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4693402692709409985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4693402692709409985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4693402692709409985'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/quick-batch-script-for-installing.html' title='Quick Batch Script for installing the &quot;Fantastic 40&quot; Sharepoint Templates'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4340194376866509637</id><published>2008-04-23T14:44:00.001-04:00</published><updated>2008-04-23T14:44:37.647-04:00</updated><title type='text'>Finally got our Dev server restored</title><content type='html'>&lt;link href="/_layouts/1033/styles/core.css" type="text/css" rel="stylesheet"&gt;&lt;div&gt;D had asked me to rebuild the Test Server a few weeks back.&amp;nbsp; He was  having some trouble with one of his applications, and we thought it might have  been caused by installing the .Net 3.5 framework.&amp;nbsp; This wasn&amp;#39;t the case, but the  Test server has been with us from the very beginning and had built up some  cruft over time, so a rebuild seemed like a good idea.&lt;br&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;My first attempt to just uninstall Sharepoint and .Net 3.5 failed, so after  some debate, I formatted the drive and started fresh.&amp;nbsp; After a bit of hunting  for network drivers (HP, why don&amp;#39;t you just make them available for download?) I  had the box up and running.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;To save time, I did a Full install of Sharepoint, which uses SQL Lite, and  has everything preconfigured.&amp;nbsp; When I tried to restore, the process kept failing  with the error: &amp;quot;Your backup is from a different version of Windows SharePoint  Services and cannot be restored to a server running the current version. The  backup file should be restored to a server with version  &amp;#39;1836597052.1702240364.1869181810.824327&amp;#39; or later.&amp;quot;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;I opened a case with Microsoft, and together we eventually determined that  this error had nothing to do with the Sharepoint version, it was a simple file  access error.&amp;nbsp; I made the backup files available via a network share that was  fully accessible to all, and that problem was solved.&amp;nbsp; Next up, Sharepoint  complained about being unable to create a content database.&amp;nbsp; &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;So, I uninstalled Sharepoint and SQL Lite, then reinstalled a full version  of SQL along with Sharepoint.&amp;nbsp; This time, everything worked.&amp;nbsp; I got my original  sites restored, and aside from a few 3rd party Web Parts that need to be  installed, everything is working.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4340194376866509637?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4340194376866509637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4340194376866509637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4340194376866509637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4340194376866509637'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/finally-got-our-dev-server-restored.html' title='Finally got our Dev server restored'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6256309200866362941</id><published>2008-04-21T15:50:00.001-04:00</published><updated>2008-04-21T15:51:48.591-04:00</updated><title type='text'>User Account Problem, Solved</title><content type='html'>Sort of.  Microsoft had me add the user to the Owners group for the top level Site Collection.  This must have updated the cached account information, because everything started working after that.&lt;br /&gt;I don't have a reason for why this happened, and of course, no reason to think it won't happen again.  I'm beginning to get used to not knowing these things.  Sharepoint has too much voodoo in it for my taste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6256309200866362941?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6256309200866362941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6256309200866362941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6256309200866362941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6256309200866362941'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/user-account-problem-solved.html' title='User Account Problem, Solved'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3075195541160688799</id><published>2008-04-21T10:54:00.002-04:00</published><updated>2008-04-21T11:00:22.248-04:00</updated><title type='text'>Strange user account problem</title><content type='html'>Our developer ran into a problem with one of his applications last week.  One of the people trying to use the application was running into an error.  This application is just a simple ASPX form that is filled out by the user.  A bit of digging in the logs revealed that the application was pulling the wrong username for the user.&lt;br /&gt;&lt;br /&gt;A bit more digging and we discoverd the following:  The user logs in with their AD account, Domain\Jane.Doe.  Their user profile in Shared Services matches this account name.  However, if you bring up My Settings from the Welcome Jane Doe menu item that appears at the top of every Sharepoint page, the users account is listed as Domain\Doe.  This is the account name that our broken application is trying to use. &lt;br /&gt;&lt;br /&gt;I've been unable to find where the server is coming up with this name.  I've even gone into the SQL databases and searched, but Domain\Jane.Doe is all that comes back.  I'm about to open a case with Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3075195541160688799?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3075195541160688799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3075195541160688799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3075195541160688799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3075195541160688799'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/strange-user-account-problem.html' title='Strange user account problem'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8851443952958703755</id><published>2008-04-14T13:21:00.001-04:00</published><updated>2008-04-14T13:21:37.677-04:00</updated><title type='text'>Fixed error on Web Front End boxes</title><content type='html'>Early on in the portal roll-out we were looking for a Weather Web Part.&amp;nbsp; The idea was to display the local weather for each facility on their home page.&amp;nbsp; &lt;br&gt;I&amp;#39;d found a free Web Part from Bamboo Solutions that did just this.&amp;nbsp; I installed it on the servers, and it worked fine.&amp;nbsp; Months later, and for one or another, we ended up not using it.&amp;nbsp; I uninstalled the Web Part using the installer software that Bamboo included with the Web Part and forgot about it.&amp;nbsp; The Big Crash we had with the site a couple of weeks ago made me take a deeper look than usual at the logs, and I noticed that we were getting daily error messages from the Bamboo Web Part. &lt;br&gt; When I uninstalled the Web Part, it removed the DLL from the GAC, but did not update the web.config to remove the Safe Controls reference.&amp;nbsp; I&amp;#39;ve just updated the web.config on Web1 and Web2 to remove this reference, recycled IIS, and used my spwakeup tool to rebuild the portal&amp;#39;s aspx pages.&lt;br&gt; All went as expected, and the site is back to normal, without any error messages, and without any downtime for our users thanks to Load Balancing.&lt;br&gt;&lt;br&gt;Now normally, this kind of activity wouldn&amp;#39;t be worth mentioning.&amp;nbsp; This is the admin equivalent of wiping a smudge&amp;nbsp; with your shirtsleeve as you walk by a dirty window.&amp;nbsp; I, however, was very nervous.&amp;nbsp; This is the first return to normal life on these servers since the Big Crash.&amp;nbsp; I&amp;#39;ve been treating them with kid-gloves since that day; convinced that breathing on them wrong will bring the whole thing tumbling down again.&lt;br&gt; That&amp;#39;s no way to live your life, and it&amp;#39;s certainly not a good way to be an admin.&amp;nbsp; You cannot be frightened of your servers.&amp;nbsp; If you are certain of what you are doing, and you know that making a change is safe, you make the change.&amp;nbsp; Well, today I made the change.&amp;nbsp; It&amp;#39;s nice to return life to normal.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8851443952958703755?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8851443952958703755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8851443952958703755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8851443952958703755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8851443952958703755'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/fixed-error-on-web-front-end-boxes.html' title='Fixed error on Web Front End boxes'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3420569575854257785</id><published>2008-04-11T13:48:00.001-04:00</published><updated>2008-04-11T13:48:57.566-04:00</updated><title type='text'>Migrated SPWakeUp project to the Codeplex</title><content type='html'>That site seems to get more traffic.&lt;br&gt;The new address is &lt;a href="http://www.codeplex.com/SPWakeUp/Wiki/View.aspx?title=Home"&gt;http://www.codeplex.com/SPWakeUp/Wiki/View.aspx?title=Home&lt;/a&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3420569575854257785?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3420569575854257785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3420569575854257785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3420569575854257785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3420569575854257785'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/migrated-spwakeup-project-to-codeplex.html' title='Migrated SPWakeUp project to the Codeplex'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4754903592123839455</id><published>2008-04-11T11:24:00.001-04:00</published><updated>2008-04-11T11:24:35.475-04:00</updated><title type='text'>I've got competition</title><content type='html'>I did a search for Sharepoint Wake Up, and found this page: &lt;a href="http://www.codeplex.com/entmosswakeup"&gt;http://www.codeplex.com/entmosswakeup&lt;/a&gt;&lt;br&gt;Very cool.&amp;nbsp; Looks like he saw my script and decided to make his own version.&amp;nbsp; I haven&amp;#39;t had a chance to look at his source code yet, but it will be interesting to see how he approaches the same challenge.&lt;br&gt; &lt;br&gt;From his documentation it looks like he&amp;#39;s decided to make search depth specific to each starting site, instead of using a single value for all sites.&amp;nbsp; Interesting choice.&amp;nbsp; &lt;br&gt;His logging is better than mine.&amp;nbsp; (No big surprise there, since I released 4 versions before I bothered to add logging.)&lt;br&gt; He also seems to have some code that looks for multiple pages within each site.&amp;nbsp; I&amp;#39;ve just been touching the default page.&amp;nbsp; I&amp;#39;m very interested to see how he does that.&lt;br&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4754903592123839455?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4754903592123839455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4754903592123839455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4754903592123839455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4754903592123839455'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/ive-got-competition.html' title='I&apos;ve got competition'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8772850997542333743</id><published>2008-04-11T11:09:00.001-04:00</published><updated>2008-04-11T11:09:38.292-04:00</updated><title type='text'>New version of SPWakeUp</title><content type='html'>This latest version is a complete rewrite of the application.&amp;nbsp; As usual, you can download a copy from here: &lt;a href="http://code.msdn.microsoft.com/spwakeup"&gt;http://code.msdn.microsoft.com/spwakeup&lt;/a&gt;&lt;br&gt;I learned to program on an Apple IIc on Basic.&amp;nbsp; Over the years, I&amp;#39;ve concentrated mostly on administration, and have only coded a few simple scripts for my own use, usually using batch files or Perl.&amp;nbsp; I&amp;#39;ve taken programming classes since, C++, Java, etc.&amp;nbsp; But to be honest, Object Oriented programming never really got into my bones.&lt;br&gt; All my applications are what I call Object Oriented lite:&amp;nbsp; I&amp;#39;ll use big looped sections instead of Methods, and multi-dimensioned arrays instead of Objects.&amp;nbsp; I could see why an Object model was valuable, but I never embraces the tools for using it.&lt;br&gt; &lt;br&gt;When I looked at spwakeup, I realized, that I&amp;#39;d done the same thing I always have.&amp;nbsp; And worse...this time it had gotten me in trouble.&lt;br&gt;In my first version, I checked for sub webs, but not site collections.&amp;nbsp; When I decided to add in some code to check for site collections, I just squeezed it into my big loop.&amp;nbsp; But this meant that every URL was being checked twice, first for sub webs, then for site collections.&amp;nbsp; This made my application slow.&amp;nbsp; &lt;br&gt; &lt;br&gt;I decided enough was enough, and forced myself to rewrite the thing from scratch.&amp;nbsp; This time, I didn&amp;#39;t use a big loop, I created two methods: FindSubWebs and FindSiteCollections.&amp;nbsp; I just pass my starting list of sites to one, get the results, then pass the expanded list on to the other.&amp;nbsp; I stole the HTTP request code from the web, so it was already a method.&amp;nbsp; In the end, I had much cleaner code, and when I tested it on my servers, I&amp;#39;d shaved about 30% off the run time.&lt;br&gt; &lt;br&gt;I also decided to address my configuration options.&amp;nbsp; In the first version, I required two configuration files, one to set search depth, the other to set the starting URL.&amp;nbsp; This wasn&amp;#39;t really a design choice on my part -- I couldn&amp;#39;t figure out how to make command line switches work!&amp;nbsp; A few minutes playing with the debugger in Visual Studio cleared that up that mystery.&amp;nbsp; I now have what I think is a pretty elegant approach.&lt;br&gt; &lt;br&gt;If you run spwakeup without any options and you don&amp;#39;t have a sites.conf file, it sets search depth to the default value of 3 and runs against localhost.&amp;nbsp; My thought here was for a test environment or training computer.&amp;nbsp; I wanted to make it dead simple to use, just double-click and go.&lt;br&gt; If you want to specify the site you wake up, just set it at run time: spwakeup.exe -site:&lt;a href="http://mysite.com"&gt;http://mysite.com&lt;/a&gt;&lt;br&gt;If you need to wake up more than one site, you can list them in sites.conf, just like you used to.&lt;br&gt; &lt;br&gt;If you want to set an alternate search depth, just specify it at run time: spwakeup.exe -depth:6&lt;br&gt;If you want to wake up &lt;a href="http://mysite.com"&gt;http://mysite.com&lt;/a&gt; at a depth level of 2: spwakeup.exe -depth:2 -site:&lt;a href="http://mysite.com"&gt;http://mysite.com&lt;/a&gt;&lt;br&gt; &lt;br&gt;Last, I decided to add a logging option.&amp;nbsp; To be honest, I only added this because I thought people might like it.&amp;nbsp; Personally I just pipe the output into a text file when I want to log an app like this.&amp;nbsp; But, I added the switch -log:&amp;nbsp; so that people could set the output to something.&amp;nbsp; This option doesn&amp;#39;t log everything, for example it doesn&amp;#39;t show the raw HTML that gets displayed to the console when the app is run.&amp;nbsp; Instead it just shows a synopsis, How many sites were found, what was the result on each site when it was woken.&lt;br&gt; &lt;br&gt;In all, I&amp;#39;ve been flattered that other people seem to like this little application.&amp;nbsp; In its various versions, it&amp;#39;s now been downloaded over 50 times.&amp;nbsp; I think this version will be my last.&amp;nbsp; I can&amp;#39;t really think of any other features to add to what is a pretty simple application at its heart.&amp;nbsp; I&amp;#39;ll add bug-fixes if I run into any errors, and I might make some improvements to logging, but I don&amp;#39;t think I&amp;#39;ll do another rewrite like this.&lt;br&gt; &lt;br&gt;Next project:&amp;nbsp; Andrew&amp;#39;s 100% Unsupported Run-At-Your-Own-Risk Sharepoint Site Level Backup.&lt;br&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8772850997542333743?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8772850997542333743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8772850997542333743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8772850997542333743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8772850997542333743'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/new-version-of-spwakeup.html' title='New version of SPWakeUp'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3551204338081980821</id><published>2008-04-08T12:12:00.002-04:00</published><updated>2008-04-08T21:42:49.469-04:00</updated><title type='text'>Another update to SPWakeUp</title><content type='html'>I've made another update to my SPWakeup script.&lt;br /&gt;This latest version adds the ability to wake Site Collections in addition to Sub Sites.&lt;br /&gt;As always, you can download the latest version here:&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/spwakeup"&gt;http://code.msdn.microsoft.com/spwakeup&lt;/a&gt;&lt;p&gt;This script uses STSADM to list the sites.  It runs stsadm -o enumsubwebs and stsadm -o enumsites then parses through the resulting text.&lt;br /&gt;Both commands return their data in XML.  I've found it easier to just treat the results as plain text and strip out the XML tags:&lt;br /&gt;cmd2_output = cmd2_output.Substring(13);&lt;br /&gt;cmd2_output = cmd2_output.Substring(0, cmd2_output.IndexOf('"'));&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3551204338081980821?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3551204338081980821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3551204338081980821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3551204338081980821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3551204338081980821'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/another-update-to-spwakeup.html' title='Another update to SPWakeUp'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3989906109121836454</id><published>2008-04-07T15:23:00.001-04:00</published><updated>2008-04-07T17:25:24.942-04:00</updated><title type='text'>Update to SPWakeUp script</title><content type='html'>&lt;span style="font-size:100%;"&gt;I made a small update to my SPWakeUp tool today.  You can download a copy at: &lt;/span&gt;&lt;a href="http://code.msdn.microsoft.com/spwakeup"&gt;&lt;span style="font-size:100%;"&gt;http://code.msdn.microsoft.com/spwakeup&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;It's something I should have done long ago: error catching!  I noticed that when I included our MySites URL in the list of sites to wake up, the script was bombing.  Turns out that when you create the MySites web app, Sharepoint doesn't create a matching Site.  As users create their own MySites, they are created as new Site Collections.  So, when my tool tries to wakeup the root site, it fails because there's no site there.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;In the end, I did what I should have done in the first version of the tool, I wrapped my attempt to open the site in a Try/Catch block.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Here's the new code:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;{string webresult = GetWebPage(siteurl);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Console.Write(webresult);}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;catch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;{Console.Write("Cannot reach site: " + siteurl);}&lt;/span&gt; &lt;form action="http://portal.uhsinc.biz:82/personal/corp_kenna/Blog/default.aspx" method="post"&gt;&lt;/form&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3989906109121836454?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3989906109121836454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3989906109121836454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3989906109121836454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3989906109121836454'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/update-to-spwakeup-script.html' title='Update to SPWakeUp script'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5539103239012976333</id><published>2008-04-07T15:07:00.003-04:00</published><updated>2008-04-07T17:28:13.294-04:00</updated><title type='text'>Sharepoint tip</title><content type='html'>&lt;p&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;Some good did come of last week's disaster. &lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;I learned a great deal about Sharepoint internal workings. One handy tip I picked up was a way to get to the WebParts running on a page, even if that pages is down. Just add ?Controls=1 to the end of your URL, for example: &lt;/span&gt;&lt;a href="http://site/Pages/default.aspx?Controls=1"&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;color:blue;"   &gt;&lt;u&gt;http://site/Pages/default.aspx?Controls=1&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;   This takes you to a page which lists all the Web Parts running on the default.aspx page. You can then close the Web Part, or if necessary, remove it from the page completely.&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;Last week was also a reminder to me that I'm not in Domino-land anymore.  One of the really nice things about Domino is that each element is a separate database.  It's very hard to take down a Domino server.  For the most part an error in one database will not affect any other database.  Sharepoint is much more interconnected.  This makes it very powerful, but also fragile.  It seems that a failure in any part of Sharepoint will take everything down.&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;I'm probably just overly sensitive after spending a nightmarish week trying to patch things back together, but I can't shake that feeling that the whole thing is held together with string and good intentions.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5539103239012976333?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5539103239012976333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5539103239012976333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5539103239012976333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5539103239012976333'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/sharepoint-tip.html' title='Sharepoint tip'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4133665924306639823</id><published>2008-04-04T15:32:00.003-04:00</published><updated>2008-04-04T17:36:00.874-04:00</updated><title type='text'>We had some trouble with Sharepoint this week</title><content type='html'>On Tuesday, the site stopped responding.  Eventually I was able to track the problem down to an authentication problem ultimately caused by a loose network cable of all things.  It was very unfun, and the server went down for about 5 to 10 minutes at a time 5 times while I struggled to fix things.  At one point, the account that Sharepoint uses to run its services was locked out by the Domain.&lt;br /&gt;Eventually we got everything sorted out, and the servers were back to normal.&lt;p&gt;Or so I thought.  On Thursday, D uploaded a new DLL for a Web Part he's been building.  He then cycled IIS on each of the web front end boxes.  Disaster!&lt;/p&gt;&lt;p&gt;This time the servers were responding to HTTP requests, but showing an error page complaining about web.config.  I assumed we were having a repeat of Tuesday's problems, but quickly eliminated that by checking the servers and logs.  I called up Microsoft, and spent the next 4 hours on the phone with them.&lt;/p&gt;&lt;p&gt;In the end we managed to get the servers back up without losing any data.  We had to rebuild two of our pages that were using custom Web Parts.  These Web Parts had to be removed from the server (stsadm -o deletesolution -name WebPart) and then readded before they could be coaxed back into life.  Ironically, D's Web Part was not affected by all this.&lt;/p&gt;&lt;p&gt;So, I had a very unpleasant week.  I've spent the day trying to document exactly what happened, and explain to everyone why we had 4 hours of down-time on a supposedly fully redundant server farm.  To top it off...I still don't know what happened!  I've shipped copies of the server logs off to Microsoft, and hope to hear back from them sometime next week.&lt;/p&gt;&lt;p&gt;I've come away from the experience with a new found respect for the techs at Microsoft support.  I was not in a very good mood when I called for help, and it was nice to have someone calm and competent to talk to.  As part of closing the ticket, my tech forwarded his notes on the issue.  I'm attaching them below, because I thought it was interesting to see how we repeatedly tried to fix the problem, failed, and tried again with a different approach.  In the end, we created a new Web Site in IIS and extended the Sharepoint site into that.  Once that was working, we swapped the Ports used by the IIS Web Sites so our newly extended site responded on Port 80.  It was a clever fix, and one I never would have thought of myself.&lt;/p&gt;&lt;p&gt;Notes from this problem.  I made the initial call at 11:30am and was on the call until around 4pm.  After that I spent another hour and a half re-installing Web Parts and rebuilding the two broken pages.&lt;/p&gt;&lt;p&gt;- Followed KB 934838 as below&lt;/p&gt;&lt;p&gt;- On Central Admin Server stsadm -o updatefarmcredentials -userlogin&lt;br /&gt;DomainName \ UserName -password NewPassword &amp;gt; Successful&lt;/p&gt;&lt;p&gt;- On other 2 WFEs stsadm -o updatefarmcredentials -userlogin&lt;br /&gt;DomainName \ UserName -password NewPassword -local &amp;gt; Successful&lt;/p&gt;&lt;p&gt;- IISRESET /noforce on 3 servers&lt;/p&gt;&lt;p&gt;- Administration Application Pool Credential Deployment job definition&lt;br /&gt;is still displayed on the Timer Job Definitions page &amp;gt; Waited for 5&lt;br /&gt;minutes&lt;/p&gt;&lt;p&gt;- Waited for 5 minutes; job is still there&lt;/p&gt;&lt;p&gt;- Delete the job and try the command again&lt;/p&gt;&lt;p&gt;- stsadm -o execadmsvcjobs&lt;/p&gt;&lt;p&gt;The  job failed with the following error.  This job will be skipped.&lt;br /&gt;There was an error encrypting or decrypting credentials. Either a&lt;br /&gt;credential update is currently being performed, or you must update the&lt;br /&gt;farm account credentials on this server before you can perform this&lt;br /&gt;task.&lt;/p&gt;&lt;p&gt;Operation completed successfully.&lt;/p&gt;&lt;p&gt;- We see a lot of 7076, 6398 and 6482 it refers to KB 946517&lt;/p&gt;&lt;p&gt;- Installed HotFix from KB 946517 on all 3 servers&lt;/p&gt;&lt;p&gt;- Reboot all 3 servers&lt;/p&gt;&lt;p&gt;- Administration Application Pool Credential Deployment job still&lt;br /&gt;present in Timer Job Definitions &amp;gt; deleted the same&lt;/p&gt;&lt;p&gt;- Typed in the credentials manually for the application pool for port&lt;br /&gt;80 web app on both WFEs &amp;gt; Recycle app pool&lt;/p&gt;&lt;p&gt;- Try to access the site &amp;gt; same issue&lt;/p&gt;&lt;p&gt;stsadm -o deleteconfigurationobject -id &amp;lt;GUID&amp;gt;&lt;/p&gt;&lt;p&gt;- Did the credential deployment again; still Administration&lt;br /&gt;Application Pool Credential Deployment job gets stuck&lt;/p&gt;&lt;p&gt;- Did an extend web app at port 101&lt;/p&gt;&lt;p&gt;- Tried to browse; page cannot be displayed&lt;/p&gt;&lt;p&gt;- Web application has not even propagated to other WFEs&lt;/p&gt;&lt;p&gt;- Restarted timer service&lt;/p&gt;&lt;p&gt;- Tried to browse to site/_layouts/settings.aspx &amp;gt; Same error&lt;/p&gt;&lt;p&gt;- Created a new web application &amp;gt; successful&lt;/p&gt;&lt;p&gt;- Went to web application list &amp;gt; it does show the new web application&lt;/p&gt;&lt;p&gt;- Even the new web application has not propagated to IIS of other WFEs&lt;/p&gt;&lt;p&gt;- We have the new web site in IIS of Central Admin server; CA server&lt;br /&gt;is not in the load balancer but it has the web application service&lt;br /&gt;started&lt;/p&gt;&lt;p&gt;- Created a site collection; try to browse it &amp;gt; page cannot be displayed&lt;/p&gt;&lt;p&gt;- Try to do localhost:102 from Central Admin server &amp;gt; page cannot be displayed&lt;/p&gt;&lt;p&gt;- Running PSCONFIGUI on Central Admin server, WFE1 and WFE2 &amp;gt; Successful&lt;/p&gt;&lt;p&gt;- Changed the CustomErrors to Off on WFEs and Central Admin server&lt;/p&gt;&lt;p&gt;- IISRESET&lt;/p&gt;&lt;p&gt;- Browse to the site; we see the error message as below now&lt;/p&gt;&lt;p&gt;Server Error in '/' Application.&lt;/p&gt;&lt;p&gt;- Confirmed we are not running AdminSecure 2006 on the server&lt;/p&gt;&lt;p&gt;- On Central Adminpsconfig.exe -cmd services -install and psconfig.exe&lt;br /&gt;-cmd services -provision &amp;gt; Successful&lt;/p&gt;&lt;p&gt;- On WFE2 Adminpsconfig.exe -cmd services -install and psconfig.exe&lt;br /&gt;-cmd services -provision &amp;gt; Failed to register SharePoint services&lt;/p&gt;&lt;p&gt;- On WFE1 Adminpsconfig.exe -cmd services -install and psconfig.exe&lt;br /&gt;-cmd services -provision &amp;gt; Failed to register SharePoint services&lt;/p&gt;&lt;p&gt;- Suddenly the test application got provisioned!&lt;/p&gt;&lt;p&gt;- We again did extend to another web application at port 103&lt;/p&gt;&lt;p&gt;- It didnt provision&lt;/p&gt;&lt;p&gt;- We forced it by stsadm -o execadmsvcjobs on all servers&lt;/p&gt;&lt;p&gt;- It created the web applications on other servers this time&lt;/p&gt;&lt;p&gt;- We are able to browse to the site but the home page is erroring out&lt;br /&gt;due to custom webparts not able to open&lt;/p&gt;&lt;p&gt;- We tried to close and delete the webparts &amp;gt; same issue&lt;/p&gt;&lt;p&gt;- We copied over the web.config from original web application to newly&lt;br /&gt;extended web application&lt;/p&gt;&lt;p&gt;- Try to browse &amp;gt; web part error&lt;/p&gt;&lt;p&gt;- Opened the site in web folder view and took a backup of default.aspx&lt;br /&gt;and replaced it with a working one from a subsite &amp;gt; successful&lt;/p&gt;&lt;p&gt;- Opened the site &amp;gt; successful with totally changed layout as we dont&lt;br /&gt;see any custom webparts etc..&lt;/p&gt;&lt;p&gt;- Andrew checked the other subsites etc... its coming up&lt;/p&gt;&lt;p&gt;- Andrew said we need to get the site working by original port and host header&lt;/p&gt;&lt;p&gt;- We stopped both old and new sites on all servers&lt;/p&gt;&lt;p&gt;- Interchanged port numbers and host headers between old and new web&lt;br /&gt;applications&lt;/p&gt;&lt;p&gt;- We redeployed and reconfigured custom webparts using stsadm&lt;br /&gt;addsolution and stsadm deploysolution&lt;/p&gt;&lt;p&gt;- stsadm -o execadmsvcjobs on all servers&lt;/p&gt;&lt;p&gt;- Now we are able to see the web pages correctly&lt;/p&gt;&lt;p&gt;- Replaced defaultold.aspx to default.aspx again on site home page&lt;/p&gt;&lt;p&gt;- We are not able to delete the defaultold.aspx page&lt;/p&gt;&lt;p&gt;- Tried to delete from SharePoint designer and came to know thats the&lt;br /&gt;welcome page hence we cant delete it&lt;/p&gt;&lt;p&gt;- Changed the welcome page to default.aspx from defaultold.aspx and&lt;br /&gt;deleted defaultold.aspx&lt;/p&gt;&lt;p&gt;- Tried browsing the home page with original default.aspx &amp;gt; site comes up fine&lt;/p&gt;&lt;p&gt;- They have 403 forbidden error on stock quote webpart and we had to&lt;br /&gt;close news web part (it is not a WSP file and its a DLL so I couldnt&lt;br /&gt;deploy it)&lt;/p&gt;&lt;p&gt;- So apart from above 2 web parts everything is back in place&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4133665924306639823?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4133665924306639823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4133665924306639823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4133665924306639823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4133665924306639823'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/04/we-had-some-trouble-with-sharepoint.html' title='We had some trouble with Sharepoint this week'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8959244005537477024</id><published>2008-03-31T18:45:00.002-04:00</published><updated>2008-03-31T18:50:29.804-04:00</updated><title type='text'>Setting up a file system crawl</title><content type='html'>&lt;span style="font-size:100%;"&gt;Today I got an AD account from our IS department that had enough permissions to do a file crawl.  They asked me to test crawling all the directories located on our department fileshare&lt;/span&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;This requires setting up two documents.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The first setting is the Crawl Source.  You access this via your Shared Services Administrative web site. &lt;/span&gt;  &lt;span style="font-size:100%;"&gt;From there, go to Search Settings then Content Sources and crawl schedules.&lt;/span&gt;&lt;br /&gt;&lt;img src="http://mail.google.com/mail/?ui=2&amp;amp;ik=306df6767f&amp;amp;attid=0.1&amp;amp;disp=emb&amp;amp;view=att&amp;amp;th=1190641a1dd4fe02" /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;As you can see from this screen shot, you can set the path and the crawl schedule. &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Notice that there's no where to put account information.  For that you need to configure a Crawl Rule.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Crawl rules are accessed from the Search Settings page, and are the next item below Content Sources.  &lt;/span&gt;&lt;br /&gt;&lt;img src="http://mail.google.com/mail/?ui=2&amp;amp;ik=306df6767f&amp;amp;attid=0.2&amp;amp;disp=emb&amp;amp;view=att&amp;amp;th=1190641a1dd4fe02" /&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;As you can see from the screen shot above, this is where you can configure what account Sharepoint uses to crawl the content.  Notice also the bit about crawling URLs with ? marks.  In this case, we're crawling a file server, so this doesn't have any affect.  If we were crawling a Sharepoint site, it would ensure that all the subpages get crawled. &lt;br /&gt;&lt;br /&gt;My first full crawl took several hours to complete.  Next up will be fine-tuning the crawl schedule, and checking the logs to see what iFilters need to be installed.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8959244005537477024?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8959244005537477024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8959244005537477024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8959244005537477024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8959244005537477024'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/setting-up-file-system-crawl.html' title='Setting up a file system crawl'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1925107207063580398</id><published>2008-03-31T18:43:00.001-04:00</published><updated>2008-03-31T18:43:41.340-04:00</updated><title type='text'>Search changes</title><content type='html'>After my recent class at Mindsharp, I&amp;#39;ve made a few changes to the way&lt;br&gt;search indexing is currently running. The class was focused on the new&lt;br&gt;Search Server 2008, but happily, most of the information applied to&lt;br&gt;our current search services for MOSS 2007.&lt;p&gt;Based on what I learned, I adjusted our crawl schedule to run a full&lt;br&gt;crawl only once per month instead of daily.&lt;br&gt;I also adjust the indexer to use all web front end boxes to index the&lt;br&gt;Sharepoint sites instead of running on a dedicated server which is how&lt;br&gt;I&amp;#39;d had it running. My reason at the time was to confine the crawl&lt;br&gt;impact to a single server, therefore not impacting the performance on&lt;br&gt;the Web Front End boxes. This was good reasoning as far as it went,&lt;br&gt;but it turns out that the biggest impact is actually on the SQL server&lt;br&gt;backend--which gets hit just as much regardless of how many servers&lt;br&gt;are doing the crawling. In the end, using all our Web Front End boxes&lt;br&gt;to index is quicker, which frees up the SQL server sooner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1925107207063580398?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1925107207063580398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1925107207063580398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1925107207063580398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1925107207063580398'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/search-changes.html' title='Search changes'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7425672878184145975</id><published>2008-03-18T13:49:00.003-04:00</published><updated>2008-03-18T14:07:27.569-04:00</updated><title type='text'>What I'm trying to do with my Domino migration tool</title><content type='html'>A few months ago, VP asked me to look at migrating one of our Notes apps to Sharepoint.  He asked me to take a look at an existing database called OpenLink.  At the time, I looked at the application, saw that it uses 4 different Notes forms and associated views.  I recreated the forms in Infopath easily enough, and created Document Libraries to go along with them.&lt;br /&gt;&lt;br /&gt;Dave looked at what I'd done, and pointed out that only 1 of the forms was really complicated enough to justify using an Infopath form.  The rest would work much better as simple lists.  He was right, of course, so I rebuilt the Sharepoint site accordingly.  We now had a good reproduction of the Notes database written as a Sharepoint site.  I'll even flatter myself in saying that the new version looked better:&lt;br /&gt;&lt;br /&gt;Notes&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CkvVbJNTM4g/R-ACVPdGQlI/AAAAAAAAAFQ/Khl-qbhnHb8/s1600-h/notesform.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_CkvVbJNTM4g/R-ACVPdGQlI/AAAAAAAAAFQ/Khl-qbhnHb8/s200/notesform.png" alt="" id="BLOGGER_PHOTO_ID_5179142135425155666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;                                       Infopath&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R-AEU_dGQoI/AAAAAAAAAFo/QnX8gOCQWpY/s1600-h/infopathform.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R-AEU_dGQoI/AAAAAAAAAFo/QnX8gOCQWpY/s200/infopathform.png" alt="" id="BLOGGER_PHOTO_ID_5179144330153443970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So far, so good.  But we still had all that information entered in the existing Notes database, with no way to transfer it to the Sharepoint site.&lt;br /&gt;Microsoft has a tool for migrating data...but it will only import it into a Sharepoint List.  There is no tool to migrate into Infopath.  This is where I left my effort for several weeks.&lt;br /&gt;&lt;br /&gt;Eventually, I decided that if a tool didn't exist already, I could make it myself.  After a great deal of trouble, and a great deal of assistance from D,  I now have a working Notes to Infopath migration tool.  The screen shot you're looking at above is of a file created by this tool.  I've been able to migrate all 1,268 documents in the Notes database over to the Sharepoint site.&lt;br /&gt;&lt;br /&gt;The tool reads in the Notes fields and the Infopath fields, then asks you to map the two to each other.  Since the field mapping is selected each time an import is run, we should be able to use this same tool to migrate data from *any* Notes database.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CkvVbJNTM4g/R-ACxPdGQnI/AAAAAAAAAFg/H4ztuZl0wW0/s1600-h/migrateform.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_CkvVbJNTM4g/R-ACxPdGQnI/AAAAAAAAAFg/H4ztuZl0wW0/s200/migrateform.png" alt="" id="BLOGGER_PHOTO_ID_5179142616461492850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some limitations -- the biggest being that file attachments cannot be migrated.  And there are some trouble spots -- Options selected via radio buttons or check lists may have to be manually adjusted after being imported.  But 90% of a document's fields come over without problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7425672878184145975?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7425672878184145975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7425672878184145975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7425672878184145975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7425672878184145975'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/blog-post.html' title='What I&apos;m trying to do with my Domino migration tool'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_CkvVbJNTM4g/R-ACVPdGQlI/AAAAAAAAAFQ/Khl-qbhnHb8/s72-c/notesform.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-780439253935165788</id><published>2008-03-16T12:47:00.003-04:00</published><updated>2008-03-16T13:04:30.386-04:00</updated><title type='text'>New version of Domino to Infopath tool uploaded</title><content type='html'>I've just uploaded a new version of my Domino to Infopath tool.  You can download a copy &lt;a href="https://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=CSVtoInfopathTool&amp;amp;ReleaseId=672"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This latest version is an overhaul of the mapping screen's UI.  I changed it from a single window that expanded to include all the fields, to a nicer tabbed interface.  Now you get 14 fields on a tab, and the tool automatically adds additional tabs as needed.  Nothing special about 14, I just thought it looked nice.&lt;br /&gt;&lt;br /&gt;It took me longer than I thought it would to get this release out.  I'd read on various web sites that controls in a tabpage could be referenced just like tabs on a form: this.Controls(controlName).&lt;br /&gt;Turns out this isn't true.  I eventually figured out that I needed to reference each control by the tabpage it appears on.  I ended up with this little code nugget:&lt;br /&gt;              &lt;br /&gt;               foreach (TabPage currentpage in tabControl1.TabPages)&lt;br /&gt;               {  foreach (Control currentfield in currentpage.Controls)&lt;br /&gt;                   {   if (currentfield.Name == filename)&lt;br /&gt;                       {    arraymap[n] = myItem.Text;}  }  }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-780439253935165788?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/780439253935165788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=780439253935165788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/780439253935165788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/780439253935165788'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/new-version-of-domino-to-infopath-tool.html' title='New version of Domino to Infopath tool uploaded'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5019105470358965645</id><published>2008-03-14T13:57:00.001-04:00</published><updated>2008-03-14T13:58:50.180-04:00</updated><title type='text'>Backup software is working</title><content type='html'>I finally got the backup software we purchased from EMC months ago working.  I'd been working with tech support at EMC.  Early on they had focused on the customized theme that we'd been using for our look and feel.&lt;br /&gt;Turns out they were right.  The consultants who created the theme for us, and rolled it out to our servers, got 2 out of the 3 servers set up correctly, and completely botched the 3rd machine.  That third machine had no entries for the custom theme in the SPThemes.XML file, and was missing several graphic files in the theme folder.&lt;br /&gt;Once I corrected these mistakes, the backup software ran normally.  I'm now very happy to have document level backups available.  To test, I did a backup of all our MySites, deleted a couple of items from my Shared Documents folder, and then restored the deleted files.  It all seemed to work perfectly.&lt;br /&gt;I've scheduled a full backup of the Portal site and MySites to run every Sunday.  MySites at 5:00am, Portal at 6:00am.  I've also scheduled incremental updates to run every day at 5:30am and 6:30am.  This backup tool uses the built-in Windows scheduler so it'll be easy to adjust these schedules.&lt;br /&gt;I'm honestly not sure yet how the software handles rotation.  I'm going to let things run for a week, and then decided on a rotation schedule.&lt;br /&gt;I don't completely trust this new software, so I'll continue running my stsadm -o backup scripts for the next few weeks/months.  We have plenty of storage space on the server to keep both sets of backups.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5019105470358965645?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5019105470358965645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5019105470358965645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5019105470358965645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5019105470358965645'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/backup-software-is-working.html' title='Backup software is working'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-4134193833521179406</id><published>2008-03-13T16:23:00.005-04:00</published><updated>2008-03-13T16:40:50.063-04:00</updated><title type='text'>Fixed major bugs in my Domino to Sharepoint (Infopath) migration tool</title><content type='html'>I spent a good portion of the day today fixing the bugs in my import tool. When I started, I knew of 2 major bugs.&lt;br /&gt;The first was that the field information was being updated with a few extra characters. I was able to quickly track this down to the string.Substring parameters being off. That was an easy fix.&lt;br /&gt;The second bug was something I'd noticed when I ran my first working version against a full CSV. The application bombed out after creating about 1,100 of the 1,250 files. When I ran the app again under the debugger, I could see that one of my file names had a / in it. Windows interpreted this as a directory name, and bombed when it couldn't find the file. I added some code to remove / and \ from filenames.&lt;br /&gt;&lt;br /&gt;Everything seemed great at that point, so I brought over S to show off what I'd done. When I'd run my tests, I was mapping every field so I could verify that everything was written correctly. To save time when showing it to S, I mapped the first few fields and left the rest unmapped. Disaster! The files generated, but they weren't valid XML. Looking into the file with Notepad, I could see that the same field value was being plunked into every line.&lt;br /&gt;&lt;br /&gt;Long story short, I found a major flaw in my logic. I had been searching for matches by taking the name of the mapped XML tag -- say CompanyName, putting a &gt; at the end, and searching for matching text in the current line of my file.&lt;br /&gt;So, it searches the current line for "CompanyName&gt;" when a match is found, I do some fiddling with the string and &lt;?xml:namespace prefix = myfields /&gt;&lt;myfields:companyname&gt;insert my new data.&lt;br /&gt;The trouble was, I did the same check every time, so if the XML tag was blank, I would search for the matching text of "&gt;". Of course, I found a match every time.&lt;br /&gt;Simple solution was to do my search only if the XML tag name wasn't blank.&lt;br /&gt;&lt;br /&gt;I now have a working application which, as far as I can tell, doesn't have any outstanding bugs. That is to say, it does what I expect it to do. The application is still as ugly as sin, with field names overlapping, and a giant window that stretches to fill the entire screen. Tomorrow I'll work on prettying it up.&lt;br /&gt;&lt;br /&gt;You can download the current version here: &lt;a href="http://code.msdn.microsoft.com/CSVtoInfopathTool"&gt;http://code.msdn.microsoft.com/CSVtoInfopathTool&lt;/a&gt;&lt;br /&gt;&lt;/myfields:companyname&gt;&lt;myfields:companyname&gt;&lt;/myfields:companyname&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-4134193833521179406?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/4134193833521179406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=4134193833521179406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4134193833521179406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/4134193833521179406'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/fixed-all-major-bugs-inthe-csv-tool.html' title='Fixed major bugs in my Domino to Sharepoint (Infopath) migration tool'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-9180071093412636736</id><published>2008-03-12T15:56:00.005-04:00</published><updated>2008-03-13T16:39:35.657-04:00</updated><title type='text'>Today's waste of time</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R9g1k_dGQkI/AAAAAAAAAFI/xJ4ErBXTFsg/s1600-h/BlackWhitevisual+studio+icon.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5176946681287426626" style="FLOAT: left; MARGIN: 0pt 10px 10px 0pt; CURSOR: pointer" alt="" src="http://bp3.blogger.com/_CkvVbJNTM4g/R9g1k_dGQkI/AAAAAAAAAFI/xJ4ErBXTFsg/s200/BlackWhitevisual+studio+icon.png" border="0" /&gt;&lt;/a&gt;I've been working with Visual Studio a great deal lately. First to build my Sharepoint Warm Up tool, SPWakeUp, and then while building my CSV to Infopath migration tool.&lt;br /&gt;We recently received Visual Studio 2008 at work and I decided to upgrade. Unusually for a Microsoft product, Visual Studio lets you install the newest version without replacing the old version. This made me very happy, so I kept 2005 installed.&lt;br /&gt;&lt;br /&gt;I use &lt;a href="http://rocketdock.com/"&gt;RocketDock&lt;/a&gt; to manage my applications, so I immediately added VS 2008 to my bar. The new program icon is more or less identical to the old version. To make it easier to tell the two versions apart, I made this black &amp;amp; white icon for VS 2005.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-9180071093412636736?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/9180071093412636736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=9180071093412636736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9180071093412636736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9180071093412636736'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/todays-waste-of-time.html' title='Today&apos;s waste of time'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_CkvVbJNTM4g/R9g1k_dGQkI/AAAAAAAAAFI/xJ4ErBXTFsg/s72-c/BlackWhitevisual+studio+icon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-9134680593710590173</id><published>2008-03-12T14:16:00.002-04:00</published><updated>2008-03-13T16:40:26.853-04:00</updated><title type='text'>Completed first version of Domino to Sharepoint (Infopath) migration tool</title><content type='html'>I've got a working application now. Still to do:&lt;br /&gt;1) The interface is a bit rough. Fields overlap, and I need to make 2 columns in order to keep the window size reasonable.&lt;br /&gt;2) My first import of all the OpenLink documents died about 1,100 documents in to the full 1,300 document list. Not sure what happened there.&lt;br /&gt;3) Need to do some clean-up of file names. I think I'll strip out spaces, and maybe other control type characters.&lt;br /&gt;4) Check on the code that writes the values. I may be adding extra characters.&lt;br /&gt;&lt;br /&gt;So, we're not perfect yet. But of the 1,100 documents that did import, they seemed about 90% there. Just a few tweaks to make sure I get all the information in correctly, and then I need to beautify the interface. The heavy lifting is done.&lt;br /&gt;&lt;br /&gt;You can download a copy here: &lt;a href="http://code.msdn.microsoft.com/CSVtoInfopathTool"&gt;http://code.msdn.microsoft.com/CSVtoInfopathTool&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-9134680593710590173?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/9134680593710590173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=9134680593710590173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9134680593710590173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9134680593710590173'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/completed-first-version-of-csv-to.html' title='Completed first version of Domino to Sharepoint (Infopath) migration tool'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5759149054160819032</id><published>2008-03-10T12:41:00.002-04:00</published><updated>2008-03-10T12:46:16.151-04:00</updated><title type='text'>Working on CSV migration application</title><content type='html'>When VP first asked me to recreate our OpenLink application in Sharepoint, I knew that I wanted to be able to migrate existing Domino documents into Infopath forms.  Microsoft supplies a tool for Sharepoint that migrates Domino apps, but that tool will only export information into a list.  Lists are nice, but they don't allow any form layout, or code with the form.&lt;br /&gt;&lt;br /&gt;For OpenLink, I ended up creating a rather complex Infopath form, that mirrored the form used by the Domino application.  I decided that I would create an application to migrate a CSV export of the Domino data into XML Infopath documents.  I got as far as creating buttons that allowed the user to select the files.  After that, I ran into the wall that was my complete ignorance of C#.&lt;br /&gt;&lt;br /&gt;The application sat on my machine for the last few months, and I moved onto other things.  Now I'm taking another look.  With the experience I gained building the Wake Up script, I've been able to make some more progress.  The app currently is able to read the CSV file and store the elements into an array.  I'm working now on getting the XML fields read in.&lt;br /&gt;&lt;br /&gt;This is where I'm running into another wall of ignorance.  I've worked with XML files for years, but only in the sense that I've editted existing documents, or peaked inside to find some information.  I've never needed to know them well enough to actually create them from scratch.  So, I'm currently reading up on XML files.&lt;br /&gt;&lt;br /&gt;(Part of me wants to just read the Infopath files as plain text, and just set my tags manually.  A brute-force approach, if you will.  I'm sure I could get this to work without too much trouble, but it's not elegant.  I want to do this the right way.)&lt;br /&gt;&lt;br /&gt;Once I have this application built, I think it's going to be very useful.  As invisaged, it will allow you to migrate data in a CSV file into an XML form.  I've been assuming the the data would come from Domino databases, and the form would be an Infopath document, but there's no reason they have to be.  In theory, any CSV data or XML document would work.  Once I get it running, that is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5759149054160819032?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5759149054160819032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5759149054160819032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5759149054160819032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5759149054160819032'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/working-on-csv-migration-application.html' title='Working on CSV migration application'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8406695926326821634</id><published>2008-03-06T12:23:00.002-05:00</published><updated>2008-03-06T12:44:49.002-05:00</updated><title type='text'>Fixed bugs with SPWakeUp app</title><content type='html'>After running it overnight on the production box, I realized I had some problems. Watching it closely, I discovered two things, 1) It couldn't handle URLs with spaces, and 2) It was mangling some of the addresses.&lt;br /&gt;&lt;br /&gt;A quick look at how Sharepoint handles addresses showed that it replaces any spaces it finds with %20. This made for an easy fix, using the command string.Replace(" ","%20");&lt;br /&gt;&lt;br /&gt;The second problem was a bit trickier. I had been using the TrimEnd method to look for the XML tag,&lt;/subweb&gt; but I didn't understand how TrimEnd works. Instead of just removing the first instance of each letter, it kept going until it ran into a letter that it wasn't supposed to remove. The result was that sites whose URLs ended with an e were having that character stripped.&lt;br /&gt;&lt;br /&gt;The fix was very simple. Since the URL always ends with the same tag, and the tag is always 9 characters long, I just removed the last 9 characters: cmd_output.Remove((stringlength -9));&lt;br /&gt;&lt;br /&gt;That fixed my two bugs, and everything is now testing OK.&lt;br /&gt;&lt;br /&gt;But that led me to another problem: the whole point of my application was to actually open each web site, which would require the server to rebuild the site, thereby getting it back in cached memory. But my code wasn't really opening the site.&lt;br /&gt;&lt;br /&gt;Here's where my lack of coding for the last few years was hurting me. I'd found the addresses, and I'd built the HTTP request, but my code never actually contacted the site! Oops. I did a little more fishing with Google, and came across &lt;a href="http://www.nonsequiturs.com/posts/Perform_an_HTTP_GET_Using_CSharp"&gt;a great explanation&lt;/a&gt; of exactly how to build HTTP requests. Once I understood a little better what I was doing, my error became obvious.&lt;br /&gt;&lt;br /&gt;I ended up stealing the code used by the example, and decided to send the resulting HTML code to the console. Now that I had everything put together, I rebuilt my .exe and ran everything again. Success! It's especially nice to be able to see the full content of each page as a verification that the request is actually working properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8406695926326821634?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8406695926326821634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8406695926326821634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8406695926326821634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8406695926326821634'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/fixed-bugs-with-spwakeup-app.html' title='Fixed bugs with SPWakeUp app'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-9025767973620605961</id><published>2008-03-05T16:09:00.000-05:00</published><updated>2008-03-05T16:10:42.156-05:00</updated><title type='text'>Sharepoint Howto: Migrate a site</title><content type='html'>I know of two ways to migrate a site: using the stsadm command line tool, and using the Sharepoint Designer application.  In this post, I'll go over using stsadm.&lt;br /&gt;&lt;br /&gt;There are two steps to migrating a site, exporting and importing.  You begin by exporting the site you wish to move.  Here is the command for this as I usually use it:&lt;br /&gt;stsadm -o export -url http://somesite.com/site -filename c:\export\filename -includeusersecurity&lt;br /&gt;This export uses all the default values.  Most of these are self explanatory.  The includeusersecurity copies any access groups used by the group along with their membership. &lt;br /&gt;&lt;br /&gt;Once your export has completed, you'll have several files ending with a .cmp extension.  These are the actual exported files, compressed to save space.  You'll also have an export log file.  Take a look at this to see if there were any errors.&lt;br /&gt;&lt;br /&gt;If you're migrating to a new physical server, you need to copy all the .cmp files to that server.  I usually create a new folder on the c drive called import.&lt;br /&gt;&lt;br /&gt;Before you can import your site, you need to have an empty site of the same type already created.  Just create a site with the Title and URL you want to use via the Site Actions menu on the browser.  The template has to be the same as the template used to create the original site.  This means that any custom templates you've created need to be installed on the new server before you can migrate anything.&lt;br /&gt;&lt;br /&gt;Once your empty site is created, the import process is basically a mirror image of the export.&lt;br /&gt;The command I usually use is:&lt;br /&gt;stsadm -o import -url http://newsite.com/site -filename c:\import\exportfile.cmp -includeusersecurity&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-9025767973620605961?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/9025767973620605961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=9025767973620605961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9025767973620605961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/9025767973620605961'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/sharepoint-howto-migrate-site.html' title='Sharepoint Howto: Migrate a site'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8246482458330445013</id><published>2008-03-05T11:11:00.003-05:00</published><updated>2008-03-05T11:36:20.956-05:00</updated><title type='text'>Created new Sharepoint warm up script - SPWakeUp</title><content type='html'>Several months ago, I found a warmup script on the internet: &lt;a href="http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx"&gt;WarmupServer.&lt;/a&gt;&lt;br /&gt;I've been using this script on our servers ever since, running it every morning to refresh the page cache on IIS. It's been working great...but I've noticed a problem. The script lets you "warm up" as many sites as you want, but you have to edit a batch file to add the URL.&lt;br /&gt;&lt;br /&gt;Our Sharepoint server is getting pretty big; what used to be a few dozen sites is quickly growing into the hundreds. The batch script just isn't cutting it anymore.&lt;br /&gt;&lt;br /&gt;Yesterday, I decided to write something better. Instead of requiring that each URL be manually added to a list, you give this script a starting point, and it automatically builds a list of all the sub sites. You can go as many layers deep as you want. (IE: Subsites of a subsite of a subsite) The deeper you want to search, the longer it takes, of course, but it still is able to touch every site on our portal in about 2 minutes.&lt;br /&gt;&lt;br /&gt;This was my first C# project, so I learned a great deal putting it together. You can download a copy at &lt;a href="http://code.msdn.microsoft.com/spwakeup"&gt;http://code.msdn.microsoft.com/spwakeup&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8246482458330445013?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8246482458330445013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8246482458330445013' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8246482458330445013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8246482458330445013'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/created-new-warmup-script-spwakeup.html' title='Created new Sharepoint warm up script - SPWakeUp'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1728315368423819379</id><published>2008-03-03T16:53:00.006-05:00</published><updated>2008-03-03T17:03:35.537-05:00</updated><title type='text'>Training -- Howto create links in Lotus Notes</title><content type='html'>I had a training session today with a new employee.  She is the new Admin  Assistant to the #2 person in the company.  It's a rather important position, so  I spent more time than I normally would on a simple training session like this.    &lt;div&gt; &lt;/div&gt; &lt;div&gt;I walked her through the basics of email and calendar, with an emphasis on  the calendar, and stressed that she should call with any problems.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Later in the day, she did call with a list of databases she wanted access  to.  I took the opportunity in my reply to illustrate how Document and Database  links were created.  Here's a copy of that section of my reply:&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt; &lt;/span&gt;&lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;You start by opening the database/document you want to link to.&lt;/span&gt;&lt;/p&gt; &lt;span style=";font-family:Helv;font-size:85%;"  &gt; &lt;/span&gt;&lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;With the database open, click Edit...Copy As...Application Link. (In earlier  versions of Notes, it was called Database Link instead of Application Link, but  everything else worked the same way)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R8x0wBbd-WI/AAAAAAAAAEw/egCtZGhMnEc/s1600-h/EditMenuDatabaseLink.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R8x0wBbd-WI/AAAAAAAAAEw/egCtZGhMnEc/s200/EditMenuDatabaseLink.png" alt="" id="BLOGGER_PHOTO_ID_5173638440308046178" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;It will look like nothing has happened, but you now have the link in your  clipboard.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;Next create an email message. In the body of the message click Edit...Paste  (Alternately, you can right-click and select Paste from the pop-up menu. Or, you  can just press Ctrl-V on the keyboard.)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_CkvVbJNTM4g/R8x02hbd-XI/AAAAAAAAAE4/OPJJJ1cYl1A/s1600-h/pastemenu.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_CkvVbJNTM4g/R8x02hbd-XI/AAAAAAAAAE4/OPJJJ1cYl1A/s200/pastemenu.png" alt="" id="BLOGGER_PHOTO_ID_5173638551977195890" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;You'll now see an icon like this: &lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R8x0EBbd-UI/AAAAAAAAAEg/k5bn9oqGTJ0/s1600-h/databaselink.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R8x0EBbd-UI/AAAAAAAAAEg/k5bn9oqGTJ0/s200/databaselink.png" alt="" id="BLOGGER_PHOTO_ID_5173637684393802050" border="0" /&gt;&lt;/a&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt; &lt;/span&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;The blue book icon means your link is to an application.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;For a document link, you do basically the same thing, except that you would  first open or select a document and then click Edit...Copy As...Document  Link.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;When you paste your link, it will look like this:&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CkvVbJNTM4g/R8x0KRbd-VI/AAAAAAAAAEo/Nx2WnuvP0iQ/s1600-h/documentlink.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_CkvVbJNTM4g/R8x0KRbd-VI/AAAAAAAAAEo/Nx2WnuvP0iQ/s200/documentlink.png" alt="" id="BLOGGER_PHOTO_ID_5173637791767984466" border="0" /&gt;&lt;/a&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt; &lt;/span&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt; The yellow paper icon means that your link is to a  document.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Helv;font-size:85%;"  &gt;There is also another type of link called a View link.  This opens a specific view in an application, for example Purchases Pending Approval in a Purchase Requisition system.  A view link looks like this:&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_CkvVbJNTM4g/R8x1Mxbd-YI/AAAAAAAAAFA/TxmYVhVLGHM/s1600-h/viewlink.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_CkvVbJNTM4g/R8x1Mxbd-YI/AAAAAAAAAFA/TxmYVhVLGHM/s200/viewlink.png" alt="" id="BLOGGER_PHOTO_ID_5173638934229285250" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1728315368423819379?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1728315368423819379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1728315368423819379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1728315368423819379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1728315368423819379'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/03/training-howto-create-links-in-lotus.html' title='Training -- Howto create links in Lotus Notes'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_CkvVbJNTM4g/R8x0wBbd-WI/AAAAAAAAAEw/egCtZGhMnEc/s72-c/EditMenuDatabaseLink.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5662476012844652752</id><published>2008-02-29T13:59:00.005-05:00</published><updated>2008-02-29T16:10:27.869-05:00</updated><title type='text'>Stock Quote formatting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R8h0eBbd-QI/AAAAAAAAAEA/Ou2BtdDji7g/s1600-h/stock.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R8h0eBbd-QI/AAAAAAAAAEA/Ou2BtdDji7g/s200/stock.png" alt="" id="BLOGGER_PHOTO_ID_5172512231163558146" border="0" /&gt;&lt;/a&gt;I took a look at the code behind the stock quote Web Part yesterday. I noticed that the text was formatted with HTML tags, and wondered if there was anything I could do to improve the formatting.&lt;br /&gt;&lt;div&gt;&lt;div&gt;A quick look at the vendor's web site, turned up a few examples, along with a list of available information. I used this to tweak the current display, mostly by adding a % change line.&lt;br /&gt;I put my change up on the test server and everyone seemed to like it. VP had me put it up on the production box.&lt;br /&gt;&lt;br /&gt;We ran into a small problem -- I changed the HTML code one too many times, and the stock quote server kicked us off. The public stock server is set to allow so many requests per hour from a single IP. We went over that limit because every time I made a change to the HTML, it requested the stock price from the server. By the next morning everything was back to normal.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5662476012844652752?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5662476012844652752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5662476012844652752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5662476012844652752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5662476012844652752'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/stock-quote-formatting.html' title='Stock Quote formatting'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_CkvVbJNTM4g/R8h0eBbd-QI/AAAAAAAAAEA/Ou2BtdDji7g/s72-c/stock.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3336762343705652376</id><published>2008-02-29T12:57:00.003-05:00</published><updated>2008-02-29T13:01:06.699-05:00</updated><title type='text'>More graphics work</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R8hIWBbd-MI/AAAAAAAAADg/8EvY6qllPzY/s1600-h/button_submit_red.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R8hIWBbd-MI/AAAAAAAAADg/8EvY6qllPzY/s200/button_submit_red.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5172463715212982466" /&gt;&lt;/a&gt;&lt;br /&gt;I'm not sure how I became the graphics guy around here, but that seems to be what I am.  D IM'd me today and asked for some changes to a button.  Basically, he just wanted to change the text on the button from Save to Submit.&lt;br /&gt;This time around, I started with a brand new graphic file.  I used my color picker tool to find the colors used on the current button.  I then used GIMP to do a gradiant fill that matched the colors.  (It's very subtle, but the top of the button is brighter than the bottom)  I matched the font by eye, and sized everything.&lt;br /&gt;All in all about 10 minutes work.  Nothing major, but this kind of work is a fun break from my normal routine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3336762343705652376?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3336762343705652376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3336762343705652376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3336762343705652376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3336762343705652376'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-graphics-work.html' title='More graphics work'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_CkvVbJNTM4g/R8hIWBbd-MI/AAAAAAAAADg/8EvY6qllPzY/s72-c/button_submit_red.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6513756021941396019</id><published>2008-02-28T09:41:00.002-05:00</published><updated>2008-02-28T09:45:52.999-05:00</updated><title type='text'>Discovered something new about workflow</title><content type='html'>I've been working with Lotus Notes for a decade now. Over all that time, I've come to know its quirks to the point that they don't seem like quirks anymore. The just seem natural. &lt;br /&gt;I've found that the same thing happens with any new system as I learn it. Part of the learning process is the getting familiar with the nuts and bolts of the software. At the same time, I'm learning how the person who made the software thinks. Granted, any application as big as Sharepoint or Domino is built by a huge team of people. Still, that team works closely enough, that certain patterns of thought will emerge.&lt;br /&gt;A Microsoft system feels different than a Lotus product. The way the designers fit things together and the assumptions they make are quite obvious.&lt;br /&gt;&lt;br /&gt;Case in point: We were working with an approval workflow. In this case, we had a form library and wanted to have a quick and easy approval cycle. The owner of the list wanted to be able to add additional approvers to each document, and then give final approval once they had signed off.&lt;br /&gt;So, I created an approval workflow, checked the box that allows additional approvers to be added and said here you go.&lt;br /&gt;This worked, but the owner noticed that the additional approvers weren't getting email notifications. Now here's where my not fully understanding how Microsoft works comes in. I double-checked my workflow, looked at some documents that were in the approval cycle, and concluded that perhaps only the first approver get an email notification. I then tried to think of work-arounds, and came up with the idea of using a second workflow in the Tasks list to get a notification out. &lt;br /&gt;Luckily before I put too much work into my "solution", a light went on in my head. I realized that my workflow was a Serial workflow. That is, the workflow is approved 1 person at a time. The first person on that list of approvers was always the same. Any additional approvers were added after this first person. &lt;br /&gt;So, the workflow was working exactly as intended. The additional approvers would receive their email notifications as soon as the first approver approved the document. I didn't see it, because I'm still not thinking the way Sharepoint thinks. Once I realized what was going on, I just changed my workflow from serial to parallel. Now additional approvers get an email notifications immediately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6513756021941396019?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6513756021941396019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6513756021941396019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6513756021941396019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6513756021941396019'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/discovered-something-new-about-workflow.html' title='Discovered something new about workflow'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-698744469312891305</id><published>2008-02-26T14:59:00.002-05:00</published><updated>2008-02-26T15:02:03.828-05:00</updated><title type='text'>Fallout from today's patch</title><content type='html'>I received two complaints this afternoon that the portal was down.  It was working fine for me, and for the other people around me, so I assumed it was a client problem.&lt;br /&gt;&lt;br /&gt;Both the people reporting trouble logged in to our network via VPN, so I started my trouble-shooting there.  Long story short, it eventually turned out to be much simpler.  When IIS was restarted on the secondary web front-end box, it did not start the Portal Web Site.  &lt;br /&gt;&lt;br /&gt;It just happened that my client, and the people around me were being shunted to the primary box by NLB.  That's why everything looked fine from my end, and I blamed the client's software.&lt;br /&gt;&lt;br /&gt;Lessons to take away: 1 - Always check the fundamentals.  Never make assumptions.&lt;br /&gt;2 - Even though you have redundant servers, and fail over up the wazoo never, ever patch during work hours.  &lt;br /&gt;&lt;br /&gt;When you do patch, check everything from the ground floor up.  Don't just load the site and test the bug that the patch is supposed to address.  Your server isn't up until you check that every level of the server is running correctly.  Just because you can see a web page doesn't mean nothing is wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-698744469312891305?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/698744469312891305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=698744469312891305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/698744469312891305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/698744469312891305'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/fallout-from-todays-patch.html' title='Fallout from today&apos;s patch'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2861736475929775304</id><published>2008-02-26T13:06:00.003-05:00</published><updated>2008-02-26T13:17:41.181-05:00</updated><title type='text'>More thoughts on Traveler</title><content type='html'>We installed Traveler on our test server yesterday, and installed the client software on a Windows Mobile device overnight.&lt;br /&gt;The server install is very simple, just a few minutes start to finish.  You also need to make two network ports available from the Internet: 80 - to retrieve the client software, and 8642(default) - which is the port used to push data to the client.&lt;br /&gt;The install software gives you the option to install the client software on a seperate server from the push server.  Say, if you already have an outward facing web server that you want to use.  We let it install everything on the test server.  As a nice touch, the installer made the client download page the default page for the server.&lt;br /&gt;&lt;br /&gt;Configuration of the Traveler server happens in the Server document.  8.0.1 adds a new Traveler tab in the server document design.  It surprised me that this new tab was in the top level, and not a subtab off the Server Tasks.  This is the first new top level tab I can remember since v6.  Traveler runs as an add-in task on the server called Traveler.&lt;br /&gt;&lt;br /&gt;Configuration is pretty simple, and there isn't much you can do beyond max messages size, and some memory usage limits.  I didn't see any way to set up configuration groups, ala Blackberry.  &lt;br /&gt;&lt;br /&gt;The client install is just as simple.  You browse to the Traveler server via your handheld.  You're given a choice of the various supported Windows Mobile flavors: Windows Mobile and Smartphone v5 and v6.  Once you install the client software, it asks for your Login name and Password (Traveler uses your HTTP/Sametime password), and the address of the Traveler server.  You're then asked what items you want to synch.  Because this was a test server, our initial synch took just a few seconds.  &lt;br /&gt;Everything seems to run as advertised so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2861736475929775304?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2861736475929775304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2861736475929775304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2861736475929775304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2861736475929775304'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-thoughts-on-traveler.html' title='More thoughts on Traveler'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2553255358387392424</id><published>2008-02-26T10:18:00.000-05:00</published><updated>2008-02-26T10:19:14.066-05:00</updated><title type='text'>Fix for workflow email bug</title><content type='html'>Microsoft finally came through with a patch for the workflow email bug.   After all the time and effort I spent convincing the Microsoft tech -- they had  already released a patch for this bug in May!  &lt;a href="http://support.microsoft.com/kb/937906"&gt;KB 937906&lt;/a&gt; to be exact.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2553255358387392424?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2553255358387392424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2553255358387392424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2553255358387392424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2553255358387392424'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/fix-for-workflow-email-bug.html' title='Fix for workflow email bug'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7392653741067843654</id><published>2008-02-21T12:44:00.002-05:00</published><updated>2008-02-21T12:47:53.150-05:00</updated><title type='text'>Creating a Test Site</title><content type='html'>&lt;div&gt;In addition to the production portal, we created a test server for our  developers to test out their applications without affecting the users.  From the  beginning, this test server hasn't been a perfect copy of the production  environment.  We copied over the templates and CSS files, but it was a rough  approximation.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Today, D asked me to make him something better.  Luckily, I had already fixed the  Export bug that had been preventing us from exporting our production server.   This morning, I ran a full export and copied the files over to the test  server.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I then created a new Web Application on Port 90.  I didn't want to break  the site already running on the test server, so I'm using a seperate Web App to  keep things separate.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I then ran my import...and ran into an error: FatalError: Could not find  WebTemplate KB#75806 with LCID 1033.  A bit of thought, and I realized that I  hadn't installed all the "Fab 40" templates from Microsoft on this server.  I  quickly installed them and tried again.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;This time I got, "Cannot import site. The exported site is based on the  template SPS#0 but the destination site is based on the template STS#0."  This  error is more obvious.  I'd created the Site Collection using the Team Site  template.  Looking at the template numbers --Why don't you include their title  in the error message, Microsoft?-- I guessed that I should have used the  Collaboration Publishing template.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Third times a charm, and this time the Import managed to finish.   All the data is there, and the design is based on  our latest template.  Now I need to install all the 3rd part Web Parts that we've added.  There  are 2 that we've bought from an outside vendor: Stock Quotes, and Flash  Images.  I've gotten the Stock Quote reinstalled, and it seems to be OK.  The Flash Image rotator says that it installs, but I cannot get it added to  a page.  It just errors out and tells me to contact technical support.  So  that's what I'll do. &lt;div&gt; &lt;/div&gt; &lt;div&gt;The other Web Parts were created for us by our vendor.  I'll need to work through  re-installing them.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7392653741067843654?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7392653741067843654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7392653741067843654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7392653741067843654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7392653741067843654'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/creating-test-site.html' title='Creating a Test Site'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2202648278830586768</id><published>2008-02-20T13:41:00.003-05:00</published><updated>2008-02-20T14:11:25.587-05:00</updated><title type='text'>Thoughts on Lotus Notes Traveller</title><content type='html'>IBM has just released the latest version of Domino, 8.0.1.  As a part of this release, they're putting out a free push client for Windows Mobile devices.  This is doubtless an attempt to counter Microsoft's own push client for Exchange server.&lt;br /&gt;I'm still waiting for a download link from IBM.  So, I've yet to play with the software, but I have a few thoughts.&lt;br /&gt;1) IBM still makes it ridiculously hard to find software downloads.  Their Passport Advantage download site is a night-mare to navigate, and doesn't remember your preferences from one visit to the next.  I've downloaded the Korean language version of Notes too many times to mention.&lt;br /&gt;2) They've made this new software a separate download.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CkvVbJNTM4g/R7x3T-aCCKI/AAAAAAAAADY/Oq2cN5QumKM/s1600-h/downloadlink.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp3.blogger.com/_CkvVbJNTM4g/R7x3T-aCCKI/AAAAAAAAADY/Oq2cN5QumKM/s200/downloadlink.png" alt="" id="BLOGGER_PHOTO_ID_5169137657367890082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;They are even forcing you to sign up for the software, then wait for a download link to be emailed to you.   But wait, it's not that easy!  They've buried the sign-up link.  It took me 10 minutes to find it.  Even when you find the right page, the actual link is just the word "here" which is itself obscured by a paragraph of text at the bottom of the page.   As a service to anyone else trying to download this software, here is a &lt;a href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?lang=en_US&amp;amp;source=swg-lnt10beta"&gt;**Direct Link**&lt;/a&gt;&lt;br /&gt;(Seriously, look at that screen-shot.  I had to circle the link to make it visible).&lt;br /&gt;3) They're requiring that you request licenses.  Wha?  The whole point of this software is that there's no extra charge, so why are they tracking licenses?&lt;br /&gt;4) Windows Mobile is the only platform supported currently.  This isn't a big deal in the North American market with that's the dominant non-Blackberry smart phone, but Nokia is king in Europe.  Also, leaving Palm users out in the cold seems a bit odd, although I'm sure they're getting used to it.&lt;br /&gt;&lt;br /&gt;At my company we currently have equal numbers of Blackberry users and Windows Mobile users running on Goodlink.  The Blackberry users are happy, so I don't see any movement there.  The Goodlink users, however, are generally not happy.  We've been with Goodlink for a couple of years now.  We were one of their earliest Notes shops, and helped test early releases of their product.  And...we've never really liked Goodlink.  It's slow.  It takes over the device it's installed on to a disturbing degree.  It kills battery life.&lt;br /&gt;The only reason we've been running it was that there was no real alternative.  If Traveller is up to snuff, I have no doubt that we'll shut down our Goodlink server within a year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2202648278830586768?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2202648278830586768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2202648278830586768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2202648278830586768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2202648278830586768'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/thoughts-on-lotus-notes-traveller.html' title='Thoughts on Lotus Notes Traveller'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_CkvVbJNTM4g/R7x3T-aCCKI/AAAAAAAAADY/Oq2cN5QumKM/s72-c/downloadlink.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2574045194340438792</id><published>2008-02-15T14:20:00.003-05:00</published><updated>2008-02-15T14:25:15.731-05:00</updated><title type='text'>PDF Searching Trouble or Thanks Windows x64!</title><content type='html'>&lt;div&gt;VP noticed that PDF files weren't being indexed on the production  servers.  This is something I'd looked at when I was fist setting up the  servers, but hadn't revisited since then.  Mea Culpa.&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I had time yesterday afternoon to track down the answer.  It turns out our  problem is caused by running Windows Server x64.  The iFilter that Adobe provides  will only run on an x32 OS.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Luckily, a third party has created their own PDF iFilter for x64.  They're  the same people who put out the Foxxit PDF reader that I've been using for  years.  The only drawback is that they charge for commercial use.  Since the  cost is under $800, I don't think this will be a problem.&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Following the exellent instructions &lt;a href="http://blogs.msdn.com/ifilter/archive/2007/05/10/long-awaited-64-bit-pdf-ifilter-finally-available.aspx"&gt;here&lt;/a&gt;, I went ahead and installed the iFilter on the search server, and it's working  perfectly.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2574045194340438792?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2574045194340438792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2574045194340438792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2574045194340438792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2574045194340438792'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/pdf-searching-trouble-or-thanks-windows.html' title='PDF Searching Trouble or Thanks Windows x64!'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6354504633275708755</id><published>2008-02-15T14:16:00.002-05:00</published><updated>2008-02-15T14:19:26.633-05:00</updated><title type='text'>More on the email bug</title><content type='html'>&lt;div&gt;I opened a case with IBM today.  I explained the problem we were seeing,  and forwarded them a copy of the problem message.  I showed them the work-around I found  and they verified that everything worked as I described it in their own test  server.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;As expected, they're blaming it on Microsoft.  I insisted that they keep  the ticket open, and investigate creating an agent for the mail.box that will  strip out the extra lines causing all the trouble.  Also as expected, they don't  advise that approach because it will kill mail routing performance.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Next step is to open an issue with Microsoft.  I'm 99% certain that there's a bug in the notification code, so this should be a simple fix.  I would have called Microsoft first, but we share our support contract with the networking team, and they are very jealous of the time.&lt;br /&gt;&lt;br /&gt;I just hope I've done enough ground work to justify opening a case with MS.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6354504633275708755?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6354504633275708755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6354504633275708755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6354504633275708755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6354504633275708755'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-on-email-bug.html' title='More on the email bug'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8248812304610527286</id><published>2008-02-14T14:52:00.005-05:00</published><updated>2008-02-14T15:07:38.439-05:00</updated><title type='text'>Tracking down an email bug</title><content type='html'>We're currently a Lotus Notes shop for email.  Normally Notes and Sharepoint get along fairly well, but I've run into a problem.&lt;br /&gt;&lt;br /&gt;When a user submits a document that kicks off a workflow, the system emails them a notification message.  This message lets the user know what is happening and provides a link to the workflow so the user can track its progress. These messages are coming through in raw text. &lt;br /&gt;&lt;br /&gt;Instead of seeing:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Test has started on uhs-mainnav-outer-left.&lt;br /&gt;Participants are ANDREW KENNEL&lt;br /&gt;Each person will receive a task to approve uhs-mainnav-outer-left. The tasks will be assigned one at a time in the order shown above.&lt;br /&gt;View the status of this workflow.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;They are seeing:&lt;br /&gt;TABLE.mail { border-style:none; border-collapse:collapse; font:8pt Tahoma; width:100%; }TD.header { background:#F8F8F9; border:1px solid #E8EAEC; padding:12pt 10px 4pt 10px; }TD.body { padding:12pt 10px 24pt 10px; }TD.footer { border-width:1px; border-style:solid none none none; border-color:#9CA3AD; padding:4pt 10px 4pt 10px; }A { text-decoration:none; }DIV.title { font:16pt Verdana; }DIV.headertext .....etc, etc.&lt;br /&gt;&lt;br /&gt;At first, I thought this was happening because the messages were missing the HTML header tags.  So I tried adding the tags to the messages and sending them manually by telneting into our mail server.  No luck.&lt;br /&gt;&lt;br /&gt;After playing around for a bit, I found that I could get the message to appear correctly as long as the first line of the message was not blank.  I think I've found a bug in Sharepoint that is inserting a blank line at the top of these messages.  I'm guessing here, but I think Exchange strips off this blank line and dispays the message correctly.  Notes does not strip the blank line, and so displays the message as raw text.  That would explain why I can't find mention of this error affecting anyone else.&lt;br /&gt;&lt;br /&gt;That doesn't tell me how to fix the problem, of course.  I'll have to go through MS to get a bug fix, or convince IBM to create a fix for Domino.&lt;br /&gt;&lt;br /&gt;Incidentally, this only affects the notifications messages sent to the person submitting the document.  All other notifications (Please approve, Your document has been approved, etc) come through correctly.  That seems to bulster my idea that Sharepoint is unintentionally padding an extra space at the top of the message.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8248812304610527286?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8248812304610527286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8248812304610527286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8248812304610527286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8248812304610527286'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/tracking-down-email-bug.html' title='Tracking down an email bug'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6761065159547224490</id><published>2008-02-14T14:41:00.000-05:00</published><updated>2008-02-14T14:42:23.293-05:00</updated><title type='text'>Created a tuition reimbursement form in Infopath</title><content type='html'>This is getting easier.  I've found it's best to go over a print-out of the form you're migrating first and group the information into sections.  For example, in this form I had the following sections: Employee Info, Course Info, Justifications, and Approval.&lt;br /&gt;Once you have groups for each of the sections created, it's a simple matter of filling in the necessary fields.&lt;br /&gt;&lt;br /&gt;Since the sections roughly mirrored the layout of this form, I created 4 1x1 layout tables stacked one on top of eachother.   This let me concentrate on one layout section at a time.  When I got to the Course Info, I realized that I'd made my layout sections too small.  Since everything was already in a table, I just had to resize the 4 layout tables and everything lined up again.&lt;br /&gt;&lt;br /&gt;Start to finish, I had a good looking form created in about 20 minutes.  This was a simple form with only 21 fields and 2 repeating sections, but I've found this approach scales up to very large forms as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6761065159547224490?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6761065159547224490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6761065159547224490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6761065159547224490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6761065159547224490'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/created-tuition-reimbursement-form-in.html' title='Created a tuition reimbursement form in Infopath'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7268067886417600293</id><published>2008-02-14T10:30:00.015-05:00</published><updated>2008-02-14T10:42:51.778-05:00</updated><title type='text'>More graphic work</title><content type='html'>&lt;a href="http://bp1.blogger.com/_CkvVbJNTM4g/R7RhXeaCCJI/AAAAAAAAADQ/DZmPx8GTq54/s1600-h/uhs-mainnav-outer-left.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5166861728427935890" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_CkvVbJNTM4g/R7RhXeaCCJI/AAAAAAAAADQ/DZmPx8GTq54/s200/uhs-mainnav-outer-left.png" border="0" /&gt;&lt;/a&gt;We're resizing the menu bar to make it smaller. This means that some of the graphics need to be shrunk accordingly. Two in particular that stick out (literally) are the end caps. These graphics give the menu nicely curved sides.&lt;br /&gt;&lt;br /&gt;Once again, I was volunteered to make the change. I started work yesterday afternoon and got absolutely nowhere. I was using my favorite tool, Paint.net, and for the first time, ran into something a little too complex for what is basically an advanced version of MS Paint.&lt;br /&gt;&lt;br /&gt;This morning I took another crack at the problem, and this time switched over to the GIMP. Much better. I need to start forcing myself to use this tool for more of my work.&lt;br /&gt;&lt;br /&gt;The resize was a little tricky because the image was gradiant shaded, top to bottom. Luckily, we only had to remove 7 pixels of hight from the 47 pixel tall image. I was able to remove the pixels from the sections of the image that were straight, so I didn't have to adjust the curve.&lt;br /&gt;&lt;br /&gt;The colors were still off at that point, so I pulled up a screen shot of the smaller menu and painted pixel by pixel to match the new darker colors. Some of the borders then needed to be darkened so they would still stand out. That sounds arduous, but we're only talking about a few hundred pixels total.&lt;br /&gt;&lt;br /&gt;Once my adjustments had been made, I used the pngcrush tool I mentioned in an earlier post to protect the files from IE. Since the left and right graphics were mirror images, I just worked on the left graphic, then flipped it to make the right graphic.&lt;br /&gt;&lt;br /&gt;Once uploaded to the site, my new graphics meshed perfectly. Even zoomed in you cannot see a break.&lt;a href="http://bp1.blogger.com/_CkvVbJNTM4g/R7RgeeaCCEI/AAAAAAAAACo/QV9WjPa41kw/s1600-h/uhs-mainnav-outer-right.png"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7268067886417600293?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7268067886417600293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7268067886417600293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7268067886417600293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7268067886417600293'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-graphic-work.html' title='More graphic work'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_CkvVbJNTM4g/R7RhXeaCCJI/AAAAAAAAADQ/DZmPx8GTq54/s72-c/uhs-mainnav-outer-left.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2273572889898616057</id><published>2008-02-12T15:51:00.000-05:00</published><updated>2008-02-12T20:33:34.440-05:00</updated><title type='text'>Newfound respect for graphic designers</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_CkvVbJNTM4g/R7IH8-aCB2I/AAAAAAAAAAw/vXWB5O8SWjA/s1600-h/blockycurve.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_CkvVbJNTM4g/R7IH8-aCB2I/AAAAAAAAAAw/vXWB5O8SWjA/s320/blockycurve.png" alt="" id="BLOGGER_PHOTO_ID_5166200466673108834" border="0" /&gt;&lt;/a&gt;I'll admit it, I've always thought that most of what graphic designers do, anyone could do.  After all, Photoshop isn't that hard to figure out, and most of the secret to good web design seems to be choosing colors that don't clash.&lt;br /&gt;&lt;br /&gt;In my earlier post, I mentioned running into an IE bug displaying PNG files.  I was trying to create some rounded corners for our site.  I eventually got my new corners created...and they didn't look rounded at all, more like clipped corners.&lt;br /&gt;I spent the next two hours trying to get a 10x10 pixel image to look like a curve.  Seriously, look at that thing -- how to you imply a graceful arc when you've only got 100 pixels to work with?&lt;br /&gt;&lt;br /&gt;In any case, the site looks much better.  We replaced the old, very dark blue background with a much lighter shade.  Looking at the site doesn't make you want to kill yourself immediately.&lt;br /&gt;Incidentally, we stole the color from Metafilter.  VP had been having us change it various colors around the office: That shirt! Those shoes! That folder!  All of the colors looked garishly bright.  I pulled up Metafilter and suggested their color.  At least I know it's a shade of blue I can stare at for hours without wanting to gouge out my own eyes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2273572889898616057?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2273572889898616057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2273572889898616057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2273572889898616057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2273572889898616057'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/newfound-respect-for-graphic-designers.html' title='Newfound respect for graphic designers'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_CkvVbJNTM4g/R7IH8-aCB2I/AAAAAAAAAAw/vXWB5O8SWjA/s72-c/blockycurve.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8147441643211781099</id><published>2008-02-12T14:47:00.000-05:00</published><updated>2008-02-12T14:49:33.157-05:00</updated><title type='text'>More IE headaches</title><content type='html'>We use rounded corners in the 3 main sections of the site.&lt;br /&gt;Today, VP decided to change the background color of the site, which means that the 4 graphic files used to create the round corners needed to be updated to the new color.&lt;br /&gt;I was volunteered to make the change. I found the files and used Photoshop to update the colors and blend them together. Then I saved my changes and uploaded them to the site. Everything looks great on Firefox, but IE looks off. Using a color grabbing tool, I can see that IE is rendering the files with the wrong shade of blue.&lt;br /&gt;A bit of research leads me to this site: &lt;a href="http://hsivonen.iki.fi/png-gamma/"&gt;The Sad Story of PNG Gamma Correction.&lt;/a&gt; Once again, IE bites me. Turns out it is trying to be helpful by applying a "guess" Gamma correction to my files. Why this would ever be a good idea I have no clue. Luckily there's a fix. If you strip out the gamma information, IE will display the file unaltered.&lt;br /&gt;Another quick search finds the tool &lt;a href="http://pmt.sourceforge.net/pngcrush/"&gt;pngcrush.&lt;/a&gt; Running the command: pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB infile.png outfile.png fixes the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8147441643211781099?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8147441643211781099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8147441643211781099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8147441643211781099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8147441643211781099'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-ie-headaches.html' title='More IE headaches'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5266139476277303240</id><published>2008-02-12T12:23:00.001-05:00</published><updated>2008-02-12T12:23:48.584-05:00</updated><title type='text'>Backup woes continue</title><content type='html'>We installed backup software from EMC for the Sharepoint site.  A full, disaster recovery type backup runs fine, but document level backups fail. &lt;br /&gt;&lt;br /&gt;Since then I've been working with EMC support to resolve the problem.  (See my earlier posts).&lt;br /&gt;Today, they sent me information that seems promising.  Micrsosoft seems to be aware of the issue, and has a possible fix.  With any luck, we'll be back in business soon.&lt;br /&gt;&lt;br /&gt;Here are the details forwarded me by tech support:&lt;br /&gt;- By looking at another customer files, the issue has been narrowed down by Microsoft to one of the MHT files on SharePoint.&lt;br /&gt;- We received a possible workaround from Microsoft and provided that to the customer&lt;br /&gt;- We are waiting to receive information from that customer on the status of backups after implementing a workaround.&lt;br /&gt;- Since this does not seem to be an isolated occurrence that one of the MHT files is bad (might be an issue in your case as well), Microsoft was asked to investigate it further to understand what might be causing the MHT file to become damaged/corrupted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5266139476277303240?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5266139476277303240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5266139476277303240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5266139476277303240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5266139476277303240'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/backup-woes-continue.html' title='Backup woes continue'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-5584754064539207491</id><published>2008-02-11T12:03:00.000-05:00</published><updated>2008-02-11T12:04:07.512-05:00</updated><title type='text'>Recalled an email message today.</title><content type='html'>Another case of a secretary sending out the wrong file.&lt;br /&gt;In this case, we shut down access to the mail server for everyone.  Once we had the list of people who'd received the message, we shut down access just for them, and opened it back up for everyone else.&lt;br /&gt;&lt;br /&gt;In Domino 8, there's a built-in feature for recalling messages.  We're still running 7, though, so we used a home-built application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-5584754064539207491?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/5584754064539207491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=5584754064539207491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5584754064539207491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/5584754064539207491'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/recalled-email-message-today.html' title='Recalled an email message today.'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-3221181357251101227</id><published>2008-02-07T10:13:00.001-05:00</published><updated>2008-02-07T10:13:34.165-05:00</updated><title type='text'>Portal login problems</title><content type='html'>We resolved a login problem this morning.  The user was unable to login to the Questionaire site.  It turned out that she was mistyping her domain, but it was hard to figure out what was going wrong until we got her on a webex session.&lt;br /&gt;&lt;br /&gt;This wasn't much of a problem, but it points out a major flaw:  our AD is weak.  It grew organically as various hospitals created their own networks, using their own naming conventions. &lt;br /&gt;&lt;br /&gt;Now we have a mess of 50+ AD structures.  There's a trust relationship, so we can use them for logins, but nothing is consistent.  So some people are first.last, some are initials, some are named by job title!  You never can tell.&lt;br /&gt;&lt;br /&gt;We tried to push out our portal address to the Intranet Site list on everyone's machine.  When it works, it means that people don't have to login via their browser.  But it only works about half the time.  In today's case, it was broken, so she was trying to login manually.&lt;br /&gt;&lt;br /&gt;It's going to be a struggle as we move forward.  Every time we roll out a new application, we get a small flood of "I can't login!" problems.  I have some documentation on how to update the Intranet setting manually, but I wish we didn't have to use them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-3221181357251101227?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/3221181357251101227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=3221181357251101227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3221181357251101227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/3221181357251101227'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/portal-login-problems.html' title='Portal login problems'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7048475262973433721</id><published>2008-02-06T16:25:00.000-05:00</published><updated>2008-02-06T16:26:41.862-05:00</updated><title type='text'>Created New Infopath form for Change Management Site</title><content type='html'>&lt;div&gt;J asked me to create a Change Management site last week.  He'd  been using a Word document template to gather information about change requests  and record signatures.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Today I suggested we convert his Word document into an Infopath form so  that end users could fill out everything via their browser.  He agreed, so I got  to work.&lt;/div&gt; &lt;div&gt; &lt;/div&gt;I'm pretty happy with the way it turned out.  The Word document was fairly  ugly -- lots of garish colors and huge groups of picklists.  I've changed that  to a more restrained look, and used Radio buttons and drop down menus to keep  the form from looking too busy. &lt;div&gt; &lt;/div&gt; &lt;div&gt;I used repeating sections to handle those cases where more than one name  needed to be entered.  On the current form, he just had a bunch of blank  lines.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I also got to use Submit Options for the first time.  These let you  automatically generate a unique filename for the document instead of relying on  the user to type something in themselves.  &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;One thing that bothers me is that we don't have a standard look and feel to  any of our forms.  Not even a common color scheme.  I've been using the MS  standard shades of blue.  On this form I also added a nice faded UHS logo to the  top.  It's an attractive, understated logo, that I think I'll be using in future  forms.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7048475262973433721?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7048475262973433721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7048475262973433721' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7048475262973433721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7048475262973433721'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/created-new-infopath-form-for-change.html' title='Created New Infopath form for Change Management Site'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-1999886265674232953</id><published>2008-02-05T16:24:00.000-05:00</published><updated>2008-02-06T16:25:31.430-05:00</updated><title type='text'>Adding Infopath forms</title><content type='html'>&lt;div class="ExternalClass862C4AC0B7F143A98E5F511D6D68BB59"&gt; &lt;div&gt;I just uploaded an Infopath form for D using what I think of as the  formal way.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;The informal approach is very easy.  Design the form and click Publish,  then point Infopath Designer to a Form Library, or create a new one, and click  OK.  That works well enough, but is apparently not an option when the Infopath  form contains code.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;The formal way is to logon to the Admin Site and go to Manage Form  Templates under the Application Management tab.  From there you upload a copy of  the template file.  Once uploaded, you have to activate the form for each Site  Collection that will use it.  This is also done via the Manage Form Templates  Site.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Once activated, you have to go to the Form Library Settings on the Form  Library you want to work with.  From there, click Advanced Settings and change  Allow management of Content Types to Yes.&lt;/div&gt; &lt;div&gt;That creates a new section called Content Types.   Now you just have to add  your new from from the list of existing content types.  (And in the case of a  Form Library where you want all documents to use the form, remove the  others).&lt;/div&gt; &lt;div&gt;Whew!  That's quite a few steps.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Not sure yet if you have to repeat everything when the form changes, but  I'm guessing you just have to upload the new file version.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-1999886265674232953?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/1999886265674232953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=1999886265674232953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1999886265674232953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/1999886265674232953'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/adding-infopath-forms.html' title='Adding Infopath forms'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-7610319971454639116</id><published>2008-02-05T16:23:00.000-05:00</published><updated>2008-02-06T16:24:45.808-05:00</updated><title type='text'>Domino mail problem fixed</title><content type='html'>&lt;div&gt;We had a strange problem with mail routing this week.  People whose mail is on the Nashville server were unable to send mail to a particular user -  call her User A.  User A's mail was located on corporate, but for some reason, the  Nashville server insisted that her mail file was on Nashville.  It wasn't of  course, so delivery failed.  &lt;/div&gt; &lt;div&gt;The funny part was that no other server acted this way.  Send User A a  message on any other server and it would happily run over to corporate for  delivery.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;We assumed the problem was with the Address Book on Nashville, and  eventually replaced the file with a fresh copy after various fixes failed.  The  new copy acted the same way.  What finally fixed the problem was deleting User A  altogether and creating her a new account.  &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Very odd.  The strangest thing to my mind, is that User A's mail was never  at any point on the Nashville server.  I still have no idea what happened.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-7610319971454639116?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/7610319971454639116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=7610319971454639116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7610319971454639116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/7610319971454639116'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/domino-mail-problem-fixed.html' title='Domino mail problem fixed'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-8209785202488683827</id><published>2008-02-05T16:20:00.000-05:00</published><updated>2008-02-06T16:20:54.892-05:00</updated><title type='text'>More updates to the Quick Start Guide</title><content type='html'>&lt;div&gt;M had me add a few details about the Big Blue Buttons (BBB) that  take up a good 1/3rd of the screen.  I've never liked these buttons, and hope  that they'll go away the first time we get a chance to redo the front  page.&lt;/div&gt; &lt;div&gt;In addition to BBB, he had me explain Quick Links and News.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;My Quick Guide is now 4 pages long.  That's still quick I guess, but we're  edging into Long Start Guide territory.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-8209785202488683827?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/8209785202488683827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=8209785202488683827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8209785202488683827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/8209785202488683827'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/more-updates-to-quick-start-guide.html' title='More updates to the Quick Start Guide'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-6348819371300187474</id><published>2008-02-04T16:21:00.000-05:00</published><updated>2008-02-06T16:23:05.299-05:00</updated><title type='text'>Fixed email problem</title><content type='html'>Or, I should say E fixed it. &lt;div&gt;A company was unable to reach our mail routers.  Several days after the  problem popped up, they asked me to look into it.  Thursday I worked with  someone from the company who had no access to anything, and really didn't know much about  networking.  Friday at 4:30pm, I got a call from someone with a brain.&lt;/div&gt; &lt;div&gt;We quickly figured out that their servers were trying to send mail to the  correct servers, but couldn't connect.  The company's tech had seen it before and  thought our ISP was block their subnet.  I forwarded the suggestion and asked E to take a look.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Monday around noon I got an urgent call from VP asking for the status.  I  contacted E (who'd forgotten over the weekend).  He looked into it and found  that someone had made a routing change that only affected the company with the trouble.  The change was  made right when email stopped working.  Ding Ding!  E changed the setting  back, and everything is back to normal.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-6348819371300187474?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/6348819371300187474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=6348819371300187474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6348819371300187474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/6348819371300187474'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/fixed-email-problem.html' title='Fixed email problem'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5663158290595373160.post-2521921126873293726</id><published>2008-02-04T16:17:00.000-05:00</published><updated>2008-02-06T16:20:00.621-05:00</updated><title type='text'>Fixed export bug</title><content type='html'>&lt;div&gt;Since installing the "Fab 40" templates from Microsoft, the export command  has been broken for the Portal site.&lt;/div&gt; &lt;div&gt;(stsadm -o export -url http://site -filename  export).&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;This is majorly annoying because export is the only way to migrate sites  from one server to another.  Without it, we were having major problems getting  sites to the test server so D could safely play with them.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I did some searching on the error that popped up: &lt;strong&gt;Guid should  contain 32 digits with 4 dashes &lt;/strong&gt;and eventually found this &lt;a href="http://sharepointsearch.com/cs/blogs/sharepointblogs/archive/2007/09/13/designer-export-fails-with-quot-guid-should-contain-32-digits-quot-error.aspx"&gt;site.&lt;/a&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;The fix was to edit a file called fields.xml located in &lt;span id="ctl00_ContentPlaceHolder1_ctl01_mtxtArticleBody"&gt;c:\program files\common  files\microsoft shared\web server extensions\12\template\features\tsatypes.  It  appears that the Fab 40 templates add several hundred entries to this file, but  screw up the GUID, framing them with {}.  The fix is to remove the  brackets.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span&gt;I backed up the file on Apps --this would limit the impact if  my fix broke the server and I had to restore the backed up file.  I then  manually removed the brackets.  Once that was done, I crossed my fingers and  restarted IIS.   The server came online, and export works again!&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span&gt;I then made the change to Web1 and Web2.  This time I  used find and replace rather than edit the file by hand.  All seems to be  well.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5663158290595373160-2521921126873293726?l=akennel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akennel.blogspot.com/feeds/2521921126873293726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5663158290595373160&amp;postID=2521921126873293726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2521921126873293726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5663158290595373160/posts/default/2521921126873293726'/><link rel='alternate' type='text/html' href='http://akennel.blogspot.com/2008/02/fixed-export-bug.html' title='Fixed export bug'/><author><name>Andrew Kennel</name><uri>http://www.blogger.com/profile/03182542838161479535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
