The vlookup function in excel is one of the most powerful tools to a voice engineer, which at times can seem more like being a database administrator. The logic here is simple: find the user id from the table on the left in the user id column on the table in the right. When you find it, return the value in the row x number of rows away.

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])

lookup_value = userid

table_array = the entire table on the right. the leftmost column must contain the lookup value

col_index_num = how many rows to the right to grab the value to return

range_lookup = false always!


So I took the CCIE lab and failed my first attempt. I realize now it’s more about efficiency and speed than skill. 8 hours goes by in what seems like an hour. So I decided what I needed to do was practice the lab by repetition. After creating a mock lab, I made snapshots in vmware, then created a Power CLI script and bat file to revert to the snapshot and power back on. In one click I can just start all over and do it again!


Connect-VIServer -Server vcenter -User root -Password blahblah

$VMs = Get-Content ‘C:\vmlist.txt’
Get-Snapshot -VM $VMs -Name ccie | Foreach-Object { Set-VM -VM $_.VM -Snapshot $_ -Confirm: $false }
Start-VM -VM $VMs




C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -PSConsoleFile “C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1” -NoExit -Command “& ‘C:\revert.ps1′”


EDI (Enhanced Directory Integration) can use the logged on user domain credentials to search LDAP directory, or a saved set of credentials in either the Service Profile or jabber-config.xml via the <ConnectionUsername> and <ConnectionPassword> tags. It’s only supported with Jabber for Windows since it uses the built-in Windows API.

BDI (Basic Directory Integration) uses stored credentials in either the Service Profile or jabber-config.xml via the <BDIConnectionUsername> and <BDIConnectionPassword> tags to search LDAP directory. Storing credentials in the service profile is highly recommended, since the jabber-config.xml is plaintext.

When both service profile and jabber-config.xml define a parameter, the service profile will take priority.

UDS (User Directory Service) uses CUCM to provide directory lookup services. UDS is the only supported method when MRA is used, however because CUCM is now providing directory lookups and not LDAP, the load must be considered: a node can support UDS contact service connections for up to 50% of the maximum device registrations supported by the server.


Multiple Unity Connection Clusters may be networked together to provide cross-server features such as sign-in, transfer and live reply. An example would be a dial by name in a company directory being able to search multiple clusters and route the call appropriately.

First thing you’ll need is to define a route pattern in CUCM that will point to each Unity cluster. The CSS of each Unity Connection cluster should have access to this route pattern. In the following example I will use: ##991 to Site A and ##992 to Site B.

Next, add a HTTP(S) link under Networking, Branch Management. This adds the site under Networking, Locations. Notice you’ll only need to do this on one cluster- it will automatically add it to the neighbor cluster.

Now you’ll add the route pattern you created in step one to each cluster’s respective locations and check both “Allow Cross-Server..” options. This is the target dial string, so the route pattern going to site B will go on site A’s cluster.

Under Advanced, Conversations you’ll need to check “Respond to Cross-Server Handoff Requests”

OK at this point you can check under Users and you should see users from both clusters to tell you HTTP(s) networking is working, but before we can make the features work, take the steps below to create some partitioning:

  1. Create a “hidden” and an “intersite” partition on both clusters.
  2. Create a site-specific “reply-all” search space including each sites default partition (it’s own first, then its neighbors) and the intersite partition.
  3. Create a shared “master distribution list” search space, including all partitions, starting with site specific partitions, then the intersite partition, then the hidden.
  4. Rename the system distribution list on each cluster and change it to use the hidden partition.
  5. Create a new “master distribution list” to use the master distribution list partition.
  6. Change the system directory handler to use the new master distribution list search space

Now we just need to configure the clusters to respond to cross cluster requests. This uses a series of dtmf codes to hand the call off between servers. You’ll need to run the following via CLI to enable this:

run cuc dbquery unitydirdb execute procedure csp_ConfigurationCreate
(pName=’HandoffForwardRemoteForward’::lvarchar, pParentFullName=’System.Conversations.CrossBox’::lvarchar, pType=11, pValueBool=1, pRequiresRestart=1)

run cuc dbquery unitydirdb execute procedure csp_ConfigurationModify (pName=’HandoffForwardRemoteForward’::lvarchar, pParentFullName=’System.Conversations.CrossBox’::lvarchar, pValueBool=1)

Almost done – the only thing left is a call handler to answer the call.

  1. Copy the opening greeting to create a “CrossCluster_CallHandler.
    1. Under caller input, uncheck “ignore further input” under #.
  2. Create a Direct Routing Rule.
    1. Condition “Dialed Number Equals ##992” (this is what it answers to)
    2. “Send Call to” should go to the “CrossCluster_CallHandler”

