<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://theessentialexchange.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Michael&amp;#39;s meanderings...</title><subtitle type="html" /><id>http://theessentialexchange.com/blogs/michael/atom.aspx</id><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/default.aspx" /><link rel="self" type="application/atom+xml" href="http://theessentialexchange.com/blogs/michael/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-06-24T05:44:00Z</updated><entry><title>Script for From The Field</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/10/06/script-for-from-the-field.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/10/06/script-for-from-the-field.aspx</id><published>2008-10-06T19:57:00Z</published><updated>2008-10-06T19:57:00Z</updated><content type="html">&lt;p&gt;The authors of the upcoming &amp;quot;Windows Server 2008 Terminal Services Resource Kit&amp;quot; asked me if I wanted to write a script for them for a section named &amp;quot;From The Field&amp;quot;. I said sure! I based the script on one I wrote a long time ago, which you can access &lt;a class="" href="http://theessentialexchange.com/blogs/michael/archive/2007/11/13/a-small-script-send-email-via-cdo.aspx" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp;So the readers have&amp;nbsp;the EXACT script&amp;nbsp;that was&amp;nbsp;published I&amp;#39;m putting this on my blog.&lt;/p&gt;
&lt;p&gt;The purpose for this script is to tie the script to a particular event that might occur from Terminal Services. This capability&amp;nbsp;is a new feature of the Windows Server 2008 Event Log Subsystem. If that event occurs, then this script is executed to send an email.&lt;/p&gt;
&lt;p&gt;Now, the Resource Kit goes into detail of the event id that happens and how you actually do that tying together. Go buy it!&amp;nbsp; :-)&lt;/p&gt;
&lt;p&gt;Of course, there are multiple ways to skin this cat, but here is one for you to use.&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;&lt;pre&gt;Option Explicit

&amp;#39;&amp;#39;&amp;#39;----- script configuration area
Const strSMTPServer = &amp;quot;arvon.alpineskihouse.com&amp;quot;
Const strFrom       = &amp;quot;alerts@alpineskihouse.com&amp;quot;
Const strTo         = &amp;quot;adam.barr@alpineskihouse.com &amp;quot;
&amp;#39;&amp;#39;&amp;#39;----- end configuration area

Dim objMail               &amp;#39; the CDO object
Dim objWSHNetwork         &amp;#39; windows-script-host network object
Dim strNetBIOSComputer    &amp;#39; the netbios name of our computer

&amp;#39;&amp;#39;&amp;#39; get the NetBIOS computer name
Set objWSHNetwork  = CreateObject (&amp;quot;WScript.Network&amp;quot;)
strNetBIOSComputer = objWSHNetwork.ComputerName
Set objWSHNetwork  = Nothing 

