May 2008 - Posts

You can now download the Public Preview of SBS 2008 from Microsoft Downloads.
The standard install requires only DVD 1 while the premium install requires all 4 DVDs at almost 10Gb.
Tip: use a download manager such as Free Download Manager which will give you a faster download than Microsoft's download manager and will also allow you to throttle the bandwidth if you co-workers think you're hogging the DSL link.
An interesting project to measure UK broadband providers is being conducted by Samknows Broadband. Volunteers can sign up to receive specially modified Linksys routers that collect performance data and 'phone home' with the results. Until now people have only been able to compare broadband on price, dubious headline speeds, anecdotal discussion and some ad-hoc speed tester results. This can only improve transparency and reveal the hidden practices being employed by UK broadband providers.
The first batch of routers has already been deployed and once enough monitoring data is available, Samknows will begin to publish results. This may only be weekly initially, but ultimately they plan to be able to offer the data in near-realtime to anyone who wishes to see it. An example of preliminary results (reproduced above) reveals traffic shaping being used by one (anonymous) ISP for non-HTTP traffic. This sort of detail would be extremely difficult for the average user to uncover without this new monitoring technology.
This is a much needed service that can only increase transparency into what is actually going on in the UK Internet industry. There is widespread assumption in the UK that the primary use for the Internet is to download web pages and files using HTTP protocol on port 80. While this was once the case, with small businesses making ever more sophisticated use of the Internet, with VoIP, IP Telephony and flexible working from home offices on the increase, that assumption will become much less valid over time. UK ISPs need to adjust their service offerings to match the increased sophistication of business users. Samknows' monitoring project may well serve to highlight current failings and persuade ISPs to up their game.
If you're having performance problems on your Windows Vista systems, one thing you might take a look at is Windows Sidebar. It is quite badly behaved! I find it is consistently one of the biggest memory hogs and almost always the most prolific generator of page faults.
You'll see hundreds or thousands of page faults per second, even when there is plenty of free memory. Any screen updates in the sidebar (just try running the mouse over it) puts your page faults through the roof. It's particularly bad when displaying a clock with a second hand, which will constantly generate about 400+ page faults a second.
Another place where SideBar will drag you down is if you connect using Remote Desktop Connection. Anything but a blisteringly fast connection will respond like a dawg if SideBar is running on the remote system.
In part 1, part 2 and part 3 of this series, we built an ASP.NET 3.5 web application to accept a telephone number as a query string within the URL, look up that number in a Dynamics CRM database and return the matching contact name and company as the result. In this final part 4, we'll see how to hook all this up to the TrixBox PBX so that our end users see the result string on the display of their telephones.
Configuring TrixBox
The first step is to add a Caller ID Lookup Source. In TrixBox, go to the administration web console and click CallerID Lookup Sources, then Add New Source. We're using an HTTP lookup source, fill in the fields as follows:
I've deployed my solution to an IIS web server and assigned it to port 55009 because port 80 was already in use. I don't need to enter a username and password (see later). The path field matches the URL of our Generic HTTP Handler and finally the Query String is where TrixBox substitutes the incoming CLID number for the [NUMBER] placeholder. So if the incoming CLID was 7777, then TrixBox will generate the following web query:
http://192.168.16.2:55009/Lookup.ashx?CLID=7777
Whatever response comes back from that query will be used as the CLID name by TrixBox.
Security and Authentication
For this all to work, the user running the query must have permissions to access the CRM data and the web site hosting the HTTP Generic Handler. I've used a very simple (but certainly not the most secure) approach to authentication. My web site allows anonymous access, so anyone on the LAN can actually perform these CLID lookups if they know the correct URL and port. It would be a simple matter to lock this down to the single IP address of my TrixBox server in the IIS settings, but my environment is small and well supervised, so I've chosen to leave it open. Access from outside the company is blocked by the firewall. The web application is assigned to an IIS6 Application Pool that uses the built-in Network Service account as its identity. When SQL Server authenticates the connection attempt, it will recognise this as the machine account for the computer hosting the web server, so if the web server's host name is SBS then its machine account is SBS$. This is the account that needs access to the CRM SQL database. I granted my SBS$ machine account access to the SQL database as follows:

It's worth just mentioning again that tinkering with the CRM database like this is not really advisable, but we went over all that in part 1 of this article. Suffice it to say, you're on your own if anything goes wrong.
TrixBox Incoming Routes
One final piece of the jigsaw to be done. On each incoming route in TrixBox, we need to configure it to use our new CLID lookup source. Generally, you'll have a default "Any DID/Any CID" route and maybe a few others. Visit each route and set the Source field as follows:
Now, you should be able to make an incoming call (simulate an incoming call by dialling 7777 from an extension) and, if you're running DebugVw, you should see some diagnostic output as TrixBox performs the CLID lookup. If the number is found in your CRM database, you should see it presented on your phone's display and it'll also appear in the call detail records instead of the phone number.
In part 1 we set the scene and created our web application project. In part 2 we began creating the HTTP Generic Handler, retrieved the CLID string from the URL's query string and knocked it into the correct canonical format ready for looking in the CRM database. In part 3, we are going to use LINQ - a new feature in Visual Studio 2008 and the .NET Framework 3.5 - to perform the lookup in the CRM database and return the response from our HTTP handler.
LINQ to SQL
One thing to get out of the way. Normally, it wouldn't be the done thing to access the CRM database directly. You'd want to use the CRM Web Service. However, I'm allowing myself to take this shortcut for the following reasons:
- We are only reading a very limited amount of data and will not be modifying the database.
- I want to bypass the normal CRM security mechanisms so that our web application has access to all of the contact records.
- Scalability will not be an issue because TrixBox performs its own caching.
Nevertheless, you should know that what I'm doing here isn't really best practice. Maybe in a future version I'll address that and do things properly.
Now, the next thing to do is to add the LINQ to SQL classes to our project. To do this, right click the project, click Add, New Item... then select LINQ to SQL Classes. Call them CrmContacts.dbml as shown here.
You'll see the LINQ to SQL design surface. You now need to create a connection to your CRM SQL database using Server Explorer. Expand the Views folder and drag the Contact view onto the design surface. It should look like this (click the image for a full size view):
While we're here, we need to grab a copy of the SQL connection string. Right-click on your connection in Server Explorer, select Properties... and in the Properties pane, copy the value of the connection string.
Go to your projects Settings and paste the value in, replacing the value already there, if any.
The reason for doing this is to decouple the code from the database. Putting the connection string in the Web.config file enables the connection to be changed later without having to rebuild the code. For example, if you deployed this on your web server against a test database, then later you can switch to the production database simply by changing the connection string.
Now, save everything and build. There should be no errors or warnings.
Define the LINQ Query
This is the LINQ query that will lookup our CLID in the CRM database. Replace the line
//ToDo: Lookup in CRM database
with the following code
string clidQueryString = String.Format("+{0} ({1}) {2}", clidCountry, clidArea, clidNumber);
Diagnostics.TraceInfo("Searching CRM contacts for {0}", clidQueryString);
CrmContactsDataContext crmContext = new CrmContactsDataContext(Properties.Settings.Default.CrmConnectionString);
var queryCLID = from contact in crmContext.Contacts
where contact.Address1_Telephone1 == clidQueryString
|| contact.Address1_Telephone2 == clidQueryString
|| contact.Address1_Telephone3 == clidQueryString
|| contact.Address2_Telephone1 == clidQueryString
|| contact.Address2_Telephone2 == clidQueryString
|| contact.Address2_Telephone3 == clidQueryString
|| contact.Telephone1 == clidQueryString
|| contact.Telephone2 == clidQueryString
|| contact.Telephone3 == clidQueryString
select new
{
Account = contact.AccountIdName,
FullName = contact.FullName
};
We're looking for a match in any of the phone number fields in a CRM Contact record. If your contact entity has been customised or you want to be more selective, then edit the code accordingly.
One of the problems with this technique is that it can return multiple results, for example if you have two contacts within the same company who share the same phone number. One strategy for dealing with that is to only return the first match, but then you might not actually be returning the right person. Another alternative would be to just return the company name. What I decided to do was to return all the matches, concatenated together in one long result string, like this:
StringBuilder caller = new StringBuilder();
int count = 0;
foreach (var contact in queryCLID)
{
if (count > 0) caller.Append(", ");
caller.AppendFormat("{0} ({1}) ", contact.FullName, contact.Account);
++count;
}
if (count == 0) caller.Append("unknown");
string response = caller.ToString();
So, we have our response. All we need to do now is send it back to the client who made the original request. This is very simple:
Diagnostics.TraceInfo("Matched {0} records, returning: {1}", count, response);
context.Response.ContentType = "text/plain";
context.Response.Write(response);
Delete the redundant last two lines:
//ToDo: Format & return the result string
context.Response.Write("Hello World");
And we're good to go. Build and run the project. If the compiler complains about StringBuilder, add a Using System.Text; at the top of the code. When the web browser opens, click on the hyperlinks on your default.aspx page and, provided the query strings correspond to numbers in your CRM database, you should see the contact's name and company returned to your web browser. You should also be able to look up numbers by editing the URL in your browser's Address bar. If you've been adding the diagnostics and running DebugVw, you'll see output like this:
[7860] TiGra.TrixBox[Info]: Received request: /Lookup.ashx?CLID=01443208678
[7860] TiGra.TrixBox[Verb]: CLID query string Raw=01443208678 Trimmed=1443208678
[7860] TiGra.TrixBox[Verb]: Recognised local number and area code.
[7860] TiGra.TrixBox[Info]: Searching CRM contacts for +44 (1443) 208678
[7860] TiGra.TrixBox[Info]: Matched 1 records, returning: Timothy Long (TiGra Networks)
OK, so that's the code done. In the next installment, we'll look at configuring TrixBox to use all this stuff.
In part 1, we set the scene and created a new project in Visual Studio and set up a few things in preparation. Now for the good bit, let's write some code!
Diagnostics
Throughout the code, you're going to see diagnostic trace routines. This diagnostic code is just lifted from another project and the details are not of interest to this article, so you can either leave out these statements or download the attached code to get the ready-made Diagnostics.cs file. If you do leave the diagnostics in, then I recommend SysInternals' DebugVw program for viewing the output.
Implementing the Generic HTTP Handler
This is easier than you might think, thanks to the .NET Framework. Double-click the Lookup.ashx file then look for the ProcessRequest method. This is where all the action is. First step is to retrieve the incoming CLID value from the URL's query string.
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.ContentType = "text/plain";
string clid = context.Request.QueryString["CLID"];
Diagnostics.TraceInfo("Received request: {0}", context.Request.RawUrl);
if (String.IsNullOrEmpty(clid))
{
Diagnostics.TraceVerbose("No query string specified, returning Anonymous");
context.Response.Write("Anonymous");
return;
}
//ToDo: Do something with the CLID
//ToDo: Lookup in CRM database
//ToDo: Format & return the result string
context.Response.Write("Hello World");
}
That wasn't too bad now, was it? At this point you can test your project using the hyperlink on the default.aspx page. You will not notice any difference but if you are running DebugVw you'll see some diagnostic output.
Massaging the CLID
There are a few things we need to do to get the CLID string in the correct format so we can look it up in the CRM database. We need to try to recognise the country and area code and format the number in Canonical Form. To recap, TrixBox gives us a number in the format 01234567890 and we need that in the format +44 (1234) 567890. The following code does just that and uses the settings we created earlier.
Replace the line
//ToDo: Do something with the CLID
with the following code:
// Convert supplied CLID to canonical format: CC (AAAA) NNNNNNN
// Incoming CLID is typically in the format NNNNNNNNNNN
string clidTrimmed = clid.TrimStart('0', '+');
Diagnostics.TraceVerbose("CLID query string Raw={0} Trimmed={1}", clid, clidTrimmed);
int digits = clidTrimmed.Length;
string clidCountry = Properties.Settings.Default.LocalCountryCode;
string clidArea = Properties.Settings.Default.LocalAreaCode;
string clidNumber = String.Empty;
if (digits <= Properties.Settings.Default.NumberDigits)
{
Diagnostics.TraceVerbose("Recognised local number only.");
clidNumber = clidTrimmed;
clidArea = Properties.Settings.Default.LocalAreaCode;
clidCountry = Properties.Settings.Default.LocalCountryCode;
}
else if (digits <= (Properties.Settings.Default.NumberDigits + Properties.Settings.Default.AreaCodeDigits))
{
Diagnostics.TraceVerbose("Recognised local number and area code.");
clidNumber = clidTrimmed.Substring(digits - Properties.Settings.Default.NumberDigits, Properties.Settings.Default.NumberDigits);
clidArea = clidTrimmed.Substring(0, digits - Properties.Settings.Default.NumberDigits);
clidCountry = Properties.Settings.Default.LocalCountryCode;
}
else
{
Diagnostics.TraceVerbose("Recognised international prefix, area code and number.");
clidNumber = clidTrimmed.Substring(digits - Properties.Settings.Default.NumberDigits, Properties.Settings.Default.NumberDigits);
clidArea = clidTrimmed.Substring(digits - Properties.Settings.Default.AreaCodeDigits - Properties.Settings.Default.NumberDigits, Properties.Settings.Default.AreaCodeDigits);
clidCountry = clidTrimmed.Substring(0, digits - Properties.Settings.Default.AreaCodeDigits - Properties.Settings.Default.NumberDigits);
}