See the official documentation here

Conference Now is a new feature in CUCM 11.0 for ad-hoc authenticated meet-me within CUCM without the need for any other application such as WebEx or UCCX.

Both internal and external callers can use Conference Now. The host needs the meeting number (their primary DN) and pin, while the participants only need the meeting number (access code is optional) and will hear MOH until host has joined.

First thing- you’ll notice a new link in 11.0. Media Resources > Interactive Voice Response, this was created automatically when I upgraded from 10.5. You’ll need to ensure these resources are made available to all parties.

Next, User Management > End User, enable the feature for each host, and add an optional attendee access code.

Last, Call Routing > Conference Now, setup the conference now number and partition. Interesting enough the documentation says that Video on Hold is not supported, but I was able to get this to work simply by leaving MOH Source to <none>.

Read the Official Feature Configuration Guide for CUCM 11.0

As a person who enjoys weekends and sleep, my favorite friday night cutover is one that lasts approximately 30 seconds. To do this, you need three things:

-Enough resources to temporarily have two of everything
-A portgroup configured with an isolated VLAN
-A staging PC for use as an NTP server (I recommend Meinberg NTP for that)

After building and testing your new environment, you’ll want to “flip the nics” to make the new system live:

Connect-viserver -User admin -Password pass

Get-Cluster “Old-UC-Cluster” | Get-VM | Get-NetworkAdapter | set-networkadapter -Connected:$false -Confirm:$false

Get-Cluster “New-UC-Cluster” | Get-VM | Get-NetworkAdapter | Set-NetworkAdapter -Portgroup “VLAN 9” -Confirm:$false

This is in a sunny day scenario where everything in the whole cluster is disconnected while everything in another is connected. Sometimes you need to apply some logic to exclude some vms that happen to coexist within the same cluster:

Get-Cluster “New-UC-Cluster” | Get-VM | Get-NetworkAdapter | Where {$_.NetworkName -eq “VLAN 3” -and $_.Name -notlike “CUCMSUB2”} | Set-NetworkAdapter -Portgroup “VLAN 9” -Confirm:$false

UC applications aren’t only supported by Cisco on a virtual platform now, it’s the ONLY supported platform. As a “Collaboration Engineer” by title, I am usually focused on only a handful of applications, traditionally relying on the “Datacenter Guy” to provide the infrastructure and hope it works. But, it’s always good to see the whole picture.

In my opinion, virtualization is something everyone needs to know at least the basics of. You might not be the one adding a vlan to a switch anymore, but you still need to know networking.

Each VM contains two basic files: one .vmx (configuration) and one .vmdk (disc)
The .vmdk (disc) is considerably larger and contains all the bits a physical hard drive would. The .vmx (configuration) is a small, editable file containing all of the settings a physical bios chip would.

A few items you’ll find in a .vmx file:
numvcpus = “2”
memsize = “6144”
scsi0:0.fileName = “UCCX1.vmdk”
ethernet0.networkName = “Voice_VLAN”
guestOS = “rhel4”
sched.cpu.min = “1300”
sched.cpu.units = “mhz”
sched.cpu.shares = “normal”
sched.mem.minsize = “6144”
sched.mem.shares = “normal”
One task any Cisco UC Engineer will go through at least once is an upgrade from pre 8.6 to post 8.6 version. Two changes come about: an OS change from Redhat 4/5 to 6, and adapter change from flexible to vmxnet3.

One method is to edit the .vmx by finding it on the datastore, downloading the file, making the edits below, and import it back:
guestOS = “rhel6_64guest”
ethernet0.virtualDev = “vmxnet3”
An easier method if you are doing multiple servers/clusters at once is to use PowerCLI
Connect-VIServer -Server vcenter01 -User admin -Password pass
Set-ExecutionPolicy RemoteSigned
Set-VM -VM ‘UCCX Pub’ -GuestId “rhel6_64guest” -Confirm:$false
Get-VM ‘UCCX Pub’ | get-networkadapter | set-networkadapter -type vmxnet3

So for a g711 call with default payload carried over ethernet:

Total Packet Size: 40 + 18 + 160 = 218 bytes = 1744 bits

PPS = 64,000 (bitrate) / 1280 (payload size) = 50

Bandwidth = 1744 * 50 = 87,200 (or 87.2 kbps)

You could also use the Voice Bandwidth Calculator from TAC: