Detecting An Exchange Management Shell Connection

You don’t log onto an Exchange server via RDP and open the Exchange Management Shell application when you want to do Exchange-PowerShell things, do you? You follow the steps in my Opening A Remote Exchange Management Shell post, right?

But how do you detect if if you have an open remote connection or not? Well there’s a bunch of different ways so here’s an easy one. First, though, we need to understand a couple things about what happens when you open a remote Exchange Management Shell connection.

Here’s what the output of my Get-Module cmdlet looks like before I do anything Exchange-y.

[caption id=”attachment_243” align=”alignnone” width=”1217”]Get-Module before anything Exchange related Get-Module before anything Exchange related (click for larger)[/caption]

I’m in ISE, I have the AD cmdlets added. Nothing going on here is too crazy. Now here’s what it looks like after I open a remote Exchange Management Shell connection like I told you how to do in the post linked above.

[caption id=”attachment_244” align=”alignnone” width=”1167”]Get-Module after adding Exchange Management Shell Get-Module after adding Exchange Management Shell (click for larger)[/caption]

Notice that the Exchange stuff gets added under a tmp name? And that it’s different every time? That doesn’t exactly make it easy to detect. With the ActiveDirectory cmdlets you can just run Get-Module -name ActiveDirectory and it will either return something or not. Easy. How are you supposed to do that in a predictable, repeatable fashion for Exchange, especially since any other remote shells created to other services in the same manner may also be added with a tmp_ prefix?

In order to figure out how we can determine if we have a module added that belongs to a remote Exchange Management Shell, let’s take a closer look at the tmp module that just got added.

[caption id=”attachment_245” align=”alignnone” width=”1158”]Details of the last module added Details of the last module added (click for larger)[/caption]

At first glance, we’re obviously not going to be able to use the Name or Path attributes to identify remote Exchange Management Shell connections. ModuleType, Version, most of the others all look useless for us here. What looks useful, though, is the Description attribute which reads “Implicit remoting for http://my-exchange-server.fqdn/powershell”. That, we can work with. Here’s my code to tell me if I have a module added whose description is for a remote session to my Exchange server.

get-module | select Description | ? { $_ -match "my-exchange-server" }

The code will either return the description of the module if it’s added, or null. You can work with it like this.

$ExchAdded = get-module | select Description | ? { $_ -match "my-exchange-server" }
if ($ExchAdded) { write-host "Yes, added" } else { write-host "No, not added" }

Check it out.

[caption id=”attachment_246” align=”alignnone” width=”760”]Code at work Code at work (click for larger)[/caption]

Written on August 19, 2015