Windows SBS 2003 to 2011 Migration

I have the privilege of assisting a client in migrating from a long-running installation of Windows Small Business Server 2003 running the usual slew of SBS services & a couple of LOB apps, all on out-of-warranty hardware that's started to show the signs of old age.

Microsoft has an incredibly detailed guide covering best practices and needed steps to get the migration going. After configuring the newly purchased Dell T6600 (very few local non-profits that I've dealt with have actual hardware racks) as a Hyper-V host, I installed SBS 2011 using the answer file created on the old server. Instead of swapping disks, I just added a second optical drives to the VM, using the second one to mount an ISO of the answer file created using ImgBurn.

I was wondering why the installation was taking so long without the progress bar budging, so I opened the command prompt (using shift+F10) and ran netstat -a to see if the server was connecting to anything, which showed connections to Microsoft's update servers. After reading this post about updates failing, I figured I'd give it another 30 minutes before rudely interrupting, but by then it had finished the updates.

Next up: migrating Exchange…


Random Links #1

I'm a big fan of the "Friday links" posts presented by Mike at Blue Onion Software, and have held off doing this myself because he does such a great job.  But I realized that posts like this are more useful for me to refer back to, since there are many times I come across an awesome new project that I have no use for... yet.  So, at the risk of being a copycat, here goes...


I'm tired of the coda slider look, and I think this interface is far more intuitive.


For a relatively small app, this looks great.  I can think of a few uses already.


Yet another jQuery plugin, that finally gives us some easy, pretty alerts and basic dialog boxes.

A short list to start with - can you tell I like jQuery?


Searching For a New Framework

It's been a while since I've posted to this blog, and there's really no excuse I can give except this: I got bored.  Of course, there was plenty of work to be done, but I really just got tired of DotNetNuke.  My solution to break free from this crushing boredom?  Switch platforms!

I'd been toying around with the idea of learning a new framework, and I really thought that I wouldn't want anything else until there was a legitimate CMS built on top of Microsoft's MVC platform.  While I still believe that MVC will be the future of Microsoft's web stack (sorry WebForms!), I finally faced up to the fact that there won't be a mature contender in that category for a bit longer.  So, my other options?


I had really liked the concepts behind Umbraco when I tested it out a few years ago, but it was far from perfect and lacked much of the drop-in functionality of DNN.  It's still not perfect, but two years of dealing with DNN's obvious design deficiencies finally got the best of me.  After giving it a few days of solid examination, I'm sold.  Unless I have a compelling reason to use DotNetNuke, Umbraco will be my new framework of choice.


I recently built a site for a local political candidate in Drupal.  They had already purchased hosting and instead of trying to get the money refunded, I decided to see why it was so popular.  It turns out, Drupal is a lot of fun to design for, giving you as much freedom as Umbraco.  The administration terminology took a little time to get used to, but with the right modules, it's easy to use.


I've also had the opportunity to build two sites in WordPress, and I am constantly amazed at the level of thought given to the user experience.  I don't use the words 'stupid simple' often, but WordPress is the yardstick I would measure that concept by.  You'd think something as simple as a feedback form would be installed by default, and getting a backup script installed took a little shoehorning.  Overall, though, I have trouble recommending anything else to someone just looking to turn a key and blog.



Integrating DotLess Dynamic CSS with DotNetNuke

I've been hearing about the Less CSS framework for a while, and it always looked like a great idea-for Ruby developers.  Then I had a thought-maybe I should search "less css .net."  30 seconds later, I'm staring at DotLessCss and wondering how hard it would be to integrate with DotNetNuke.  Turns out, it's pretty easy.

One caveat is that you need the extension .LESS to be handled by ASP.Net.  If you have wildcard support enabled for .Net in IIS through your host or are running ASP.Net 4.0, you're set.  I already had this configured for extension-less urls, but if you don't have it set up, ask your host.  It's literally a 30-second modification-if they try to charge you, see if you can press them to do it as a favor for being such a great customer. :)

Once that's completed, the following steps should get you there:

  1. Copy dotless.Core.dll into your \bin folder
  2. In web.config, under / (IIS 7), add
  3. In /(IIS 6), add
  4. In the DNN root, open Default.aspx.vb, and browse down to ManageStyleSheets() (around line 340)
    Since I don't really use the default.css file (except to paste a CSS reset into the top of the file) or the portal.css (which I delete so it doesn't get added to the list of files to download), I only added in .Less support for the skin css files.  Look for the following:

    If File.Exists(Server.MapPath(ctlSkin.SkinPath) & "skin.css") Then
    objCSSCache(ID) = ctlSkin.SkinPath & "skin.css"
    objCSSCache(ID) = ""
    End If

    which becomes

    ' .LESS CSS
    If File.Exists(Server.MapPath(ctlSkin.SkinPath) & "skin.less") Then
    objCSSCache(ID) = ctlSkin.SkinPath & "skin.less"
    Else If File.Exists(Server.MapPath(ctlSkin.SkinPath) & "skin.css") Then
    objCSSCache(ID) = ctlSkin.SkinPath & "skin.css"
    objCSSCache(ID) = ""
    End If

