Monday, September 28, 2009

Sizing Recommendations for Exchange 2010

There are some changes in architecture in Exchange 2010. All clients, even Outlook, connect via the Client Access Servers (CAS). There are some changes in recommendations around the ratio of resource for CAS/Hub and the mailbox servers.

Microsoft provides detailed guidelines on this Technet page and this one.

The basic guidelines for server role ratios are as follows. They're based on the number of mailbox server cores.
  • Hub Transport Server — 7:1 (no antivirus on Hub) or 5:1 (antivirus on hub). 1GB of memory for each core.
  • Client Access Server (CAS) — 4:3 (note this is much higher than with previous Exchange installations). 2GB of memory for each core.
  • Domain Controller — 1:4 (32-bit Domain Controller (DC)) or 1:8 (64-bit DC, and the DC has enough memory to cache the entire NTDS.DIT file).
  • Edge Transport Server — Based on peak connections and messages per second and average message size. 1GB of memory for each core.
Each mailbox server should have 4GB of memory plus 2-10MB per mailbox, based on if the mailbox is in light, average, or heavy use.

Thanks to John Savill for the info.

Thursday, September 10, 2009

Worst. AT&T Experience. Ever.

The EXPTA {blog} is back online!  Sorry about the prolonged outage, folks.

This blog is hosted on my own server, which is connected to the Internet using a DSL line from AT&T.  I choose to do this instead of hosting it on blogspot because it gives me a lot more flexibility.

I finally decided to cancel my local phone service, since we only use our cell phones anyway, and why pay $25 a month to let cold-callers interrupt our dinner.  Trouble is, a provisioned DSL line is normally tied to the landline phone number.  To get DSL on its own, it needs to be converted to what AT&T calls a "dry loop".  This can be done very quickly at the central office (CO), and then the phone line can be disconnected.  When done correctly, the outage is very brief and the DSL customer (me) retains his user accounts, email addresses, and settings.  But, when it's done wrong....

Problem #1: Human nature. When making a change request such as this (disconnect local phone service), the AT&T rep taking the call is a salesperson.  Salespeople don't make money disconnecting service.  Salesperson: "How can I make a buck off this? Ahh, I'll cancel BOTH the local phone service and DSL, and then put in a NEW order for DSL.  Cha-ching!"  Oh, and don't bother telling the customer (me) that you're going to do this.

Problem #2: Phone mail hell. The work will be performed sometime between 8am-8pm.  My DSL was turned off promptly at 8am (of course), but my phone still worked.  Several calls throughout the day resulted in transfers to at least three different departments. Apparently none of them work for the same company. "Be patient, sir, your order will be completed by 8pm."

Problem #3: We're closed. At 8pm sharp, my phone service stops, but I still don't have DSL.  I called the "broadband customer care" department and find that all the techs have gone home for the day.  A supervisor says he'll put me "first on the list tomorrow morning at 8am and we'll call your cell".  Guess what?

Problem #4: Wires crossed. Many phone calls (all by me) and a service tech visit to the house (how could it possibly be a problem with my house wiring when it was working before they started screwing around?) results in a trip to the central office.  "Oops, we connected the wrong wires."

So, 34 hours later I finally have my DSL service back, albeit with a new account and no access to my old email accounts.  Next stop, a call to the Customer Retention department for a bill credit.  Grrrrr!

Friday, September 4, 2009

Getting Information About User's Exchange Mailbox Using VBScript and PowerShell


Here are two short scripts, one in VBScript and the other in PowerShell that search Active Directory and display a user's Exchange server, storage group, and mailbox store.  They work on against any version of Exchange 20xx.

First, the VBScript:
'Mailbox.vbs, v1.00

'This script will display a user's current mailbox server and storage group

Set theArgs = WScript.Arguments
If theArgs.Count > 0 Then strSearch = theArgs.Item(0)
If strSearch = "" Then
    strSearch = InputBox("Please enter the user ID to look up.", "Mailbox Search")
    If strSearch = "" Then WScript.Quit
End If

Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
con.Open "DS Query"
Set command = CreateObject("ADODB.Command")
Set command.ActiveConnection = con
Command.Properties("searchscope") = 2

command.CommandText = "SELECT AdsPath,homeMDB,name FROM 'LDAP://DC=domain,DC=com' WHERE sAMAccountName = '" & strSearch & "' AND objectclass='User'"

Set rs = Command.Execute

If NOT rs.EOF Then
    mailbox = rs.Fields(1).Value
    mailbox = Left(mailbox, Instr(mailbox, "CN=InformationStore") - 2)
    msg = "User: " & rs.Fields(0) & vbCRLF & "Mailbox: " & mailbox
    MsgBox msg, vbInformation, "Mailbox Search"
Else
    MsgBox "User '" & strSearch & "' not found!", vbCritical, "Mailbox Search"
End If

And here's the same script in PowerShell:
$sam = Read-Host "Enter the user logon name"

$searcher=New-Object DirectoryServices.DirectorySearcher
$searcher.Filter="(&(objectcategory=person)(objectclass=user)(samaccountname="+$sam+"))"
$result=$searcher.FindOne()
if ($result -eq $null)
{
    Write-Host "Logon name not found"
}
else
{
    $a = [string] $result.properties.homemdb
    $b = $a.split(",")
    Write-Host "Exchange Mailbox Server: " $b[3]
    Write-Host "Storage Group: " $b[1]
    Write-Host "Mailbox Database: " $b[0]
}
Write-Host

Both scripts will take an argument (the user's logon name), and will prompt for it if it was not supplied in the command line.