Thursday, September 29, 2011

Exchange 2007 and 2010 Public Folder Oddities

Was working with migrating an Exchange 2007 environment up to Exchange 2010, and ran into some strange issues with Public Folders (don't they always have the fun problems?).  For this migration I was going to add a replica to the 2010 server and then once the mailboxes were migrated remove the replica from the old server.  Seems simple enough, right?

If you go to the Public Folder Management Console on the 2007 server, you can easily go to the properties of a folder and add the replica right there.  That seems pretty easy, and for a small environment it certainly is.  However when you need to migrate hundreds of folders, that's not practical.  You might think "well i can just pipe a few powershell commands together and get it added" and you are right.

However, there is a handy script that is bundled with Exchange 2007/2010 in the Scripts directory (in the Program Files directory for Exchange) called AddReplicaToPFRecursive.ps1.  This is supposed to go through every public folder and add the new server to the list of replicas so it will replicate.

Here is what they expect you to run on the 2007 server (for all examples, EX2010 and EX2007 refer to your Exchange 2010 and 2007 servers respectively):

> .\AddReplicaToPFRecursive.ps1 -TopPublicFolder "\" -ServerToAdd EX2010

This command will run and probably not give any errors.  However, if you do a quick check you will see that nothing has happened:

> Get-PublicFolder "\Test1" | Select-Object Replicas

Replicas
--------
{EX2007\Second Storage Group\Public Folder Database}

Well clearly that isn't right, where is the 2010 server?  The issue is that it will not error out or give you any indication that you should have actually been running this on the 2010 server, not the 2007 server.  So at this point you need to switch to the 2010 server and run:

> .\AddReplicaToPFRecursive.ps1 -TopPublicFolder "\" -ServerToAdd EX2010 -Server EX2007

Note that there is an extra parameter in here now (which is suspiciously missing from most of Microsoft's examples, as they expect you to run this on the 2007 server).  After running this command if you want instant satisfaction you may want to run Update-PublicFolderHierarchy -Server EX2007, or wait for the replication interval.

Now if you go and look, the folders should start appearing and being replicating items.  You can tell with the original test command:

> Get-PublicFolder "\Test1" | Select-Object Replicas

Replicas
--------
{Public Folder Database 2,EX2007\Second Storage Group\Public Folder Database}

You can also check the current progress for replication with something like this (run on both servers to compare):

> Get-PublicFolderStatistics | Measure-Object -Property ItemCount -Sum

This will show the total items that have been replicated so far (look at the Sum).

Thursday, September 15, 2011

Nortel BCM and T1s from an Adtran TA 908e

I recently had a customer with a "dynamic T1" where the voice is being carried over VoIP and handed off using an ADTRAN Total Access 908e via T1.  The customer's PBX was a Nortel BCM-200 with an older software version.

The issue that was run into is that the BCM does not support In-band ANI (Caller ID).  In-band is where the Caller ID is sent during the rings, so nothing special is required.  If this is not supported, then you have to do some extra work to get it going.  The easiest solution to this is to just switch to a PRI, so then everything is done on the D channel and there are no issues.  The problem here was that the software version of the BCM did not support the feature to add a synthetic dial tone when making a call, which the customer was not able to live without.

With this specific customer, they previously had a Voice T1 directly from the phone company.  This was configured the "old way" so when a new call came in it would send *ANI*DNIS* to the PBX.  For those unfamiliar with this, I'll explain.  Basically on a T1 trunk, the phone company will send digits to the PBX indicating what number was called.  These are usually used for DIDs (Direct Inward Dialing).  In this case, the customer was receiving 4 digits (the last 4 digits of the number).  So if I'm calling from (800) 444-4444 to (888) 555-1212, the PBX will receive *8004444444*1212*.  It knows based on the asterisks which numbers are which, and routes accordingly.

The original Adtran config looked like this (I added comments with ! to explain commands):

voice trunk T02 type t1-rbs supervision wink role network
  !any calls received on this trunk should use this caller id
  caller-id-override number-inbound 8885551212

  !send 4 digits of the called number to the PBX
  did digits-transferred 4

  !provide dialtone whenever a line is seized on this trunk
  dialtone

  !connect this trunk to a T1 interface
  connect t1 0/3 tdm-group 3

Likewise, this is the original PBX config:



The issue with this configuration is that outbound calls work fine, however inbound calls receive a fast busy.  The reason is because the ANI Number option is set to Y in the BCM configuration, but the Adtran is not sending *ANI*DNIS*, it's only sending DNIS.  But don't worry, there is a solution!

The following Adtran config works to send *ANI*DNIS* for incoming calls, but not expect it for outgoing calls, which is the desired configuration.

voice trunk T02 type t1-rbs supervision fgd role network
  caller-id-override number-inbound 8885551212
  dialtone

  !same as the did line before, just a different syntax
  dnis-digits 4 prefix ""

  connect t1 0/3 tdm-group 3

Two additional notes here:
  1. There is also a command under this context fgd inbound-address which causes this trunk to expect *ANI*DNIS* on outgoing calls.
  2. If you already have your trunk configured for wink supervision (type t1-rbs supervision wink), you will have to remove the trunk (no voice trunk T02), then add it in again, and then add it back to the voice grouped-trunk that it should belong to.