&amp;#39;&amp;#39;&amp;#39; do the real work to send the message 
Set objMail = CreateObject (&amp;quot;CDO.Message&amp;quot;)
objMail.Configuration.Fields.Item (&amp;quot;http://schemas.microsoft.com/cdo/configuration/sendusing&amp;quot;)      = 2
objMail.Configuration.Fields.Item (&amp;quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&amp;quot;)     = strSMTPServer
objMail.Configuration.Fields.Item (&amp;quot;http://schemas.microsoft.com/cdo/configuration/smtpserverport&amp;quot;) = 25
objMail.Configuration.Fields.Update

objMail.From     = strFrom
objMail.To       = strTo
objMail.Subject  = &amp;quot;Critical error!! &amp;quot; &amp;amp; strNetBIOSComputer &amp;amp; &amp;quot; failed to reboot &amp;quot; &amp;amp; Now
objMail.Textbody = &amp;quot;Critical error!! &amp;quot; &amp;amp; strNetBIOSComputer &amp;amp; &amp;quot; failed to reboot &amp;quot; &amp;amp; Now &amp;amp; vbCRLF
objMail.Send

Set objMail = Nothing
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Until next time... &lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know! &lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=371" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Script" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Script/default.aspx" /><category term="Windows" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Windows/default.aspx" /><category term="Books" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Books/default.aspx" /></entry><entry><title>It's All About The IOPS, Silly!</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/09/19/it-s-all-about-the-iops-silly.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/09/19/it-s-all-about-the-iops-silly.aspx</id><published>2008-09-19T13:50:00Z</published><updated>2008-09-19T13:50:00Z</updated><content type="html">&lt;p&gt;In yesterday&amp;#39;s EMO (Exchange Messaging Outlook eZine, subscribe at &lt;a href="http://www.slipstick.com/emo"&gt;http://www.slipstick.com/emo&lt;/a&gt;) I had an article named &lt;a class="" href="http://peach.ease.lsoft.com/scripts/wa.exe?A2=ind0809&amp;amp;L=EMO-NEWSLETTER&amp;amp;T=0&amp;amp;F=&amp;amp;S=&amp;amp;P=1470" target="_blank"&gt;It&amp;#39;s All About The IOPS, Silly!&lt;/a&gt; which discussed the impact of RAID-1 and RAID-5 arrays on total IOPS calculations.&lt;/p&gt;
&lt;p&gt;However, space didn&amp;#39;t allow me to talk about SANs (Storage Area Networks) in regards to IOPS.&lt;/p&gt;
&lt;p&gt;Where Exchange is concerned (and SQL Server as well, although that isn&amp;#39;t our focus here), you do not want to be sharing your &amp;quot;disk group&amp;quot; or &amp;quot;volume group&amp;quot; or &amp;quot;virtual array&amp;quot; (or whatever your SAN software calls it) with any other application&amp;nbsp;- unless you&amp;#39;ve performance tested it in the worst case.&lt;/p&gt;
&lt;p&gt;SANs allocate storage in terms of LUNs - Logical Unit Numbers. For a given server, a LUN is allocated to that server (note that in the case of clusters, quorum disk may be visible to multiple servers at one time) and only one server may have write access to that LUN at a time. A LUN may, or may not, be tied to a particular disk array or disk set contained within the physical hardware of the SAN.&lt;/p&gt;
&lt;p&gt;Many types of SAN software support a concept known as &amp;quot;LUN Stacking&amp;quot;. In this case, an array (be it RAID-1, RAID-5, RAID-10, whatever) has multiple logical stripes of the disk where multiple LUNs are allocated on the same array. Arguably, this is what SANs are all about - allowing you to control storage logically instead of drive-by-drive. And, for many (perhaps most) applications this makes sense.&lt;/p&gt;
&lt;p&gt;However, while the BEST CASE SCENARIO says that the IOPS available for a LUN is the maximum IOPS available for that disk set, the WORST CASE scenario says that the IOPS available for a LUN is equal to the number of accessors (servers) that are using that physical array.&lt;/p&gt;
&lt;p&gt;So, for example, if you have five servers hitting a RAID-1 array via different LUNS, the best case performance scenario says that you can have the maxiumum IOPS available to the hardware available to each server. The worst case is IOPS / 5.&lt;/p&gt;
&lt;p&gt;For example, if your RAID-1 group has a calculated IOPS of 250, one server could potentially benefit from having a total IOPS of 250 available to it. However, if all the servers are hitting the disk, the performance would be more like 50 IOPS. While for many small and medium businesses, an IOPS of 250 is probably sufficient to meet their Exchange needs - only the smallest of companies can get adequate performance on 50 IOPS total.&lt;/p&gt;
&lt;p&gt;Another reason you want to avoid sharing LUNs is due to the usage profiles of the various Exchange needs.&lt;/p&gt;
&lt;p&gt;Database access (which includes queues, mailbox stores, and public folder stores) is completely random. The creation of log files (transaction log files, message tracking logfiles, and protocol log files) is completely sequential. If you share LUNs between different usage profiles, then your performance will suffer (especially for those needs which are optimized for sequential access).&lt;/p&gt;
&lt;p&gt;Conclusion: Just Say No! Don&amp;#39;t let your SAN guys tell you what kind of storage performance requirements Exchange has. You need to be prepared to tell them!&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=368" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Administration" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Administration/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Groups and their Membership</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/09/19/groups-and-their-membership.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/09/19/groups-and-their-membership.aspx</id><published>2008-09-19T13:09:00Z</published><updated>2008-09-19T13:09:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;m working with a new client and this client is a &amp;quot;wholly owned subsidiary&amp;quot; of another company and is getting ready to be spun off as their own company.&lt;/p&gt;
&lt;p&gt;One of the things we are doing is configuring their network to be standalone and not part of the corporate Active Directory. That involves creating users, group, moving computers, installing a new Exchange organization, etc. etc.&lt;/p&gt;
&lt;p&gt;But sometimes it&amp;#39;s the simple things that bite you...&lt;/p&gt;
&lt;p&gt;We&amp;#39;d gotten an export of the OU for the subsidiary out of corporate in a CSV file - every object, every attribute. That was a mess in-and-of itself, but at least all the data was there.&lt;/p&gt;
&lt;p&gt;So we started importing the data. And it broke.&lt;/p&gt;
&lt;p&gt;Huh? We&amp;#39;d done this before and no problem. What was going on here?&lt;/p&gt;
&lt;p&gt;Like I said - the simple things...&lt;/p&gt;
&lt;p&gt;This set of users and groups were using embedded groups. Sometimes up to five levels deep. (That is, a group within a group within a group within a group within a group.)&lt;/p&gt;
&lt;p&gt;Well, you can&amp;#39;t assign a group membership to a group that doesn&amp;#39;t exist! Seems obvious, in retrospect.&lt;/p&gt;
&lt;p&gt;The solution? Go through and harvest all groups FIRST - just create the groups in Active Directory. Then, go back through and assign membership to the groups.&lt;/p&gt;
&lt;p&gt;Here is a somewhat sanitized version of the code we used. On the first pass, it creates groups. On the second pass, it will assign membership to the groups. This shows a number of PowerShell techniques in group management - including creating groups, checking for membership in a group, and adding members to a group.&lt;/p&gt;
&lt;p&gt;Also note: there are several places where this script could be optimized. But I was more interested in clarity (since, as a consultant, I won&amp;#39;t be there forever!).&lt;/p&gt;
&lt;p&gt;I hope you find this useful&amp;nbsp;for your scripts!&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;&lt;pre&gt;set-variable ADS_GROUP_TYPE_DOMAIN_LOCALGROUP 1          
set-variable ADS_GROUP_TYPE_GLOBAL_GROUP      2          
set-variable ADS_GROUP_TYPE_LOCAL_GROUP       4          
set-variable ADS_GROUP_TYPE_UNIVERSAL_GROUP   8          
set-variable ADS_GROUP_TYPE_SECURITY_ENABLED -2147483648 

$groupType = $ADS_GROUP_TYPE_GLOBAL_GROUP –bor $ADS_GROUP_TYPE_SECURITY_ENABLED

$csv = import-csv GroupsOnly.csv
#
# Each line contains the dn, the name, the description if one exists, and the member list
# with the dn of each group member. The member list has each member separated by a semi-colon.
#
foreach ($line in $csv)
{
	$dn = $line.dn
	$adsPath = &amp;quot;LDAP://&amp;quot; + $dn
	$objGroup = [ADSI]$adsPath
	if ($objGroup.Name)
	{
		# the above verifies that the group exists. Note that 
		# ADSI is &amp;quot;smart&amp;quot;. It doesn&amp;#39;t actually access AD and 
		# fill the property cache until you read an attribute
		# from the object.
		&amp;quot;Exists: &amp;quot; + $line.Name
		if ($line.member.Length -gt 0)
		{
			$i = 0
			$members = $line.member.Split(&amp;quot;;&amp;quot;)
			$lower   = $dn.ToLower()
			foreach ($member in $members)
			{
				$objMember = [ADSI](&amp;quot;LDAP://&amp;quot; + $member)
				if ($objMember.Name)
				{
					# check to see if member is already in group
					[bool]$already = $false
					$userGroups = $objMember.memberOf.Value
					if ($userGroups)
					{
						foreach ($usergroup in $userGroups)
						{
							if ($userGroup.ToLower() -eq $lower)
							{
								$already = $true
								break
							}
						}
					}
					$objMember = $null
					if ($already)
					{
						&amp;quot;`tAlready in group: $member&amp;quot;
					}
					else
					{
						$objGroup.Add((&amp;quot;LDAP://&amp;quot; + $member))
						if ($?)
						{
							&amp;quot;`tAdded to group: $member&amp;quot;
							$i++
						}
						else
						{
							# should be an error displayed on the PowerShell window
							&amp;quot;`tCouldn&amp;#39;t add to group: $member&amp;quot;
						}
					}
				}
				else
				{
					# member specified in CSV doesn&amp;#39;t exist in Active Directory
					&amp;quot;`tObject doesn&amp;#39;t exist: $member&amp;quot;
				}
			}
			&amp;quot;`tadded $i members&amp;quot;
		}
		else
		{
			# members element of the CSV was empty
			&amp;quot;`tno members specified for group&amp;quot;
		}
		$objGroup = $null
	}
	else 
	{
		&amp;quot;Creating &amp;quot; + $line.Name

		$parent = &amp;quot;LDAP://&amp;quot; + $dn.SubString(1 + $dn.IndexOf(&amp;quot;,&amp;quot;))
		$object = [ADSI]$parent
		$child  = $object.Create(&amp;quot;group&amp;quot;, &amp;quot;CN=&amp;quot; + $line.Name)

		$child.Put(&amp;quot;groupType&amp;quot;,      $groupType)
		$child.Put(&amp;quot;sAMAccountName&amp;quot;, $line.name)
		$child.Put(&amp;quot;name&amp;quot;,           $line.name)

		if ($line.description.length -gt 0)
		{
			$child.Put(&amp;quot;description&amp;quot;,    $line.description)
		}

		$child.SetInfo()
		$child = $null

	}

	sleep -milli 500
}

$csv = $null
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=367" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Active Directory" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Active+Directory/default.aspx" /><category term="PowerShell" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/PowerShell/default.aspx" /></entry><entry><title>I Have a Logo!</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/09/04/i-have-a-logo.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/09/04/i-have-a-logo.aspx</id><published>2008-09-04T22:03:00Z</published><updated>2008-09-04T22:03:00Z</updated><content type="html">&lt;p&gt;In case anyone besides me is counting, I&amp;#39;ve been at this (consulting, writing, speaking, etc.) for 10 months now. I&amp;#39;m having a blast. I wish I&amp;#39;d done this years ago.&lt;/p&gt;
&lt;p&gt;Two months ago I took on a partner and we formed Smith Consulting d/b/a The Essential Exchange as a legal entity (as opposed to the sole proprietership I was previously).&lt;/p&gt;
&lt;p&gt;After several weeks of back-and-forth, we finally came up with a logo today, and I&amp;#39;m very pleased with it. It will replace the generic icons you see on this blog fairly soon (image manipulation is not my strong suit). Here it is:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://theessentialexchange.com/blogs/michael/SmithConsulting.gif"&gt;&lt;img src="http://theessentialexchange.com/blogs/michael/SmithConsulting.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=363" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Personal" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Personal/default.aspx" /></entry><entry><title>Exchange 2007 Backup and Restore - The Minimum</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/09/04/exchange-2007-backup-and-restore-the-minimum.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/09/04/exchange-2007-backup-and-restore-the-minimum.aspx</id><published>2008-09-04T21:22:00Z</published><updated>2008-09-04T21:22:00Z</updated><content type="html">&lt;p&gt;In larger organizations, the overhead associated with backing up every server in an organization (where every server is already redundant in some way) can become onerous and expensive. In those types of organizations, with dedicated virtual servers for a specific feature or multiple pieces of physical hardware set up clustered or otherwise redundant (round robin, network load balancing, etc.); you are primarily interested in only backing up what makes a particular server unique.&lt;/p&gt;
&lt;p&gt;You are well aware that in the case of a catastrophic failure, you can &amp;quot;spin up&amp;quot; a replacement in a couple of hours, be it virtual or physical hardware. It would take longer than that to execute a full restore following all the proper steps.&lt;/p&gt;
&lt;p&gt;Therefore, many applications, Exchange included, provide you a mechanism for backing up and restoring only those &amp;quot;things you need&amp;quot;.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s take the example of a Client Access Server (CAS) crashing catastrophically. For example, a piece of hair falls on the motherboard and it fizzles, taking out the motherboard AND the directly attached storage (DAS). [[OK: not a particularly likely example, but still illustrative.]]&lt;/p&gt;
&lt;p&gt;What do you need to have saved in order to CYA (Cover Your A$$)??&lt;/p&gt;
&lt;p&gt;Your first option is, of course, the old standard: full system backup, which you can restore after doing a bare metal install of Windows Server to compatible hardware.&lt;/p&gt;
&lt;p&gt;The second option, which is a bit more detailed but MUCH quicker, if you&amp;#39;ve prepared for it, goes as follows:&lt;/p&gt;
&lt;p&gt;1] Image a new machine, and name it the same as the old machine&lt;/p&gt;
&lt;p&gt;2] Install Exchange, using the /mode:RecoverServer switch, with all other options set to the SAME as you used to install the original server (this is when using DEFAULTS can really save your bacon -- or having excellent server installation documentation)&lt;/p&gt;
&lt;p&gt;3] Restore the HKLM\SOFTWARE\Microsoft\Exchange registry key (which you smartly exported and backed up)&lt;/p&gt;
&lt;p&gt;4] Restore the ClientAccess Exchange directory (which you also had smartly exported and backed up), which is located by default at C:\Program Files\Microsoft\Exchange\ClientAccess&lt;/p&gt;
&lt;p&gt;5] Restore the IIS metabase settings by executing restorevdir.ps1 (since you had executed savevdir.ps1 to back those settings up!)&lt;/p&gt;
&lt;p&gt;And wow. You are done. &lt;/p&gt;
&lt;p&gt;If you have practiced this process, and your imaging process is fast; you can probably be done in less than 30 minutes. Much less than the two hours or so that a full recovery is probably is going to take you.&lt;/p&gt;
&lt;p&gt;Granted, the above is simply an overview. You need to work out the specific details for your environment, but it really isn&amp;#39;t that hard. Here are some resources to help you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://technet.microsoft.com/en-us/library/aa998364(EXCHG.80).aspx" target="_blank"&gt;Client Access Server Data&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://technet.microsoft.com/en-us/library/bb124359%28EXCHG.80%29.aspx" target="_blank"&gt;How to Back Up and Restore a Client Access Server&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://technet.microsoft.com/en-us/library/bb124780(EXCHG.80).aspx" target="_blank"&gt;What Needs to be Protected in an Exchange Environment&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://technet.microsoft.com/en-us/library/aa997709(EXCHG.80).aspx" target="_blank"&gt;How to Back Up the System State and the Exchange Program Files&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Actually, writing a script to do this might be a good project, if I ever get a few free minutes. :-)&lt;/p&gt;
&lt;p&gt;You can also extend this concept for generating clones and redundant servers within an Exchange organization. If you examine the various text files, you will note that modifying them for other server names is not that difficult.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=362" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Administration" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Administration/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Exchange Disk Space, version 2.1</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/08/07/exchange-disk-space-version-2-1.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/08/07/exchange-disk-space-version-2-1.aspx</id><published>2008-08-07T20:45:00Z</published><updated>2008-08-07T20:45:00Z</updated><content type="html">&lt;p&gt;It was pointed out to me, by a party that shall remain nameless, that I depended in today&amp;#39;s earlier post &lt;a class="" href="http://theessentialexchange.com/blogs/michael/archive/2008/08/07/finding-disk-space-used-by-exchange-version-2.aspx" target="_blank"&gt;Finding Disk Space Used By Exchange Version 2&lt;/a&gt;, that I ASSumed that msExchCurrentServerRoles would never be higher than 64 and that that was a bad assumption on my part, for reasons that shall also remain nameless.&lt;/p&gt;
&lt;p&gt;So, here is a &amp;quot;fixed&amp;quot; version of just the ShowServerInfo() subroutine. Just rip the old one out, and add the new one in:&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;&lt;pre&gt;Const Exch_Role_Edge         = 64   &amp;#39; 0x40
Const Exch_Role_Hub          = 32   &amp;#39; 0x20
Const Exch_Role_UM           = 16   &amp;#39; 0x10
Const Exch_Role_ClientAccess = 4    &amp;#39; 0x04
Const Exch_Role_Mailbox      = 2    &amp;#39; 0x02

Sub ShowServerInfo (ByVal spaces, ByVal strServer)
	Dim objServer, obj
	Dim str, i, msExchCurrentRoles

	On Error Resume Next
	Err.Clear

	Set objServer = GetObject (&amp;quot;LDAP://&amp;quot; &amp;amp; strServer)
	If Err = 0 Then
		msExchCurrentRoles = objServer.Get (&amp;quot;msExchCurrentServerRoles&amp;quot;)
		If Err = 0 Then
			i = msExchCurrentRoles
			str = &amp;quot;&amp;quot;
			&amp;#39;&amp;#39; got a exchange 2007 or higher box
			If (msExchCurrentRoles and Exch_Role_Mailbox) = Exch_Role_Mailbox Then
				str = str &amp;amp; &amp;quot;Mailbox &amp;quot;
				i = i - Exch_Role_Mailbox
			End If

			If (msExchCurrentRoles and Exch_Role_ClientAccess) = Exch_Role_ClientAccess Then
				str = str &amp;amp; &amp;quot;ClientAccess &amp;quot;
				i = i - Exch_Role_ClientAccess
			End If

			If (msExchCurrentRoles and Exch_Role_UM) = Exch_Role_UM Then
				str = str &amp;amp; &amp;quot;UnifiedMessaging &amp;quot;
				i = i - Exch_Role_UM
			End If

			If (msExchCurrentRoles and Exch_Role_Hub) = Exch_Role_Hub Then
				str = str &amp;amp; &amp;quot;HubTransport &amp;quot;
				i = i - Exch_Role_Hub
			End If

			If (msExchCurrentRoles and Exch_Role_Edge) = Exch_Role_Edge Then
				str = str &amp;amp; &amp;quot;EdgeTransport &amp;quot;
				i = i - Exch_Role_Edge
			End If

			If i &amp;lt;&amp;gt; 0 Then
				str = str &amp;amp; vbCRLF &amp;amp; Space (spaces) &amp;amp; _
					&amp;quot;Unknown bits set in msExchCurrentRoles = 0x&amp;quot; &amp;amp; Hex(i)
			End If

			e Space (spaces) &amp;amp; &amp;quot;Exchange roles installed: &amp;quot; &amp;amp; str
		Else
			i = objServer.Get (&amp;quot;serverRole&amp;quot;)
			If i = 1 Then
				e Space (spaces) &amp;amp; &amp;quot;Exchange role: Front-end server&amp;quot;
			Else
				e Space (spaces) &amp;amp; &amp;quot;Exchange role: Back-end server&amp;quot;
			End If
		End If
		Err.Clear

		obj = objServer.Get (&amp;quot;serialNumber&amp;quot;)
		If Err = 0 Then
			If IsNull (obj) Then
				e Space (spaces) &amp;amp; &amp;quot;No version found&amp;quot;
			ElseIf IsEmpty (obj) Then
				e Space (spaces) &amp;amp; &amp;quot;Version string is empty&amp;quot;
			ElseIf IsArray (obj) Then
				For Each str in obj
					e Space (spaces) &amp;amp; str
				Next
			Else
				e Space (spaces) &amp;amp; obj
			End If
		End If
		Err.Clear

	End If
	e &amp;quot; &amp;quot;
	Set objServer = Nothing

	On Error Goto 0
End Sub
&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;Until next time...&lt;/pre&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=352" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Administration" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Administration/default.aspx" /><category term="Active Directory" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Active+Directory/default.aspx" /><category term="Script" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Script/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Finding Disk Space Used by Exchange, version 2</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/08/07/finding-disk-space-used-by-exchange-version-2.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/08/07/finding-disk-space-used-by-exchange-version-2.aspx</id><published>2008-08-07T17:36:00Z</published><updated>2008-08-07T17:36:00Z</updated><content type="html">&lt;p&gt;In July of 2006, I had a blog entry named &lt;a class="" href="http://theessentialexchange.com/blogs/michael/archive/2007/11/13/finding-disk-space-used-by-exchange.aspx" target="_blank"&gt;Finding Disk Space Used By Exchange&lt;/a&gt;, and it was quite well received and it worked well for most people.&lt;/p&gt;
&lt;p&gt;However, it had a few issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;It doesn&amp;#39;t work with Exchange Server 2007 because the streaming file was removed from Exchange&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;If a Recovery Storage Group was present, but the files were removed, it would fail&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;If an Exchange Server was not reachable via UNC path, it would fail&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;There was also one out-and-out bug: Per-server totals were not zeroed after each server was evaluated.&lt;/p&gt;
&lt;p&gt;And from a feature perspective, lots of folks wanted some information about the storage groups (circular logging, log prefix, etc.) and the servers (version and server roles).&lt;/p&gt;
&lt;p&gt;There is a &lt;a class="" href="http://www.microsoft.com/technet/scriptcenter/csc/scripts/email/exchange/cscem065.mspx" target="_blank"&gt;Microsoft script&lt;/a&gt; that also contains much of this information, but it is based on CDOEXM, which means that it pretty much must run on an Exchange 2003 server; and it also has the same three issues mentioned above (plus a couple of others - for example, if the EDB and STM files were separated on different volumes or path, it would also fail). James Chong, another Microsoft Exchange MVP, pointed out that script to me. It does have a feature of reporting the current sizes of the logs being used by a storage group.&lt;/p&gt;
&lt;p&gt;So, in this version 2, I&amp;#39;ve fixed the three issues above, fixed the out-and-out bug, and now I provide a fair bit of information about each storage group. I think I also now check for all possible errors that could occur. As before, this script does depend on my &lt;a class="" href="http://theessentialexchange.com/blogs/michael/archive/2007/11/13/utility-libraries-for-exchange-scripting.aspx" target="_blank"&gt;Utility Libraries for Exchange Scripting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have tested this script in an environment containing Exchange 2000, Exchange 2003, and Exchange 2007. It should work for you with all of those too!&lt;/p&gt;
&lt;p&gt;Some sample output from my small test environment:&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;&lt;pre&gt;Exchange Organization Name: First Organization
Default SMTP address for organization: essential.local

All Exchange Servers in forest DC=essential,DC=local
	Server Name: WIN2003-EXCH
	Server Name: WIN2008-EXCH
 
Server name: WIN2003-EXCH
  Exchange role: Back-end server
  Version Version 6.5 (Build 7638.2: Service Pack 2)
 
  Storage group: First Storage Group
    Circular Logging is False
    Zero out deleted databse pages is False
    Log file prefix is E00
    Transaction log location is C:\Program Files\Exchsrvr\mdbdata
    System path location is C:\Program Files\Exchsrvr\mdbdata
 
    Store: Public Folder Store (WIN2003-EXCH)
      EDB file: C:\Program Files\Exchsrvr\mdbdata\pub1.edb
      Size: 18 megabytes
      SLV file: C:\Program Files\Exchsrvr\mdbdata\pub1.stm
      Size: 4 megabytes
      Store Size Total: 22 megabytes
    Store: Mailbox Store (WIN2003-EXCH)
      EDB file: C:\Program Files\Exchsrvr\mdbdata\priv1.edb
      Size: 6 megabytes
      SLV file: C:\Program Files\Exchsrvr\mdbdata\priv1.stm
      Size: 8 megabytes
      Store Size Total: 14 megabytes
    Storage Group total: 36 megabytes
  Server total: 36 megabytes
 
Server name: WIN2008-EXCH
  Exchange roles installed: HubTransport ClientAccess Mailbox
  Version Version 8.1 (Build 30240.6)
 
  Storage group: First Storage Group
    Circular Logging is False
    Zero out deleted databse pages is False
    Log file prefix is E00
    Transaction log location is C:\Program Files\Microsoft\Exchange Server\Mailbox\First Storage Group
    System path location is C:\Program Files\Microsoft\Exchange Server\Mailbox\First Storage Group
 
    Store: Mailbox Database
      EDB file: C:\Program Files\Microsoft\Exchange Server\Mailbox\First Storage Group\Mailbox Database.edb
      ** Could not open file: \\WIN2008-EXCH\C$\Program Files\Microsoft\Exchange Server\Mailbox\First Storage Group\Mailbox Database.edb
      Could not find streaming filename in active directory
      Store Size Total: 0 megabytes
    Storage Group total: 0 megabytes
  Storage group: Recovery Storage Group
    Circular Logging is False
    Zero out deleted databse pages is False
    Log file prefix is R00
    Transaction log location is C:\rsg
    System path location is C:\rsg
 
    Store: Mailbox Database
      EDB file: C:\rsg\Mailbox Database.edb
      ** Could not open file: \\WIN2008-EXCH\C$\rsg\Mailbox Database.edb
      Could not find streaming filename in active directory
      Store Size Total: 0 megabytes
    Storage Group total: 0 megabytes
  Storage group: Second Storage Group
    Circular Logging is False
    Zero out deleted databse pages is False
    Log file prefix is E01
    Transaction log location is C:\Program Files\Microsoft\Exchange Server\Mailbox\Second Storage Group
    System path location is C:\Program Files\Microsoft\Exchange Server\Mailbox\Second Storage Group
 
    Store: Public Folder Database
      EDB file: C:\Program Files\Microsoft\Exchange Server\Mailbox\Second Storage Group\Public Folder Database.edb
      ** Could not open file: \\WIN2008-EXCH\C$\Program Files\Microsoft\Exchange Server\Mailbox\Second Storage Group\Public Folder Database.edb
      Could not find streaming filename in active directory
      Store Size Total: 0 megabytes
    Storage Group total: 0 megabytes
  Server total: 0 megabytes
 
Organization total: 36 megabytes

&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;And here is the code for your enjoyment:&lt;/p&gt;&lt;font color="green"&gt;&lt;/font&gt;&lt;font color="green"&gt;&lt;pre&gt;&amp;lt;JOB&amp;gt;
&amp;lt;SCRIPT language=&amp;quot;VBScript&amp;quot;&amp;gt;
Option Explicit
&amp;lt;/SCRIPT&amp;gt;
&amp;lt;SCRIPT language=&amp;quot;VBScript&amp;quot; src=&amp;quot;lib/constants.vbs&amp;quot; mce_src=&amp;quot;lib/constants.vbs&amp;quot;&amp;gt;
&amp;lt;script language=&amp;quot;VBScript&amp;quot; src=&amp;quot;lib/ado.vbs&amp;quot; mce_src=&amp;quot;lib/ado.vbs&amp;quot;           &amp;gt;
&amp;lt;script language=&amp;quot;VBScript&amp;quot; src=&amp;quot;lib/report.vbs&amp;quot; mce_src=&amp;quot;lib/report.vbs&amp;quot;        &amp;gt;
&amp;lt;script language=&amp;quot;VBScript&amp;quot; src=&amp;quot;lib/systeminfo.vbs&amp;quot; mce_src=&amp;quot;lib/systeminfo.vbs&amp;quot;    &amp;gt;
&amp;lt;script language=&amp;quot;VBScript&amp;quot; src=&amp;quot;lib/queries.vbs&amp;quot; mce_src=&amp;quot;lib/queries.vbs&amp;quot;       &amp;gt;
&amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;
&amp;#39;
&amp;#39; exch-store-space.wsf
&amp;#39;
&amp;#39; This program reports on the space utilization of the EDB and STM
&amp;#39; files for all stores for all storage groups for all servers in the
&amp;#39; Exchange organization.
&amp;#39;
&amp;#39; Updated on August 8, 2008 to deal with missing files
&amp;#39; Also now works with Exchange 2007 (no msExchSLVFile attribute on 2007 servers)
&amp;#39; Also dumps some data about each individual storage group
&amp;#39; Also won&amp;#39;t abort on missing Recovery Storage Group
&amp;#39; Also total per-server correctly
&amp;#39;
Dim arr, arrSG, arrStore
Dim s, s1, strServer
Dim i, j, k, orgTotal
Dim objFSO

Call GetSystemInfo
Call GetAllServers

Set objFSO = CreateObject (&amp;quot;Scripting.FileSystemObject&amp;quot;)

arr = Split (strServerListDN, &amp;quot;;&amp;quot;)

For i = LBound (arr) To UBound (arr)
	Dim serverTotal

	serverTotal = 0
	s = arr (i)
	strServer = Mid (Left (s, Instr (s, &amp;quot;,&amp;quot;) - 1), 4)
	e &amp;quot;Server name: &amp;quot; &amp;amp; strServer

	Call ShowServerInfo (2, s)

	Call GetStorageGroupsForServer (arr (i))

	arrSG = Split (strServerSGDN, &amp;quot;;&amp;quot;)

	For j = LBound (arrSG) To UBound (arrSG)
		Dim sgTotal

		sgTotal = 0

		s = arrSG (j)
		s1 = Mid (Left (s, Instr (s, &amp;quot;,&amp;quot;) - 1), 4)
		e Space (2) &amp;amp; &amp;quot;Storage group: &amp;quot; &amp;amp; s1

		Call ShowStorageGroupInfo (4, s)

		Call GetStoresForStorageGroupLDAP (s)

		arrStore = Split (strStoreDN, &amp;quot;;&amp;quot;)

		For k = LBound (arrStore) To UBound (arrStore)
			Dim obj, objFile, strFile, storeTotal

			storeTotal = 0

			s = arrStore (k)
			s1 = Mid (Left (s, Instr (s, &amp;quot;,&amp;quot;) - 1), 4)
			e Space (4) &amp;amp; &amp;quot;Store: &amp;quot; &amp;amp; s1

			On Error Resume Next
			Err.Clear

			Set obj = GetObject (&amp;quot;LDAP://&amp;quot; &amp;amp; s)

			If Err Then
				e Space (6) &amp;amp; &amp;quot;** Could not open store in active directory&amp;quot;
			Else
				s = obj.Get (&amp;quot;msExchEDBFile&amp;quot;)
				If Err Then
					e Space (6) &amp;amp; &amp;quot;** Could not find EDB filename in active directory&amp;quot;
				Else
				
					e Space (6) &amp;amp; &amp;quot;EDB file: &amp;quot; &amp;amp; s
					&amp;#39; must convert the file to a UNC path
					strFile = &amp;quot;\\&amp;quot; &amp;amp; strServer &amp;amp; &amp;quot;\&amp;quot; &amp;amp; _
						Left (s, 1) &amp;amp; &amp;quot;$&amp;quot; &amp;amp; Mid (s, 3)
					Set objFile = objFSO.GetFile (strFile)
					If Err Then
						e Space (6) &amp;amp; &amp;quot;** Could not open file: &amp;quot; &amp;amp; strFile
					Else
						e Space (6) &amp;amp; &amp;quot;Size: &amp;quot; &amp;amp; _
							FormatNumber (objFile.Size / (1024 * 1024), 0) &amp;amp; _
							&amp;quot; megabytes&amp;quot;
						storeTotal = storeTotal + (objFile.Size / (1024 * 1024))
					End If
				End If
				Err.Clear

				s = obj.Get (&amp;quot;msExchSLVFile&amp;quot;)
				If Err Then
					e Space (6) &amp;amp; &amp;quot;Could not find streaming filename in active directory&amp;quot;
				Else
					e Space (6) &amp;amp; &amp;quot;SLV file: &amp;quot; &amp;amp; s
					strFile = &amp;quot;\\&amp;quot; &amp;amp; strServer &amp;amp; &amp;quot;\&amp;quot; &amp;amp; _
						Left (s, 1) &amp;amp; &amp;quot;$&amp;quot; &amp;amp; Mid (s, 3)
					Set objFile = objFSO.GetFile (strFile)
					If Err Then
						e Space (6) &amp;amp; &amp;quot;** Could not open file: &amp;quot; &amp;amp; strFile
					Else
						e Space (6) &amp;amp; &amp;quot;Size: &amp;quot; &amp;amp; _
							FormatNumber (objFile.Size / (1024 * 1024), 0) &amp;amp; _
							&amp;quot; megabytes&amp;quot;
						storeTotal = storeTotal + (objFile.Size / (1024 * 1024))
					End If
				End If
				Err.Clear

				e Space (6) &amp;amp; &amp;quot;Store Size Total: &amp;quot; &amp;amp; _
					FormatNumber (storeTotal, 0) &amp;amp; _
					&amp;quot; megabytes&amp;quot;
				sgTotal = sgTotal + storeTotal
			End If

			On Error Goto 0
		Next

		e Space (4) &amp;amp; &amp;quot;Storage Group total: &amp;quot; &amp;amp; FormatNumber (sgTotal, 0) &amp;amp; _
			&amp;quot; megabytes&amp;quot;
		serverTotal = serverTotal + sgTotal
	Next

	e Space (2) &amp;amp; &amp;quot;Server total: &amp;quot; &amp;amp; FormatNumber (serverTotal, 0) &amp;amp; &amp;quot; megabytes&amp;quot;
	e &amp;quot; &amp;quot;
	orgTotal = orgTotal + serverTotal
Next
e &amp;quot;Organization total: &amp;quot; &amp;amp; FormatNumber (orgTotal, 0) &amp;amp; &amp;quot; megabytes&amp;quot;

Call ClearSystemInfo

Sub ShowServerInfo (ByVal spaces, ByVal strServer)
	Dim objServer, obj
	Dim str, i

	On Error Resume Next
	Err.Clear

	Set objServer = GetObject (&amp;quot;LDAP://&amp;quot; &amp;amp; strServer)
	If Err = 0 Then
		i = objServer.Get (&amp;quot;msExchCurrentServerRoles&amp;quot;)
		If Err = 0 Then
			str = &amp;quot;&amp;quot;
			&amp;#39;&amp;#39; got a exchange 2007 or higher box
			If i &amp;gt;= 64 Then
				str = str &amp;amp; &amp;quot;EdgeTransport &amp;quot;
				i = i - 64
			End If
			If i &amp;gt;= 32 Then
				str = str &amp;amp; &amp;quot;HubTransport &amp;quot;
				i = i - 32
			End If
			If i &amp;gt;= 16 Then
				str = str &amp;amp; &amp;quot;UnifiedMessaging &amp;quot;
				i = i - 16
			End If
			If i &amp;gt;= 4 Then
				str = str &amp;amp; &amp;quot;ClientAccess &amp;quot;
				i = i - 4
			End If
			If i &amp;gt;= 2 Then
				str = str &amp;amp; &amp;quot;Mailbox&amp;quot;
				i = i - 2
			End If
			e Space (spaces) &amp;amp; &amp;quot;Exchange roles installed: &amp;quot; &amp;amp; str
		Else
			i = objServer.Get (&amp;quot;serverRole&amp;quot;)
			If i = 1 Then
				e Space (spaces) &amp;amp; &amp;quot;Exchange role: Front-end server&amp;quot;
			Else
				e Space (spaces) &amp;amp; &amp;quot;Exchange role: Back-end server&amp;quot;
			End If
		End If
		Err.Clear

		obj = objServer.Get (&amp;quot;serialNumber&amp;quot;)
		If Err = 0 Then
			If IsNull (obj) Then
				e Space (spaces) &amp;amp; &amp;quot;No version found&amp;quot;
			ElseIf IsEmpty (obj) Then
				e Space (spaces) &amp;amp; &amp;quot;Version string is empty&amp;quot;
			ElseIf IsArray (obj) Then
				For Each str in obj
					e Space (spaces) &amp;amp; &amp;quot;Version &amp;quot; &amp;amp; str
				Next
			Else
				e Space (spaces) &amp;amp; &amp;quot;Version &amp;quot; &amp;amp; obj
			End If
		End If
		Err.Clear

	End If
	e &amp;quot; &amp;quot;
	Set objServer = Nothing

	On Error Goto 0
End Sub

Sub ShowStorageGroupInfo (ByVal spaces, ByVal strSG)
	Dim objSG
	Dim str, i
	Dim prefix

	prefix = &amp;quot;msExchESEParam&amp;quot;   &amp;#39;&amp;#39; all storage group attributes start with that prefix

	On Error Resume Next
	Err.Clear

	Set objSG = GetObject (&amp;quot;LDAP://&amp;quot; &amp;amp; strSG)
	If Err = 0 Then
		i = objSG.Get (prefix &amp;amp; &amp;quot;CircularLog&amp;quot;)
		If Err = 0 Then
			e Space (spaces) &amp;amp; &amp;quot;Circular Logging is &amp;quot; &amp;amp; CBool(i)
		End If
		Err.Clear

		i = objSG.Get (prefix &amp;amp; &amp;quot;ZeroDatabaseDuringBackup&amp;quot;)
		If Err = 0 Then
			e Space (spaces) &amp;amp; &amp;quot;Zero out deleted databse pages is &amp;quot; &amp;amp; CBool (i)
		End If
		Err.Clear

		str = objSG.Get (prefix &amp;amp; &amp;quot;BaseName&amp;quot;)
		If Err = 0 Then
			e Space (spaces) &amp;amp; &amp;quot;Log file prefix is &amp;quot; &amp;amp; str
		End If
		Err.Clear

		str = objSG.Get (prefix &amp;amp; &amp;quot;LogFilePath&amp;quot;)
		If Err = 0 Then
			e Space (spaces) &amp;amp; &amp;quot;Transaction log location is &amp;quot; &amp;amp; str
		End If
		Err.Clear

		str = objSG.Get (prefix &amp;amp; &amp;quot;SystemPath&amp;quot;)
		If Err = 0 Then
			e Space (spaces) &amp;amp; &amp;quot;System path location is &amp;quot; &amp;amp; str
		End If
		Err.Clear

		e &amp;quot; &amp;quot;
	Else
		e Space (spaces) &amp;amp; &amp;quot;** Couldn&amp;#39;t open &amp;quot; &amp;amp; strSG
	End If
	Set objSG = Nothing

	On Error Goto 0
End Sub
&amp;lt;/SCRIPT&amp;gt;
&amp;lt;/JOB&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=349" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Administration" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Administration/default.aspx" /><category term="Active Directory" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Active+Directory/default.aspx" /><category term="Script" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Script/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Free Windows Vista Support (SP1 only)</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/30/free-windows-vista-support-sp1-only.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/30/free-windows-vista-support-sp1-only.aspx</id><published>2008-07-30T21:54:00Z</published><updated>2008-07-30T21:54:00Z</updated><content type="html">&lt;p&gt;As you probably know, Microsoft is working on running up its marketing machine to talk about how good Vista really is. (And yes, I was an early convert - I am one of those folks that really like Vista - it took some major thought-pattern changes, but it is really much easier to use.)&lt;/p&gt;
&lt;p&gt;As part of this, Microsoft has decided to offer free - yes free - installation and compatibility support for all users of Windows Vista SP1 through March 18, 2009. (Why that date? I have no idea.)&lt;/p&gt;
&lt;p&gt;Worldwide telephone support is available, and in the USA and Canada you can also get email and online chat-based support.&lt;/p&gt;
&lt;p&gt;For more information, or to take advantage of this offer, visit this website: &lt;a href="http://support.microsoft.com/common/international.aspx?rdpath=1&amp;amp;prid=11274&amp;amp;gprid=500921"&gt;http://support.microsoft.com/common/international.aspx?rdpath=1&amp;amp;prid=11274&amp;amp;gprid=500921&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Yes, I know this sounds like a marketing post - and it really isn&amp;#39;t - I&amp;#39;m just encouraging you to use Vista, if you aren&amp;#39;t already!)&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=346" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Vista" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Vista/default.aspx" /></entry><entry><title>Exchange 2003 SMTP Service - Without Exchange</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/28/exchange-2003-smtp-service-without-exchange.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/28/exchange-2003-smtp-service-without-exchange.aspx</id><published>2008-07-28T21:11:00Z</published><updated>2008-07-28T21:11:00Z</updated><content type="html">&lt;p&gt;Learn something new every day...&lt;/p&gt;
&lt;p&gt;I was working with a new client today, on an SBS 2003 computer, and they use external e-mail.&lt;/p&gt;
&lt;p&gt;However, the original technican that had done the installation of their server had gone through the process of installing Exchange Server, and then disabled all of the services that start with &amp;quot;Microsoft Exchange...&amp;quot; in the Services applet - but they hadn&amp;#39;t disabled the SMTP service. As you may know, when you install Exchange Server 2003, it overwrites the Windows SMTP service with its own version of the service that &amp;quot;speaks Exchange&amp;quot;.&lt;/p&gt;
&lt;p&gt;Whenever I go into a client, I always like to be able to use a local SMTP server to send daily status report to me, for monitoring, and just general e-mailing. Usually, in an SBS environment, I&amp;#39;ll use the Exchange SMTP service and if Exchange isn&amp;#39;t installed, I&amp;#39;ll simply install the Windows SMTP service. This allows me to get around all of the usual problems associated with secure relays, etc. etc.&lt;/p&gt;
&lt;p&gt;So, in this case, I was sure that the SMTP service wouldn&amp;#39;t work.&lt;/p&gt;
&lt;p&gt;I was wrong. The SMTP service works just fine for relaying. You can&amp;#39;t manage the SMTP service from the normal IIS Manager, you still have to go to the Exchange System Manager to make changes. But it works just fine. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Like I said, learn something new every day...&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=344" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /><category term="SBS" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/SBS/default.aspx" /></entry><entry><title>More on Update-GAC (speeding up PowerShell startup)</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/25/more-on-update-gac-speeding-up-powershell-startup.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/25/more-on-update-gac-speeding-up-powershell-startup.aspx</id><published>2008-07-25T19:00:00Z</published><updated>2008-07-25T19:00:00Z</updated><content type="html">&lt;p&gt;Jeffrey Snover of Microsoft, PowerShell dude extraordinaire, recently reminded us of a way to &lt;a class="" href="http://blogs.msdn.com/powershell/archive/2008/07/11/speeding-up-powershell-startup.aspx" target="_blank"&gt;Speed Up PowerShell Startup&lt;/a&gt; times, based on an article of over a year ago titled &lt;a class="" href="http://blogs.msdn.com/powershell/archive/2007/11/08/update-gac-ps1.aspx" target="_blank"&gt;Update-Gac.ps1&lt;/a&gt;. And yes, this does help to speed up the Exchange Management Shell and the OpsMgr Command Shell too.&lt;/p&gt;
&lt;p&gt;Taking that just a bit further, the assemblies you want to put into the GAC are slightly different when you are running AMD-64 (AMD) or EMT-64 (intel). Here is the script updated to deal with x64 and to suppress the ngen logo:&lt;/p&gt;&lt;font color="green"&gt;&lt;/font&gt;&lt;font color="green"&gt;
&lt;blockquote&gt;&lt;pre&gt;Set-Alias ngen @(
$ngen_path = Join-Path ${env:\windir} &amp;quot;Microsoft.NET\Framework&amp;quot;
$ptr_width = (gwmi -query &amp;quot;select addresswidth from win32_processor&amp;quot;).addresswidth
if ($ptr_width -eq 64) { $ngen_path += &amp;quot;64&amp;quot;; }
dir $ngen_path ngen.exe -recurse | where {$_.length -gt 0} | sort -descending lastwritetime 
)[0].fullName

[appdomain]::currentdomain.getassemblies() | %{ngen /nologo $_.location}
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/font&gt;
&lt;p&gt;You should execute this script&amp;nbsp;once on each computer where you have PowerShell installed (or each time you install new PowerShell related binaries, too!).&lt;/p&gt;
&lt;p&gt;You&amp;nbsp;will not need to do this in PowerShell v2, but that is still&amp;nbsp;not here yet.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=343" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /><category term="PowerShell" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/PowerShell/default.aspx" /><category term="OpsMgr" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/OpsMgr/default.aspx" /></entry><entry><title>Exchange Server 2003 Security Review</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/22/exchange-server-2003-security-review.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/22/exchange-server-2003-security-review.aspx</id><published>2008-07-22T20:34:00Z</published><updated>2008-07-22T20:34:00Z</updated><content type="html">&lt;p&gt;The question was recently posed on a mailing list asking whether there was any book that covered the Exchange 2003 security model in depth.&lt;/p&gt;
&lt;p&gt;The question came up for the poster because of a recent video that is making the rounds on youtube and elsewhere (&lt;a href="http://www.thewebsiteisdown.com/"&gt;http://www.thewebsiteisdown.com&lt;/a&gt;). In that video, an errant system administrator deletes a message from his bosses Sent Items folder, so that the boss cannot verify that the administrator was told something specific.&lt;/p&gt;
&lt;p&gt;Can that happen??? Well - yes. And it isn&amp;#39;t unique to Exchange Server. And yes, that administrator should be fired.&lt;/p&gt;
&lt;p&gt;A savvy Exchange administrator, who also has appropriate permissions in Active Directory, can assign herself permissions at any level of an Exchange organization - per mailbox, per mailbox store, per storage group,&amp;nbsp;per server, or for the entire Exchange organization. &lt;/p&gt;
&lt;p&gt;While the backend permission sets have expanded dramatically in Exchange Server 2007, the store and user permissions are still quite similar to Exchange Server 2003. There are three whitepapers at Microsoft that can help you learn about the various permissions and how they work within themselves and within Active Directory:&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=1&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3d3768246d-c9ed-45d8-bece-a666143cba4e%26DisplayLang%3den" target="_blank"&gt;Exchange Server 2003 Technical Reference Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=1&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3d0954b157-5add-48b8-9657-b95ac5bfe0a2%26DisplayLang%3den" target="_blank"&gt;Working with Active Directory Permissions in Microsoft Exchange Server 2003&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=2&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3d2ae266f0-16b7-40d7-94d9-c8be0e968a57%26DisplayLang%3den" target="_blank"&gt;Working with Store Permissions in Microsoft Exchange 2000&amp;nbsp;and 2003&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another resource is &lt;a class="" href="http://www.lissware.net/" target="_blank"&gt;Alain Lissoir&amp;#39;s web site&lt;/a&gt;. Alain wrote a couple of great white papers on scripting in Exchange 2000 and 2003 and they contain some excellent security related resources.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=339" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Active Directory" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Active+Directory/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Attribute Scoped Queries (ASQs) in PowerShell</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/21/attribute-scoped-queries-asqs-in-powershell.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/21/attribute-scoped-queries-asqs-in-powershell.aspx</id><published>2008-07-21T23:31:00Z</published><updated>2008-07-21T23:31:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;m in the process of tech-reviewing an important book (you&amp;#39;ll want it on your shelf once it is released), and one of the things I did today was spend a while figuring out how to do Attribute Scoped Queries in PowerShell. If you develop in C# or C++, or use adfind to do your searches, those tools have supported ASQs for a long time.&lt;/p&gt;
&lt;p&gt;I use PowerShell quite a bit for Exchange Server 2007+ maintenance tasks, but I am no expert when it comes to all of the various .NET Framework classes and methods available. In the past, when you&amp;#39;ve needed to search for all the members of a particular group (using the &amp;#39;member&amp;#39; attribute) or all of the members of a particular address list (using the &amp;#39;showInAddressBook&amp;#39; attribute), those particular searches could be very slow and quite inefficient.&lt;/p&gt;
&lt;p&gt;With the Windows Server 2003 Domain Functional Level, the ASQ capability becomes available. Using a DirectorySearcher object, you can specify a particular group or a particular address book or (anything else that leads to a multi-valued attribute) and execute an efficient search against the sources to find their components. In this example, you can easily find the members of the &amp;#39;Domain Admins&amp;#39; group in your domain (note, this is an easy one - there are others that are likely more significant for you).&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;
&lt;blockquote&gt;&lt;pre&gt;$group  = New-Object System.DirectoryServices.DirectoryEntry( `
    &amp;quot;LDAP://CN=Domain Admins,CN=Users,DC=essential,DC=local&amp;quot;)
$source = New-Object System.DirectoryServices.DirectorySearcher

$source.SearchRoot  = $group
$source.SearchScope = [System.DirectoryServices.SearchScope]::Base
$source.Filter      = &amp;quot;(objectClass=*)&amp;quot;

$source.PropertiesToLoad.Add(&amp;quot;member&amp;quot;)
$source.PropertiesToLoad.Add(&amp;quot;sAMAccountName&amp;quot;)

$source.AttributeScopeQuery = &amp;quot;member&amp;quot;

$results = $source.FindAll()

$results
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/font&gt;
&lt;p&gt;One caveat: when searching for members of a group, ASQ does not work for the primaryGroup! So if you do a search for &amp;quot;Domain Users&amp;quot;, it is likely that you will receive no responses in your result. This is NOT an error.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=338" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Script" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Script/default.aspx" /><category term="PowerShell" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/PowerShell/default.aspx" /></entry><entry><title>Event 1025, Source MSExchagneIS Mailbox Store, Error 1162</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/20/event-1025-source-msexchagneis-mailbox-store-error-1162.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/20/event-1025-source-msexchagneis-mailbox-store-error-1162.aspx</id><published>2008-07-20T16:58:00Z</published><updated>2008-07-20T16:58:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;ve brought up a number of new clients on Exchange 2007 recently, and a common issue is this event log warning:&lt;/p&gt;
&lt;p&gt;&lt;font color="green"&gt;
&lt;blockquote&gt;&lt;pre&gt;Event Type:      Warning
Event Source:    MSExchangeIS Mailbox Store
Event Category:  General 
Event ID:        1025
Date:            7/18/2008
Time:            10:26:40 AM
User:            N/A
Computer:        EXCHANGE
Description:
An error occurred on database &amp;quot;StorageGroup\Database&amp;quot;.
 Function name or description of problem: Restrict/SetSearchCriteria
Error: 1162 Warning: fail to apply search optimization to folder (FID 4-3DBEABE)   Retrying without optimization. 

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/font&gt;
&lt;p&gt;If you spend time on Internet search engines, you&amp;#39;ll find lots of bad advice about running an Isinteg to eliminate these, or running an offline defragmentation to get rid of these. At best, those are temporary solutions. I finally had seen so many of these, I asked Microsoft about them. Here is the answer from the horse&amp;#39;s mouth:&lt;/p&gt;
&lt;blockquote&gt;&lt;span style="COLOR:#1f497d;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;You have an application that is trying to perform a search using restrictions against a users search folders and this could be a time based query, etc.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR:#1f497d;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;We will do two types of searches (1 fast optimized search if the indexes are there, 1 slow find) which takes a long time and will chew up processor time for store if your user has a ton of items in their folders (more than 5,000 items per folder).&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR:#1f497d;"&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR:#1f497d;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;This is just telling you that we are performing an un-optimized search against that table in the store. They cannot be suppressed.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;In other words, ignore them. You may have users that have far too many items in their primary folders (Calendar, Tasks, Inbox, Sent Items, Deleted Items) and you can get rid of these messages if you get them to clean those up. But it may not be worth your time and energy.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=337" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>Outlook and Exchange on the same computer</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/07/06/outlook-and-exchange-on-the-same-computer.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/07/06/outlook-and-exchange-on-the-same-computer.aspx</id><published>2008-07-07T01:01:00Z</published><updated>2008-07-07T01:01:00Z</updated><content type="html">&lt;p&gt;In 2004, I wrote an article &lt;a class="" href="http://theessentialexchange.com/blogs/michael/archive/2007/11/13/why-can-t-i-have-outlook-and-exchange-on-the-same-computer.aspx" target="_blank"&gt;Why Can&amp;#39;t I Have Outlook and Exchange on the same Computer?&lt;/a&gt; It applied to versions of Exchange prior to Exchange Server 2007. When written, E12 (Exchange 2007) was still quite early in development at MSFT...&lt;/p&gt;
&lt;p&gt;Today, times and situations have changed.&lt;/p&gt;
&lt;p&gt;With Exchange Server 2007, in fact, the &lt;a class="" href="http://technet.microsoft.com/en-us/library/aa998579.aspx" target="_blank"&gt;export-mailbox&lt;/a&gt; command is only supported on 32-bit machines. This means that you must run export-mailbox on a 32-bit Vista or XP computer where the Exchange Management Tools have been installed, along with Outlook! Amazing.&lt;/p&gt;
&lt;p&gt;And, in fact, there are times where Outlook (or the CDO/MAPI binaries) will be required to be executed on an Exchange server to get certain tools to work, including OABinteg and MFCmapi.&lt;/p&gt;
&lt;p&gt;Prior to Exchange Server 2007, installing Outlook on an Exchange Server would replace certain DLLs that Exchange required with stub libraries that Outlook used instead. This could break Exchange severely.&lt;/p&gt;
&lt;p&gt;Those problem DLLs are gone in Exchange Server 2007. This gives us clear sailing for Outlook and Exchange on the same computer - both servers and workstations.&lt;/p&gt;
&lt;p&gt;Thanks to Dave Goldman and Ben Winzenz, both of Microsoft,&amp;nbsp;for answering my questions on this topic.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=325" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Outlook" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Outlook/default.aspx" /><category term="Exchange" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Exchange/default.aspx" /></entry><entry><title>ExtraOutlook gives you well, an extra Outlook</title><link rel="alternate" type="text/html" href="http://theessentialexchange.com/blogs/michael/archive/2008/06/24/extraoutlook-gives-you-well-an-extra-outlook.aspx" /><id>http://theessentialexchange.com/blogs/michael/archive/2008/06/24/extraoutlook-gives-you-well-an-extra-outlook.aspx</id><published>2008-06-24T12:44:00Z</published><updated>2008-06-24T12:44:00Z</updated><content type="html">&lt;p&gt;Almost everyone has, at one time or another, wished that you could have multiple copies of Outlook running at the same time. After all, opening another mailbox within Outlook doesn&amp;#39;t give you windows toast and calendar pops, etc.&lt;/p&gt;
&lt;p&gt;The standard answer has always been &amp;quot;run Outlook for your primary mailbox and use OWA for all the other mailboxes&amp;quot;, which works; but well, OWA just isn&amp;#39;t Outlook.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s still the official answer.&lt;/p&gt;
&lt;p&gt;However, early this year a hacker known as &amp;quot;H.O.G.&amp;quot; (for HammerOfGod) released a tool known as &lt;a class="" href="http://www.hammerofgod.com/download.html" target="_blank"&gt;ExtraOutlook!&lt;/a&gt; This tool actually modifies the Outlook executable and causes Outlook to NOT check to see if another Outlook is running.&lt;/p&gt;
&lt;p&gt;If you are &amp;quot;plug-in free&amp;quot;, this is a great tool and it works really well. &lt;/p&gt;
&lt;p&gt;However, it confuses quite a number of plugins (such as Xonbi) that attempt to open a &amp;quot;default MAPI profile&amp;quot; and find two (or more) running instead of just one.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m sure that modifying the Outlook executable puts you straight in the &amp;quot;not supported&amp;quot; arena as well. But if you need the tool - you probably don&amp;#39;t care.&amp;nbsp; :-)&lt;/p&gt;
&lt;p&gt;Give it a go. No promises, but it has worked for me.&lt;/p&gt;
&lt;p&gt;Until next time...&lt;/p&gt;
&lt;p&gt;As always, if there are items you would like me to talk about, please drop me a line and let me know!&lt;/p&gt;&lt;img src="http://theessentialexchange.com/aggbug.aspx?PostID=318" width="1" height="1"&gt;</content><author><name>michael</name><uri>http://theessentialexchange.com/members/michael.aspx</uri></author><category term="Outlook" scheme="http://theessentialexchange.com/blogs/michael/archive/tags/Outlook/default.aspx" /></entry></feed>