0
votes

Is there any way to tell whether a user's Outlook client mailbox is residing in an Exchange 2010 mailbox or an Exchange 2013 mailbox with the following requirements:

  • I need to be able to tell from the client side only, by either a registry key or a file on the local machine indicating to me that it is an Exchange 2010 or 2013 client.
  • No use of PowerShell. I want to be able to find the difference and use a batch script to note to management which users are in an Exchange 2010 mailbox and which users are in an Exchange 2013 mailbox.

The reason I ask is because the company is in the midst of a migration of mailboxes from Exchange 2010 to Exchange 2013. I only have access to the local machines. I want to script out a report using batch. Finding a registry key or a specific file created by an Exchange 2010/2013 client would seem to be my most feasible option.

1

1 Answers

1
votes

The version data for the Exchange server stores is indeed stored in the profile data section for each store in the profile in a binary value named "0102663b" in

HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles\<profile name>\4cd3558f0de14d49a9023eb7f6002752

There "15.0" is the Outlook version, "<profile name>" is the name of the profile, "4cd3558f0de14d49a9023eb7f6002752" is the profile section guid (it is dynamically generated and will differ on different machines and profiles) and "0102663b" corresponds to the MAPI property with the tag of 0x663B0102.

As for parsing the value (e.g. 0f 00 00 00 6a 04 a5 0f), it is an 8 byte int with each part of the version encoded as a 2 byte int. In your case it is (0x0F, 0x0, 0x046A, 0x0FA5) = (15, 0, 1130, 4005).

Microsoft does not recommend directly accessing the profile data as the location changes based on the Outlook version.

If using Redemption is an option, it exposes the ServerVersion property on the RDOExchangeMailboxStore object. The following script will print the versions of all Exchange mailboxes in the current profile (Application object is assumed to point to an instance of the Outlook.Application object):

  skPrimaryExchangeMailbox = 3
  skDelegateExchangeMailbox = 4
  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  for each Store in Session.Stores
    If (Store.StoreKind = skPrimaryExchangeMailbox) or (Store.StoreKind = skDelegateExchangeMailbox) Then
      Debug.Print Store.ServerVersion & " - " & Store.Name
    End If
  next