Following on from my last post where I discussed using LINQ to dip into a Microsoft Dynamics CRM database, here is a real-world application using similar techniques. This sample is an integration between TrixBox, an open-source IP Telephony system and Microsoft Dynamics CRM. It uses LINQ to SQL to look up the Calling Line Identity (CLID) of an incoming call in the CRM database and returns the name and company of the caller, which TrixBox then presents to the user on their telephone display and records in the call detail records. The code is implemented as an HTTP Handler (.ashx) file hosted on an ASP.Net web application. You can test all this in Visual Studio 2008, but my finished solution is hosted in IIS6 on my Windows Small Business Server.
Assumptions
- This is designed to work with TrixBox CE 2.6, configured to work in the UK
- TrixBox presents CLID in the format you would dial a national number. For the number (01234) 567890 TrixBox presents the caller ID as 01234567890.
- Phone numbers are stored in canonical format within my Microsoft CRM implementation. The number above would be stored as +44 (1234) 567890 - if yours are stored differently you'll have to modify the code, but I suggest you always store your phone numbers in canonical form within Outlook and CRM.
There are really 4 parts to this project.
- Creating the solution and implementing the HTTP Handler.
- Receiving the CLID from TrixBox and getting it into Canonical Form
- Querying the CRM database using LINQ and formatting the result string
- Configuring TrixBox to use our solution.
I'm going to present the steps as separate blog posts. This is part 1.
Part 1 - Creating the Solution
- In visual Studio 2008, create a new project (not a web site). In the New Project dialog, select the Web project type and ASP.NET Web Application template. Ensure you are targetting .NET Framework 3.5 and name your solution.
- Right-click the project and select Properties..., on the Application tab, set the default namespace to TiGra.TrixBox and the assembly name to TiGra.TrixBox.CallerIDLookup. Switch to the Settings tab and add the following application settings (click the image for a full-size view if you can't make it out). Substitute values that make sense for you in LocalCountryCode and LocalAreaCode, AreaCodeDigits and NumberCodeDigits. We'll revisit the connection string later.
- Right click on the project, click Add New Item... and select Generic Handler. Name it Lookup.ashx, as shown below. A generic handler is sort of like a code-behind file without any content page. There is no predefined content to display and the output is generated by the underlying code. When you double-click the ashx file in visual studio, you will not see any HTML but will be taken directly to the C# code-behind file. This enables us to write code that looks at the URL that was used to access the handler, get the query string from it and generate the response string directly in C# code. The default template supplied with Visual Studio generates the string "Hello world".
- Let's just make it a bit easier to test things as we go along. You'll notice that Visual Studio created a Default.aspx page and this is what will be displayed when we run the project. So open up the Default.aspx page in HTML view and set the body as follows:
<body>
<form id="form1" runat="server">
<div>
<a href="Lookup.ashx?CLID=01443208678">Lookup 01443 208678</a>
</div>
</form>
</body>
- You can now run the project and it should build with no errors. You'll notice the ASP.NET Development Web Server pop up in the task bar and your Default.aspx page should open in a browser window. If you get warnings about debugging, select OK to enable debugging. When you click on the hyperlink on the default page, you'll should see the "Hello world" response.
The solution so far is attached to this post if you want a quick-start or just want to check your results.
Inspired by Simon Hutson's post and sharing his aversion to T-SQL code, I decided to have a go at re-writing his code in C# using LINQ (Language Integrated Query).
Before we go any further, I need to say that the techniques used here are definitely not appropriate in a production CRM database. Only use this technique on sample data that can be easily re-created, such as the AdventureWorksCycle sample database. This article is presented more as an interesting technical exercise that a real-world solution.
Simon's example modifies all of the customer service cases so that their CreatedOn date is a random offset from today's date, so that all the cases end up having a CreatedOn date within the last 365 days. My example allows the user to specify the target date range, then randomises the CreatedOn dates within that range. Here's how I did it:
Step 1. Create a new Windows Forms application in C#, targeting .NET Framework 3.5. I called mine TiGra.CRM.UpdateDemoData
Step 2. Add LINQ To SQL classes to the project. Right click on the project in Solution explorer, Add New Item... and select LINQ to SQL Classes and give the new classes a meaningful name (I used CRMDemoData).
Step 3. Create a connection to your demo database. Please note, you should never tinker directly with the SQL database in a production deployment. This is only demo data were are putting at risk here, and the worst case scenario is that you might have to delete the organisation and re-create it then re-import the demo data, so this is an acceptable risk on this occasion. DO NOT DO THIS IN PRODUCTION. Now, in Visual Studio, open Server Explorer and create a new connection. Specifiy your CRM SQL database server and your demo database, which should be called AdventureWorksCycle_MSCRM. Expand the Tables folder and drag the IncidentBase table out onto the LINQ design surface, if you did it right, it should look like the screen show below. Save the dbml file and close the window.
Step 4. Add some controls to your Windows Form. Drag a couple of DateTimePicker controls onto the from and call them dtEarliestStart and dtLatestStart. Drag a Button control and call it btnUpdate. If you like, you can spend some time tarting it up and adding labels like I did:
Step 5. Let's set some sensible defaults for the dates. We'll use today's date as the latest start and today - 356 days as the earliest start. Add an event handler for the form's Load event. You can easily do that by just double-clicking on a blank area of the form. Add the following code:
private void Form1_Load(object sender, EventArgs e)
{
DateTime today = DateTime.Now;
DateTime yesteryear = today - new TimeSpan(365, 0, 0, 0);
this.dtLatestStart.Value = today;
this.dtEarliestStart.Value = yesteryear;
}
If you run the project at this point, there should be no errors and you should get the correct default dates:
Step 6. Now the add the meat of the project, the stuff that happens when you click the Update button. We'll add an OnClick event handler by double-clicking the button, then add the following code:
private void btnUpdate_Click(object sender, EventArgs e)
{
TimeSpan daySpan = this.dtLatestStart.Value - this.dtEarliestStart.Value;
int nDays = daySpan.Days;
CRMDemoDataDataContext crm = new CRMDemoDataDataContext();
Random rnd = new Random();
var query = from incident in crm.IncidentBases // Define a LINQ query.
select incident;
// Iterate through the records, updating the CreatedOn date for each one.
// We use the time of day from the original record, but update the date
// to be a random offset from the user-specified latest start date.
foreach (var incident in query)
{
int offset = rnd.Next(0, nDays);
DateTime originalDateTime = (DateTime)incident.CreatedOn;
TimeSpan tsOffset = new TimeSpan(offset, 0, 0, 0);
DateTime latest = this.dtLatestStart.Value;
DateTime newDateTime = new DateTime(latest.Year, latest.Month, latest.Day,
originalDateTime.Hour, originalDateTime.Minute, originalDateTime.Second);
incident.CreatedOn = newDateTime - tsOffset;
}
crm.SubmitChanges(); // Flush changes to database.
}
This is a fairly meaningless example, and the techniques used here would definitely be inadvisable in a production database. However, it does demonstrate the power and simplicity of LINQ and how easy this is to do in Visual Studio 2008 with actually a very small amount of code.
If you don't happen to have a spare 64-bit system and/or can't wait for the public preview, you can see Sean Daniel (SBS Product Manager) discussing and demonstrating SBS 2008 online.
SBS 2008 PM Interview and Demo | Media | TechNet Edge
Someone on LinkedIn recently posed the question:
Which of the technology Open Source or Microsoft you prefer? [sic]
Well that was like a red rag to a bull. My response was voted "best answer" by the original poster, so I suppose I must've said something good. So here is my take on Open Source (actually I think he meant Free Software) vs. Microsoft:
You've got to step back and look at the big picture for the reason why I always recommend Microsoft technology. Because Microsoft has a wide range of solutions from operating systems to server applications to business productivity applications, they can ensure that their products integrate and inter-operate in a way that a disparate set of open source solutions will never be able to match. A classic example of this is how the Office applications integrate with the Sharepoint collaboration server. Another example is how Microsoft's customer relationship management software sits inside of Outlook. How Windows Live Messenger collaborates with other applications to provide presence information. How Office Communicator automatically pauses your music playback when there is an incoming phone call. This is what Microsoft calls "better together" and it means that typically, when multiple products are combined, the whole is greater than the sum of the parts.
I currently use and sell solutions based on open source technology, notably based on the Asterisk PBX because Microsoft doesn't have an equivalent offering - so please note that this is not a technology religion issue for me. I tell my customers that successful IT requires vision and strategy. To achieve that, you need to envision whole solutions and understand how the components integrate and fit together. Comparing individual solutions is only part of the story.
Finally, the standard of support and documentation for open source solutions is often atrocious and often is done as an after-thought or left to the community. Microsoft's documentation is far from perfect but at least it exists and is always up to date. If the answer isn't immediately available, you go to Technet and start searching the Knowledge Base, and if that doesn't work you call support. If you've ever tried to research anything remotely technical concerning an open source solution, you'll know exactly what I mean. If you can find an answer at all, it is often years out of date with respect to the software and heaven help you if you need to speak to someone about a problem. This might be OK for the hobbyist but it is not a situation I want to be in as a business.
Microsoft has launched its World Wide Telescope project, a free downloadable education/science application from Microsoft Research. This interesting project brings together lots of disparate data sources and also references another technology that I am deeply involved in, ASCOM (or, Astronomy Common Object Model). Exciting stuff!

Based on what others have written in various blogs and articles, I previously stated that WWT was based on Seadragon and Photosynth. That was incorrect. I've just had an email exchange with Jonathan Fay, who is intimately involved with World Wide Telescope and someone I've worked with on the ASCOM project. He pointed out that in fact, WWT is based on Visual Experience Engine, it does not use Photosynth or Seadragon. Microsoft has several imaging engines that solve different problems, but are similar in the way you pan and zoom on image sets. Photosynth uses extreme parallax to make a collection of images into a 3d model. Seadragon allows smooth seamless browsing of 2d images and scalable text and graphics. The VEE is a 3d environment that allows massive datasets to be browsed and viewed over small network pipes, while combining the interactive graphics experience with authoring and playback engine to create and play guided tours of 3d environments. Anyone Googling World Wide Telescope is going to quickly get the incorrect impression that it is based on Photosynth and Seadragon, as I did. However, that's not the case. Straight from the horse's mouth.
| Now that we've got the technicalities sorted out, here's a quick peek at what WWT can do. You can drag and zoom around the sky using your mouse and that all works very smoothly, with images and sky survey data being pulled down on demand. High quality images from the Hubble Space Telescope and other sources are overlaid on the sky survey data producing breathtaking views like this one of the Horsehead and Flame nebulae, near the star Alnitak in Orion's belt. Right-clicking brings up the "finder scope" which shows information about the object with links to more in-depth information online (on Wikipedia, for example). |
 | The panes above and below the main display provide quick access to various collections of objects and images, clicking quickly moves to those objects (shown here, the sulpherous moon Io, one of the four Galilean satellites orbiting Jupiter). You can create your own collections, too. |
| An interesting feature with obvious applications in education is the Guided Tour pane, which presents a series of interactive slides complete with audio, while the display of the night sky follows along. This is a beta release and this is one area where you can still see some of the joins. Sometimes the tours don't quite display what they're supposed to. |
| Here's my favourite feature. WWT is compatible with ASCOM telescope drivers, so you can link it up to your own computer assisted telescope and either control the telescope, or have WWT track the telescope and follow along with what you're doing. I know that Bill Gates owns a 10" LX200 (don't ask me how I know that!) so I'm sure he'll be trying this out!
ASCOM has been quietly evolving since it was started in 1999, led by Bob Denny and supported by a handful of dedicated volunteer developers. It defines a set of standards for producing drivers - much like printer drivers - but for astronomy related equipment such as telescopes, observatory domes, focusers and cameras. When WWT was unveiled yesterday, the ASCOM web site crashed under the load of all the people scrambling to download the Platform and associated drivers! Looks like ASCOM is finally getting the widespread recognition it deserves. |
Anyway, don't take my word for it. Go and download World Wide Telescope now for yourself.
Today, Microsoft formally announced availability of Windows Small Business Server 2008 and Windows Essential Server 2008, their server offerings for small- and medium-sized businesses, respectively.
Pricing
Although at face value, the price of Small Business Server seems to have increased, in fact in most situations it is the same price or cheaper than its predecessor. US pricing for FPP (Full Package Product) is available today and will be:
| | Standard Server | Standard CAL | Premium Server | Premium CAL |
| FPP Price | $1,089 | $77 | $1,899 | $189 |
| | | | | |
| Standalone Costs | $2,033 | $206 | $4,031 | $258 |
| Effective saving | 46% | 27% | 53% | 27% |
Licensing and Client Access Licenses (CALs)
The 2008 edition introduces some significant changes in the pricing, licensing and availability of Client Access Licenses - or CALs. Users disliked having to buy CALs in 5-packs, in SBS 2008 CALs will be available individually. The second major change is the introduction of two types of CAL - Standard CAL and Premium CAL. The new Premium CAL covers users who need to access the premium technologies, such as SQL Server Standard Edition. On a Standard Server, all the CALs will be Standard CALs, but a Premium Server has a new blended CAL model. Both Standard and Premium CALs can be used simultaneously, so that the customer need purchase premium CALs only for the users who need access to Premium features. Users who don't need the premium server applications can use the cheaper Standard CAL.
What's New in SBS 2008
Small Business Server 2008 has some important changes that Small Business Partners will need to be aware of. Items marked [Premium] apply only the the Premium server edition.
Based on Windows Server 2008 64-bit edition (the will be no 32-bit edition) - Requires a 64-bit processor and a minimum of 4Gb of RAM
- There will be a migration path but no upgrade install.
- Includes Exchange Server 2007.
- Includes Windows Sharepoint Services 3.0
- [Premium] Includes SQL Server 2008 Standard Edition (compared to Workgroup Edition supplied previously)
- [Premium] Includes a second Windows Server 2008 Standard Edition license so that SQL Server and Line-Of-Business Applications can be installed on a separate device, breaking the 'everything on one box' paradigm that characterised SBS 2003.
- A new, image-based backup application that is designed to backup to disk (external USB drive, for example). SBS 2008 no longer supports tape backup out of the box. Tape backup can be added with a third party application.
- Internet Security & Acceleration Server (ISA Server) has been removed from the product. The dual-NIC configuration is no longer supported, i.e. the Small Business Server will no longer be able to act as the Internet gateway. A separate firewall appliance must be used and many commercial routers already provide this service.
I was just saying to someone the other day how "Windows Ultimate Extras" had been a disappointment and that I'd have been left wanting if that had been my main reason for using Windows Vista Ultimate. Today I noticed that there are some more Ultimate Extras available. There are three more DreamScene animated wallpapers and two new sound schemes.

This all goes some way to answering my critiscism. It would be nice to see something genuinely useful appear in there though - as opposed to slightly frivolous things like wallpaper, sounds and games. How about, say, a media centre extender that allows me to connect remotely to my Windows XP Media Centre and play the recorded TV files remotely? What other ideas can you think of?