This way, if skin.less exists, DNN will disregard skin.css.  If you want to use .Less in other places, you can make the same modification above for default.css or below for portal.css.  If you prefer to leave the .css extension, you could use .less.css instead (Visual Studio will still provide most CSS intellisense).

I like the modification above because you can fit it into any DotNetNuke installation without having to recompile any of the DNN core DLLs.  What works for skins, though, doesn't work for containers.  The container CSS injection isn't handled from default.aspx.vb, instead being compiled as DotNetNuke.UI.Containers.Container.  Changing this would require making a similar change in the DNN source code and the recompiling.

CAUTION:  Keep in mind that upgrades will now break your sites, so you'll have to add those lines back into default.aspx.vb every time you run anything that overwrites it.  For me, that's a price worth paying, but it does add an extra step in your site maintenance.  Use this with caution, especially on a production site.  As always, make changes on your test server first.  Even if you only use this on your test server, you can always use .Less to emit your final skin CSS file.


Modifying the new DNN Blog Module

I posted a while back some modifications I had made to the DNN Blog module that I found useful, namely adding the calendar-looking date to the blog entry list.  These are updated instructions for the new DNN Blog module that is now shipping with DNN 5.

Open up ViewBlog.ascx, locate and add the following after theDIV.BlogHead (line 49)

<div class="BlogPublished" title="<%# DataBinder.Eval(Container.DataItem, "AddedDate") %>">
 <span class="BlogPubMonth">
  <%# Left(MonthName(Month(DataBinder.Eval(Container.DataItem, "AddedDate"))), 3) %>
 <span class="BlogPubDate">
  <%# Day(DataBinder.Eval(Container.DataItem, "AddedDate"))%>

The only change I made was to add the full date as the title of the containing DIV, so that hovering over with your mouse will give the full timestamp.

I must commend the Blog module team for making the CSS much more legible and predictable in this release, although there are still a few lingering inline styles that get in the way of fully skinning the DNN Blog.  But, if that was the cost of getting awesome tags, categories, and recent items, I can find little fault in their priorities.


Resetting SQL 2008 sa Password

I'm still haven't seen SQL Server Management Studio (SSMS) available to install through the Visual Studio 2010 installation.  It's such an easy and painless way to interact with SQL, but it still isn't available as a separate download as far as I know.  A big part of me is happy Microsoft finally realized that you have to give poor developers access to the same tools that the big boys use, but there are still places for future work.

I could reinstall SQL Server Express with the Advanced Tools, but I'm in a hurry and need to connect.  To work around this, I'm attempting to connect using another machine with SSMS 2008 on it.  Unfortunately, SSMS won't allow you to authenticate using a different computer's users (domain users wouldn't have this problem, I'm guessing).  This leaves me with the option to login as the superuser SA.

So what do you do when you've been relying on Windows authentication and you need to reset the SA password?

  • Fire up the SQL Server Configuration Manager and double-click on the SQL instance you need to reset.  Click over to the Advanced tab.
  • In the Startup Parameters, prepend -m;to the list to put SQL server into Single-User mode.  Click OK and then right-click on the SQL Server instance and click Restart.
  • Open up a command prompt, and type:
    OSQL -S localhost -E
    The -S parameter tells OSQL what server to connect to, and the -E parameter creates a trusted connection.  Capitalization of the switches does matter.
  • Inside the SQL terminal, type (substituting your new password for newPassword):
    EXEC sp_password NULL, 'newPassword', 'sa'
  • Once that's complete, type exit to quit.  Go back to the SQL Configuration Manager, remove the -m; from the Startup Parameters, and restart the SQL Server instance.
  • Make sure SQL Server and the browser are allowed through the Windows firewall, and try connecting from the other computer.

If it worked, you should now be able to log in using the sa user and make all the changes you need through the SSMS on the remote computer.