Upcoming book publication | Exchange 2013 SP1 – PowerShell v5

I wanted to let you all know that a second book will soon be released, about Exchange 2013 SP1 and PowerShell v5. At a current stage using PS v5 with 2013 SP1 isn’t supported.
However, there are some new great things around it and those will be brought up in the book.

I have received tons of great feedback from Hakim Taoussi, Mark Andrews and Steve Goodman.
In summary, it was a great collaboration between the Packt Publishing people and me as author and the reviewers. Really great contributions everyone!

The books is now in the final stage and will be released during the summer. It can already now be pre-ordered at: https://www.packtpub.com/networking-and-servers/microsoft-exchange-server-powershell-cookbook-third-edition.

 

Exchange 2016 Preview | vNext

Yesterday, Swedish time Exchange 2016 preview was announced being able for public download.

Since I do work for Microsoft, I don’t want to write about any release time frame, the Product Group (PG) has said later this year.

If you want to read more about the preview from the PG, see the link: http://blogs.technet.com/b/exchange/archive/2015/07/22/announcing-exchange-server-2016-preview.aspx

A direct link to the download of the preview: http://www.microsoft.com/en-us/download/details.aspx?id=48210

 

From now on I will try to be more active on the blog again, publishing interesting articles and news.
Cheers

Summary of year 2014

Summary:

Fantastic, beautiful, hectic, fun, stressed… well.. this year (2014) got it all! In most ways it has been great 🙂
In the professional way I took the opportunity to join Microsoft AB/MCS (Microsoft Consulting Services) and together with that me and my wife (yes we got married this year too) moved from Malmö to Stockholm in late February 2014.

We had some struggle to find an rental apartment but sorted it out, then sold my old apartment and bought a new one in Stockholm. In the meantime we planned our wedding and had our wedding in May together with family and friends. On the spare time in there between somewhere, I also trained for a 30km running competition in the forests in Stockholm called Lidingöloppet.
In the autumn I think we spent most of our spare time and weekends with renovating the new apartment and finally we are pretty much done, just some minor things to complete now.

wedding

 

 

 

 

 

 

 

 

At MCS, I’ve been spending a lot of time working with Office 365, with most of its workloads and done deep dive’s into DirSync and Azure AD Sync, AD FS for Office 365 but also working with Exchange on-premise and advanced PowerShell creating identities in Office 365/Azure AD and also been involved in automation an creation of an whole test environment of virtual servers, including applications and settings in Azure using PowerShell Desired State Configuration (DSC).

 

Goals for 2015:

Health – It’s time to start serious training at the gym again and take care of the health a bit better than 2014. This is no #1 priority for me 🙂

Exchange 2013 PowerShell book update – upcoming 3rd edition of the success story (Microsoft Exchange Server 2013 PowerShell Cookbook: Second Edition) is planned to be released in June/July 2015. Now based on PowerShell v4/v5 and also includes Desired State Configuration (DSC). For more news about this use the link above and follow me on twitter.

Career – The plan is to dig into details about SharePoint, Azure, Lync, FIM/MIM.. many things to learn!

Together with a colleague planning to release a cross-platform “App” to Windows Phone, iPhone and Android. Keep you’re eyes open here for more news about that!

Address Book Policy using Exchange Online (Office 365)

The question were raised a couple of times and I couldn’t find any related articles besides the official TechNet articles, so I decided to write one myself.

Some organizations have the need of separating people from seeing each other in the global address list (GAL), this is known as GAL segmentation and have been on the surface for a long time.

However, when it comes to do a segmentation in Office 365 and Exchange Online, it can be challenging and difficult, so I decided to write this article and provide an example of how this can be done.

 

Scenario – segmentation between school (students & teachers) and others (teachers, admin personnel and managers).

In detail the teachers and the students should be able finding each other in the address lists, while the administrators shouldn’t be able finding the students in their lists. However, administrators and teachers should be able to reach out through the address lists.

 

ABP

 

RBAC

By default the global administrator DON’T have access to manage the address lists, so either add the Address List Management permissions into the Organization Management role group or create a new role group with the role Address List Management and add the appropriate user into the group.

 

Attributes

One way of making sure the segmentation is working they way it is expected is to make it possible grouping the users using the extensionAttribute/CustomAttribute values in AD/Exchange.
These should be configured in the on-premise Active Directory (AD).

In this example all students and teachers has a value of “EDU” in their extensionAttribute15/CustomAttribute15, while the others have a value of “ADM” in their extensionAttribute14/CustomAttribute14 so they can easily be filtered.

With the attribute values in place, we need to configure address lists, global address list, offline address book, address book policy and finally apply it to the mailboxes.

This is done using PowerShell for Exchange Online running the following cmdlets..

 

Configuration for students and teachers


New-AddressList -Name "AL-EDU-Users-DGs" -RecipientFilter {((RecipientTypeDetails -eq 'UserMailbox') -or (RecipientTypeDetails -eq "MailUniversalDistributionGroup") -or (RecipientTypeDetails -eq "DynamicDistributionGroup")) -and (CustomAttribute15 -eq "EDU")}

New-AddressList -Name "AL-EDU-Rooms" -RecipientFilter {((Alias -ne $null) -and ((RecipientDisplayType -eq 'ConferenceRoomMailbox') -or (RecipientDisplayType -eq 'SyncedConferenceRoomMailbox'))) -and (CustomAttribute15 -eq "EDU")}

New-GlobalAddressList -Name "GAL-EDU" -RecipientFilter {(CustomAttribute15 -eq "EDU")}

New-OfflineAddressBook -Name "OAB-EDU" -AddressLists "GAL-EDU"

New-AddressBookPolicy -Name "ABP-EDU" -AddressLists "AL-EDU-Users-DGs","AL-EDU-Rooms" -OfflineAddressBook "\OAB-EDU" -GlobalAddressList "\GAL-EDU" -RoomList "\AL-EDU-Rooms"

Get-Mailbox | Where {$_.CustomAttribute15 -eq "EDU"} | Set-Mailbox -AddressBookPolicy "ABP-EDU"

 

Configuration for administrator personnel, managers and teachers


New-AddressList -Name "AL-ADM-Users-DGs" -RecipientFilter {((RecipientTypeDetails -eq 'UserMailbox') -or (RecipientType -eq "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and (CustomAttribute14 -eq "ADM")}

New-AddressList -Name "AL-ADM-Rooms" -RecipientFilter  {((Alias -ne $null) -and ((RecipientDisplayType -eq 'ConferenceRoomMailbox') -or (RecipientDisplayType -eq 'SyncedConferenceRoomMailbox'))) -and (CustomAttribute14 -eq "ADM")}

New-GlobalAddressList -Name "GAL-ADM" -RecipientFilter {(CustomAttribute14 -eq "ADM")}

New-OfflineAddressBook -Name "OAB-ADM" -AddressLists "GAL-ADM"

New-AddressBookPolicy -Name "ABP-ADM" -AddressLists "AL-ADM-Users-DGs","AL-ADM-Rooms" -OfflineAddressBook "\OAB-ADM" -GlobalAddressList "\GAL-ADM" -RoomList "\AL-ADM-Rooms"

Get-Mailbox | Where {$_.CustomAttribute14 -eq "ADM"}  | Set-Mailbox -AddressBookPolicy "ABP-ADM"

 

Configuration for teachers (“Everyone”)

The configuration for the teachers is a bit different since they should be able to see all users, in my example I do configure the policy to include all address lists, this can be configured so it matches your requirements.


New-AddressBookPolicy -Name "ABP-Teachers" -AddressLists "AL-ADM-Users-DGs","AL-ADM-Rooms","AL-EDU-Users-DGs","AL-EDU-Rooms","All Groups","All Contacts","All Distribution Lists","All Rooms","All Users" -OfflineAddressBook "\Default Offline Address Book" -GlobalAddressList "\Default Global Address List" -RoomList "\All Rooms"

Get-Mailbox | Where {$_.CustomAttribute1 -eq “teachers”} | Set-Mailbox -AddressBookPolicy "ABP-Teachers"

 

Ps. In the example for applying the policy to teachers, I’ve filtered the users using extensionAttribute1/CustomAttribute1 with the value of “teachers”.

 

The final result is shown below..

Students – able to find students and teachers in GAL

2014-09-30 13-51-27

Admins – able to find admins, managers and teachers in GAL

2014-09-30 13-53-06

Managers – able to find admins, managers and teachers in GAL

2014-09-30 13-54-05

Teachers – able to find everyone in GAL

2014-09-30 14-00-11

 

I hope this gave a more clear picture of the configuration to you, feel free to comment or give any feedback!

 

More information:

http://technet.microsoft.com/en-us/library/jj657455(v=exchg.150).aspx

Populate extensionAttribute with value using PowerShell

Implementing ADFS using the new feature within KB2919355 for Windows Server 2012 R2 called Alternative Login ID? (http://technet.microsoft.com/en-us/library/dn659436.aspx)

The configuration for Alternative Login ID is fairly simple, the extensionAttributes/CustomAttributes can be used and I want to share a script with you for populating values into the attributes.

Use the script as much as you want, make sure to test it before implementing into production.
All contents is provided “AS IS” with no warranties, and confers no rights. You assume all risk for your use.

 

# +=======================================================================
# | Blog: http://www.testlabs.se/blog
# | Twitter: @jonand82
# | =============================================
# | Filename: populate_extensionattribute15_v1.0.ps1
# |
# | CREATED BY: Jonas Andersson
# | FUNCTION: Populates users extensionAttribute15 with SamAccountName plus a value
# |
# | CHANGE LOG:
# | v1.0 - 2014-05-28, *Created*
# +=======================================================================

$users = Get-ADUser -Filter * -SearchScope Subtree -SearchBase "OU=Users,OU=Testlabs,DC=testlabs,DC=se" | Select-Object DistinguishedName, SamAccountName
$value = "@testlabs.se"
foreach ($i in $users)
{
$ext = ($i.SamAccountName) + $value
Write-Host "extensionAttribute15:", $ext

$id = $i.DistinguishedName
$user = Get-ADUser -Identity $id -Properties extensionAttribute1
Set-ADUser –Identity $user -Clear "extensionAttribute15"
Set-ADUser -Identity $user -Add @{extensionAttribute15 = $ext}
}
Update: Exchange 2013 script – automatic installation of prerequisites v2.1 *NEW*

Update: Exchange 2013 script – automatic installation of prerequisites v2.1 *NEW*

*Update*

*********************************************************************************************************************************************

Reuben Welsh came up with a great feature request regarding verifying the checksum of the files that’s being installed.
This has been implemented in the version 2.1 of the script.

*********************************************************************************************************************************************

For a year ago I was publishing a script that helped with installing prerequsites for Exchange 2013, this has now been updated so it also works for Exchange 2013 SP1 and Windows Server 2012 R2.
I hope this script helps someone for a smoother installation.
The script can be downloaded here: http://www.testlabs.se/blog/wp-content/uploads/2014/04/Install-Exchange2013PreReqs_v2.1.zip

*********************************************************************************************************************************************

Feel free to use this, make sure to test it in a test environment before using it inside production.
All contents is provided “AS IS” with no warranties, and confers no rights. You assume all risk for your use.

# +=======================================================================
 # | Blog: <a href="http://www.testlabs.se/blog">http://www.testlabs.se/blog</a>
 # | Twitter: @jonand82
 # | =============================================
 # | Filename: Install-Exchange2013PreReqs_v2.1.ps1
 # |
 # | CREATED BY: Jonas Andersson - Original written by: Pat Richard, Anderson Patricio and Bhargav Shukla
 # | FUNCTION: Installs and configures the prerequisites to install Exchange 2013 on..
 # | ..Windows Server 2008 R2, Windows Server 2012 or Windows Server 2012 R2 server
 # |
 # | CHANGE LOG:
 # | v1.0 - 2013-04-05, *Created*
 # | v2.0 - 2014-04-11, *Updated with functions*
 # | v2.1 - 2014-04-28, *Checksum implemented*
 # |
 # | <a href="http://www.ucblogs.net/blogs/exchange/archive/2009/12/12/Automated-prerequisite-installation-via-PowerShell-for-Exchange-Server-2010-on-Windows-Server-2008-R2.aspx">http://www.ucblogs.net/blogs/exchange/archive/2009/12/12/Automated-prerequisite-installation-via-PowerShell-for-Exchange-Server-2010-on-Windows-Server-2008-R2.aspx</a>
 # | <a href="http://msmvps.com/blogs/andersonpatricio/archive/2009/11/13/installing-exchange-server-2010-pre-requisites-on-windows-server-2008-r2.aspx">http://msmvps.com/blogs/andersonpatricio/archive/2009/11/13/installing-exchange-server-2010-pre-requisites-on-windows-server-2008-r2.aspx</a>
 # | <a href="http://www.bhargavs.com/index.php/powershell/2009/11/script-to-install-exchange-2010-pre-requisites-for-windows-server-2008-r2/">http://www.bhargavs.com/index.php/powershell/2009/11/script-to-install-exchange-2010-pre-requisites-for-windows-server-2008-r2/</a>
 # | <a href="http://www.tinyint.com/index.php/2011/09/14/get-an-md5-or-sha1-checksum-with-powershell/">http://www.tinyint.com/index.php/2011/09/14/get-an-md5-or-sha1-checksum-with-powershell/</a>
 # +=======================================================================

# Detect correct OS here and exit if no match
 if (-not((Get-WMIObject win32_OperatingSystem).OSArchitecture -eq '64-bit') -and (((Get-WMIObject win32_OperatingSystem).Version -eq "6.1.7601") -or ((Get-WMIObject win32_OperatingSystem).Version -eq "6.2.9200") -or ((Get-WMIObject win32_OperatingSystem).Version -eq "6.3.9600"))) {
 Write-Host "This script requires a 64bit version of Windows Server 2008 R2, Windows Server 2012 or Windows Server 2012 R2, which this is not." -ForegroundColor Red -BackgroundColor Black
 Exit
 }

function Get-Checksum
 {
 Param (
 [string]$File=$(throw("You must specify a filename to get the checksum of.")),
 [ValidateSet("sha1","md5")]
 [string]$Algorithm="sha1"
 )

$fs = new-object System.IO.FileStream $File, "Open"
 $algo = [type]"System.Security.Cryptography.$Algorithm"
 $crypto = $algo::Create()
 $hash = [BitConverter]::ToString($crypto.ComputeHash($fs)).Replace("-", "")
 $fs.Close()
 $hash
 }

function Disable-UAC() {

function UAC-status() {

$path = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System"
 $EnableLUA = ""
 $EnableLUA = Get-ItemProperty $path -Name EnableLUA

if ($EnableLUA.EnableLUA -eq "0") {
 [bool]$UACenabled = $false
 }

if ($EnableLUA.EnableLUA -eq "1") {
 [bool]$UACenabled = $true
 }

return $UACenabled
 }

[bool]$status = UAC-status

if ($status -ne $true) {
 Write-Host "UAC already disabled" -ForegroundColor Green
 return
 }

else {

Write-Host "Starting to disable UAC.."

Set-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System" -Name "EnableLUA" -Value 0
 Start-Sleep -Seconds 2

[bool]$status = UAC-status

if ($status -ne $false) {
 Write-Host "An error occurred, try again." -ForegroundColor Red
 return
 }

else {
 Write-Host "UAC Enabled:", $status
 Write-Host "...."
 Write-Host "UAC is now disabled" -ForegroundColor Green
 Write-Host "Registry key HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA has been changed." -ForegroundColor White
 }
 }
 }

function Disable-FW() {

function FW-status() {

$status = ""
 $status = netsh advfirewall show allprofiles state

if ($status | Select-String "ON") {
 [bool]$enabled = $true
 }

else {
 [bool]$enabled = $false
 }

return $enabled
 }

[bool]$fwstatus = FW-status

if ($fwstatus -eq $false) {
 Write-Host "Firewall is already disabled" -ForegroundColor Green
 return
 }

if ($fwstatus -eq $true) {

Write-Host "Starting to disable the firewall.."

$param = "advfirewall set allprofiles state off"
 $run = (Start-Process netsh -ArgumentList $param -Wait -PassThru).ExitCode
 if ($run -ne 0) { Write-Host "Failed!" -ForegroundColor Red }

[bool]$fwstatus = FW-status

if ($fwstatus -ne $false) {
 Write-Host "An error occurred, try again." -ForegroundColor Red
 return
 }

else {
 Write-Host "Firewall enabled:", $fwstatus
 Write-Host "...."
 Write-Host "Firewall is now disabled" -ForegroundColor Green
 }
 }
 }

function InstallFilterPack() {

function DownloadFilterPack1() {

#Download Microsoft Filter Pack
 Write-Host "Downloading Microsoft Filter Pack..." -nonewline
 $clnt = New-Object System.Net.WebClient
 $url = "<a href="http://download.microsoft.com/download/0/A/2/0A28BBFA-CBFA-4C03-A739-30CCA5E21659/FilterPack64bit.exe&quot;">http://download.microsoft.com/download/0/A/2/0A28BBFA-CBFA-4C03-A739-30CCA5E21659/FilterPack64bit.exe"</a>
 $clnt.DownloadFile($url,$file1)
 Write-Host "done!" -ForegroundColor Green
 }

function DownloadFilterPack2() {

#Download Microsoft Filter Pack SP1
 Write-Host "Downloading Microsoft Filter Pack SP1..." -nonewline
 $clnt = New-Object System.Net.WebClient
 $url = "<a href="http://download.microsoft.com/download/A/A/3/AA345161-18B8-45AE-8DC8-DA6387264CB9/filterpack2010sp1-kb2460041-x64-fullfile-en-us.exe&quot;">http://download.microsoft.com/download/A/A/3/AA345161-18B8-45AE-8DC8-DA6387264CB9/filterpack2010sp1-kb2460041-x64-fullfile-en-us.exe"</a>
 $clnt.DownloadFile($url,$file2)
 Write-Host "done!" -ForegroundColor Green
 }

function InstallFilterPack1() {

#Install Microsoft Filter Packs 1
 Write-Host "Installing Microsoft Filter Packs..."

$args = "/quiet /norestart"
 $setup1 = (Start-Process $file1 -ArgumentList $args -Wait -PassThru).ExitCode
 if ($setup1 -eq 0) {
 Write-Host "Successfully installed $file1" -ForegroundColor Green
 }

if ($setup1 -ne 0) {
 Write-Host "Failed!" -ForegroundColor Red
 }
 }

function InstallFilterPack2() {

$args = "/quiet /norestart"
 $setup2 = (Start-Process $file2 -ArgumentList $args -Wait -PassThru).ExitCode
 if ($setup2 -eq 0) {
 Write-Host "Successfully installed $file2" -ForegroundColor Green
 }

if ($setup2 -ne 0) {
 Write-Host "Failed!" -ForegroundColor Red
 }
 }

if (Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\{95140000-2000-0409-1000-0000000FF1CE}" -ErrorAction SilentlyContinue) {

Write-Host "FilterPack is already installed." -ForegroundColor Yellow
 return
 }

else {

trap {
 Write-Host "Problem downloading FilterPackx64.exe. Please visit: <a href="http://www.microsoft.com/en-us/download/details.aspx?id=26604">http://www.microsoft.com/en-us/download/details.aspx?id=26604</a> and <a href="http://www.microsoft.com/en-us/download/details.aspx?id=17062&quot;">http://www.microsoft.com/en-us/download/details.aspx?id=17062"</a>
 break
 }

#set a var for the folder you are looking for
 $folderPath = 'C:\Temp'

#Check if folder exists, if not, create it
 if (Test-Path $folderpath) {
 Write-Host "The folder $folderPath exists."
 }

else {
 Write-Host "The folder $folderPath does not exist, creating..." -NoNewline
 New-Item $folderpath -type directory | Out-Null
 Write-Host "done!" -ForegroundColor Green
 }

$file1 = $folderPath+"\FilterPack64bit.exe"
 $file1chksum = "9253B09EA9A2ADD0E773CD30FE4120F5732C4D98"

$file2 = $folderPath+"\filterpack2010sp1-kb2460041-x64-fullfile-en-us.exe"
 $file2chksum = "2C7B81D0C148E3E1894A9183FEE6A543EA5DC9B2"

# Check if file exists, if not, download it
 if (Test-Path $file1) {
 Write-Host "The file $file1 exists."

$chksum1 = Get-Checksum $file1
 if ($file1chksum.CompareTo($chksum1) -eq 0) {
 Write-Host "Checksum OK" -ForegroundColor 'Green'
 InstallFilterPack1
 }

else {
 Write-Host "Checksum Error, removing $file1" -ForegroundColor 'Red'
 Remove-Item $file1
 DownloadFilterPack1
 InstallFilterPack1
 }
 }

else {
 #Download Microsoft Filter Pack
 DownloadFilterPack1

#Install FilterPack 1
 InstallFilterPack1
 }

if (Test-Path $file2) {
 Write-Host "The file $file2 exists."

$chksum2 = Get-Checksum $file2
 if ($file2chksum.CompareTo($chksum2) -eq 0) {
 Write-Host "Checksum OK" -ForegroundColor 'Green'
 InstallFilterPack2
 }

else {
 Write-Host "Checksum Error, removing $file2" -ForegroundColor 'Red'
 Remove-Item $file2
 DownloadFilterPack2
 InstallFilterPack2
 }
 }

else {
 #Download Microsoft Filter Pack SP1
 DownloadFilterPack2

#Install Microsoft Filter Pack SP1
 InstallFilterPack2
 }
 }
 }

function InstallUMAPI() {

function InstallMicrosoftUMAPI() {

#Check/Install Media Foundation feature
 $mf = Get-WindowsFeature "Server-Media-Foundation" | select *

Start-Sleep 2

if ($mf.Installed -eq $False) {

Write-Host "Installing Media Foundation feature..."    -ForegroundColor Green
 Add-Windowsfeature Server-Media-Foundation

Write-Host ""
 Write-Host "Installing of Media Foundation feature completed." -ForegroundColor Green
 Write-Host ""
 Write-Host "Restart the server and restart the task" -ForegroundColor Red
 Write-Host "or else the UM API won't be installed" -ForegroundColor Red
 Write-Host ""
 return
 }

if ($mf.Installed -eq $True) {

#Install Microsoft UM API
 Write-Host "Installing Microsoft UM API..." -ForegroundColor Green

$args = "/quiet /norestart"
 $setup = (Start-Process $file -ArgumentList $args -Wait -PassThru).ExitCode
 if ($setup -eq 0) {
 Write-Host "Successfully installed $file" -ForegroundColor Green
 }

if ($setup -ne 0) {
 Write-Host "Failed!" -ForegroundColor Red
 }
 }
 }

function DownloadMicrosoftUMAPI() {

#Download Microsoft UM API
 Write-Host "Downloading Microsoft UM API..." -nonewline
 $clnt = New-Object System.Net.WebClient
 $url = "<a href="http://download.microsoft.com/download/2/C/4/2C47A5C1-A1F3-4843-B9FE-84C0032C61EC/UcmaRuntimeSetup.exe&quot;">http://download.microsoft.com/download/2/C/4/2C47A5C1-A1F3-4843-B9FE-84C0032C61EC/UcmaRuntimeSetup.exe"</a>
 $clnt.DownloadFile($url,$file)
 Write-Host "done!" -ForegroundColor Green
 }

#Checking for regkey
 if (Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\UCMA4" -ErrorAction SilentlyContinue) {

Write-Host "Unified Communications Managed API 4.0 Runtime is already installed." -ForegroundColor yellow
 return
 }

else {

trap {
 Write-Host "Problem downloading UM API. Please visit: <a href="http://www.microsoft.com/en-us/download/details.aspx?id=34992&quot;">http://www.microsoft.com/en-us/download/details.aspx?id=34992"</a>
 break
 }

#set a var for the folder you are looking for
 $folderPath = 'C:\Temp'

#Check if folder exists, if not, create it
 if (Test-Path $folderpath) {
 Write-Host "The folder $folderPath exists."
 }

else {
 Write-Host "The folder $folderPath does not exist, creating..." -NoNewline
 New-Item $folderpath -type directory | Out-Null
 Write-Host "done!" -ForegroundColor Green
 }

# Check if file exists, if not, download it
 $file = $folderPath+"\UcmaRuntimeSetup.exe"
 $filechksum = "5E4D536E916F9C97EE5A91A61952589825AEAA6C"
 if (Test-Path $file) {
 Write-Host "The file $file exists."

$chksum3 = Get-Checksum $file
 if ($filechksum.CompareTo($chksum3) -eq 0) {
 Write-Host "Checksum OK" -ForegroundColor 'Green'

#Install Microsoft UM API
 InstallMicrosoftUMAPI
 }

else {
 #Remove the file with wrong checksum
 Remove-Item $file

#Download Microsoft UM API
 DownloadMicrosoftUMAPI

#Install Microsoft UM API
 InstallMicrosoftUMAPI
 }
 }

else {
 #Download Microsoft UM API
 DownloadMicrosoftUMAPI

#Install Microsoft UM API
 InstallMicrosoftUMAPI
 }
 }
 }

Import-Module ServerManager
 $opt = "None"
 # Do {
 clear
 if ($opt -ne "None") {Write-Host "Last command: "$opt -foregroundcolor Yellow}
 Write-Host
 Write-Host Exchange Server 2013 SP1 - Prerequisites script
 Write-Host Please, select which role you are going to install..
 Write-Host
 Write-Host '1) Client Access Server'
 Write-Host '2) Mailbox'
 Write-Host '3) Typical (CAS/Mailbox)'
 Write-Host
 Write-Host '10) Install Microsoft Filter Pack 2.0'
 Write-Host '    Recommended if installing Mailbox Server roles' -foregroundcolor yellow
 Write-Host '    Automatically set for options 2 and 3' -foregroundcolor yellow
 Write-Host '11) Install Microsoft UM API' -foregroundcolor yellow
 Write-Host '    Automatically set for options 1, 2 and 3' -foregroundcolor yellow
 Write-Host '12) Disable UAC'
 Write-Host '13) Disable Firewall'
 Write-Host
 Write-Host '18) Restart the Server'
 Write-Host '19) End'
 Write-Host
 $opt = Read-Host "Select an option.. [1-19]? "

$Win2008feat = "Desktop-Experience", "NET-Framework", "NET-HTTP-Activation", "RPC-over-HTTP-proxy", "RSAT-Clustering", "RSAT-Web-Server", "WAS-Process-Model", "Web-Asp-Net", "Web-Basic-Auth", "Web-Client-Auth", "Web-Digest-Auth", "Web-Dir-Browsing", "Web-Dyn-Compression", "Web-Http-Errors", "Web-Http-Logging", "Web-Http-Redirect", "Web-Http-Tracing", "Web-ISAPI-Ext", "Web-ISAPI-Filter", "Web-Lgcy-Mgmt-Console", "Web-Metabase", "Web-Mgmt-Console", "Web-Mgmt-Service", "Web-Net-Ext", "Web-Request-Monitor", "Web-Server", "Web-Stat-Compression", "Web-Static-Content", "Web-Windows-Auth", "Web-WMI"
 $Win2012feat = "AS-HTTP-Activation", "Desktop-Experience", "NET-Framework-45-Features", "RPC-over-HTTP-proxy", "RSAT-Clustering", "RSAT-Clustering-CmdInterface", "RSAT-Clustering-Mgmt", "RSAT-Clustering-PowerShell", "Web-Mgmt-Console", "WAS-Process-Model", "Web-Asp-Net45", "Web-Basic-Auth", "Web-Client-Auth", "Web-Digest-Auth", "Web-Dir-Browsing", "Web-Dyn-Compression", "Web-Http-Errors", "Web-Http-Logging", "Web-Http-Redirect", "Web-Http-Tracing", "Web-ISAPI-Ext", "Web-ISAPI-Filter", "Web-Lgcy-Mgmt-Console", "Web-Metabase", "Web-Mgmt-Console", "Web-Mgmt-Service", "Web-Net-Ext45", "Web-Request-Monitor", "Web-Server", "Web-Stat-Compression", "Web-Static-Content", "Web-Windows-Auth", "Web-WMI", "Windows-Identity-Foundation"

switch ($opt) {
 1 {

# Windows Server 2008 R2 SP1
 if ((Get-WMIObject win32_OperatingSystem).Version -eq "6.1.7601") {

InstallUMAPI
 Import-Module ServerManager
 Add-WindowsFeature $Win2008feat -restart
 }

# Windows Server 2012 or Windows Server 2012 R2
 if (((Get-WMIObject win32_OperatingSystem).Version -eq "6.2.9200") -or ((Get-WMIObject win32_OperatingSystem).Version -eq "6.3.9600")) {

InstallUMAPI
 Install-WindowsFeature $Win2012feat -restart
 }
 }

2 {

# Windows Server 2008 R2 SP1
 if ((Get-WMIObject win32_OperatingSystem).Version -eq "6.1.7601") {

Import-Module ServerManager
 InstallUMAPI
 InstallFilterPack
 Add-WindowsFeature $Win2008feat -restart
 }

# Windows Server 2012 or Windows Server 2012 R2
 if (((Get-WMIObject win32_OperatingSystem).Version -eq "6.2.9200") -or ((Get-WMIObject win32_OperatingSystem).Version -eq "6.3.9600")) {

InstallUMAPI
 InstallFilterPack
 Install-WindowsFeature $Win2012feat -restart
 }
 }

3 {

# Windows Server 2008 R2
 if ((Get-WMIObject win32_OperatingSystem).Version -eq "6.1.7601") {

Import-Module ServerManager
 InstallFilterPack
 InstallUMAPI
 Add-WindowsFeature $Win2008feat -restart
 }

# Windows Server 2012 or Windows Server 2012 R2
 if (((Get-WMIObject win32_OperatingSystem).Version -eq "6.2.9200") -or ((Get-WMIObject win32_OperatingSystem).Version -eq "6.3.9600")) {

InstallUMAPI
 InstallFilterPack
 Install-WindowsFeature $Win2012feat -restart
 }
 }

10 {
 # future - auto detect Internet access
 Write-Host 'Can this server access the Internet?'
 $filtpack = Read-Host 'Please type (Y)es or (N)o...'
 switch ($filtpack)                {
 Y { InstallFilterPack }
 N {Write-warning 'Please download and install Microsoft Filter Pack from here: <a href="http://www.microsoft.com/en-us/download/details.aspx?id=26604">http://www.microsoft.com/en-us/download/details.aspx?id=26604</a> and <a href="http://www.microsoft.com/en-us/download/details.aspx?id=17062'}">http://www.microsoft.com/en-us/download/details.aspx?id=17062'}</a>
 }
 }

11 {
 # future - auto detect Internet access
 Write-Host 'Can this server access the Internet?'
 $umapi = Read-Host 'Please type (Y)es or (N)o...'
 switch ($umapi)                {
 Y { InstallUMAPI }
 N {Write-Warning 'Please download and install Microsoft UM API from here: <a href="http://www.microsoft.com/en-us/download/details.aspx?id=34992'}">http://www.microsoft.com/en-us/download/details.aspx?id=34992'}</a>
 }
 }

12 { Disable-UAC }
 13 { Disable-FW }
 18 { Restart-Computer }
 19 {
 Write-Host "Exiting..."
 Exit
 }
 default {Write-Host "You haven't selected any of the available options. "}
 }

Congratulations 2014 Microsoft MVP!

Congratulations 2014 Microsoft MVP!

This year started in the best possible way when I received the MVP Award for Exchange Server, I’m honored and very proud over this special recognition!

I want to give out lots of thanks to everyone out there for visiting this blog, buying and reading the PowerShell book and other activities I’ve been involved in.

I also want to say thanks to Mike Pfeiffer and Packt Publishing for making it possible for me to publish the book. I want to send out a special thanks to Magnus Björk and Hakim Taoussi for their great support.


Dear Jonas Andersson,
Congratulations! We are pleased to present you with the 2014 Microsoft® MVP Award! This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others. We appreciate your outstanding contributions in Exchange Server technical communities during the past year.

Finally, here’s a picture of the award I got this Friday 🙂

bild(1)

Summary of year 2013

Summary of year 2013

happy-new-year-2014-wallpaper-4The final post of this year is a summary of 2013, the year that gave my career a real boost.

Before this year started I had a few goals, one of them was to get the MCM/MCSM: Exchange approved from the company I’m working for. This was accomplished and a few weeks later it was announced that Microsoft Learning cancelled them. On the private level I proposed to my fiancée and we are getting married in May 2014 :).

Regarding work and projects, I’ve been involved in a few great assignments, all long term. It started in the autumn of 2012, my tasks within the project was finalized in February 2013, it was as far as I know the first project in Sweden that involved a coexistence between on-premise Domino mail solution and Microsoft Office 365. This was accomplished by using Dell Software’s Coexistence Manager for Notes. The project itself gave some great challenges and in the end a very happy customer.

In February I started a new long term assignment at a very large retail company were I was brought in as an Exchange and PowerShell expert and I helped them develop their mail platform, as an example, it could be tasks around provisioning objects into the mail platform. During this project I’ve developed my PowerShell knowledge and skills even more and come to know lots of great people, and probably one of the best managers I’ve ever worked with. I do hope that someday in the future we will all work together again, it would be lots of fun.

As a result of my work from February to August, I were also brought in as the technical lead since I’ve previously been involved in these kind of projects. This project is ongoing and will be finalized in February/March 2014. Pilots are running fine and the full-scale migration will start in the beginning in next year.

Another thing I’m very proud of is one of my private accomplishments, that the book got released in May 2013. If you for any reason haven’t seen it and want to learn more PowerShell for Exchange, have a look at it. Follow the link: http://www.packtpub.com/microsoft-exchange-server-2013-powershell-2e-cookbook/book.

As a side project on my spare time, I’ve been writing on a series of migration articles using Dell Software’s products and a couple of scripts have been published during the year. Hopefully these publications have been of great value to you.

Regarding the goals for 2014, I will come back to them within a few weeks with some news that aren’t official yet.

Finally I want to thank everyone that has been retweeting my articles on Twitter, and also to those that have been involved in one way or another regarding my blog and book. I’m looking forward to the challenges that 2014 will bring us all.
I wish you all a happy new year!

Regards,
Jonas

Part 8: Configuring Coexistence Manager for Notes with Office 365

Part 8: Configuring Coexistence Manager for Notes with Office 365

Published: 2013-12-20
Updated: –
Version: 1.0

Since the previous post took us through the technical prerequisites, these should now be ready and in place for installing and configuring Coexistence Manager for Notes (CMN).

Before going into any details, if you are planning to do have a coexistence scenario between Domino and Exchange, you may want to consider using Dell Software’s Coexistence Manager for Notes. However, one important thing to mention is that there is a requirement from the vendor, to use certified people for the project.

This blog post is based on Coexistence Manager for Notes version 3.5.1.51.

Some of you might know that I wrote some articles regarding this topic two years ago, the configuration has changed a bit. I want to share this with the community and I hope you enjoy reading it.

I have decided that I won’t publish any article about the Migration Manager product. If anyone are interested of writing them, I’m glad to support and review the articles. If interested, contact me at: jonas.andersson@testlabs.se.

Read the other parts:

Part 1: Migrations – Overview
Part 2: Prerequisites for Domino/Notes migrations
Part 3: Migrating Domino/Notes to Exchange 2013 On-premise
Part 4: Migrating Domino/Notes to Office 365
Part 5: Migrating Resources Mailboxes, Mail-In databases and Groups
Part 6: Prerequisites for Coexistence Manager for Notes with Exchange 2013 On-premise
Part 7: Configuring Coexistence Manager for Notes with Exchange 2013 On-premise

Technical overview of the solution

SMTP and Free/Busy requests overview design

Drawing

Installation of Coexistence Manager for Notes (CMN)

There is no need for further description on how to proceed with the installation of CMN, select the features that should be used, then it’s a “next-next-finish” installation.

Licensing

Startup “Quest Coexistence Manager for Notes Management Console” and go to “Common – Licensing” to provide a valid license file.

Mail Connector configuration

This post is not about how to create the mail flow configuration between Office 365/Exchange and Domino since I assume, if you’re working and reading this topic, you’re familiar with how to create Send/Receive connectors in Exchange and Domain documents and Connection documents in Domino.

I will, however, post an article on how to configure Exchange/Office 365 and Domino regarding the mail flow.

Let’s configure CMN regarding mail flow, startup “Quest Coexistence Manager for Notes Management Console” and go to “Mail Connector”.

Go to “Inbound Servers”, remove any default values, add all incoming servers, both source and target servers. Just make sure to specify their function (Server type).

image

When all are added, it will look similar to the picture below.

image

Go to “Outbound Servers”, remove any default values. Either use the “Add” button or if you’re about to add the same as the Inbound, then use the “Copy from Inbound Servers” button.

image

After the servers are added, it will look similar as the picture below.

image

For Notes Doc Links, I will use the option “Notes links (Requires Notes client on clients)”, but you should select the option that will provide the best solution in each scenario.

image

I’m using the default settings for Network settings.

image

If needed, TLS can be used and it’s in this window the configuration takes place. In my lab environment, I’m not using TLS.

image

I’m using the default settings for Advanced Message settings.

image

I prefer to use the option “Rewrite Notes Common Names”, so it becomes more user-friendly and easier to read than a long Domino displayname.

Other options are not enable, use them if needed.

image

I’m using the default settings for Message Content Limits settings.

image

In the lab environment I’m not using the sub-domain option. However, if needed, here is the place to configure it.

image

Active Mail, it requires Notes client 7.0.3, 7.0.4 or 8.0 on the CMN server. It also requires the Notes client on the clients for being able to use the feature.

image

Default settings in Notification messages.

image

Here is a sample of the “ResourcesMap.tsv” file that’s used for mapping resources so they can be booked from Exchange/Outlook.

image

Import the “ResourcesMap.tsv” file, just verify the imported items and change the “Resource type” if they are not correct or configured.

image

Directory Synchronization configuration

Let’s walk through the directory synchronization, which is required to get Free/Busy to work properly. It’s required to provision users as contact objects.

With CMN 3.5.x, the directory synchronization uses a new module, which uses SQL for its configuration. Just see my picture below as an example of the SQL configuration.

The configuration can be found under “Directory Connector – SQL Settings”.

image

Domino Users synchronization, go to “Directory Connector – Connector Settings”. Press “Add” button and “Next” in the window.

image

Give the connector a friendly name like “Domino to AD – Users”, verify the “Direction” value and press “Next”.

image

Type in Source information: domino server, username, password and LDAP port.

image

Type in Target information: domain controller, username, password and LDAP port.
In my scenario, I’ve specified a domain controller, so I enabled that checkbox.

Specification of domain controllers are common in scenarios where you want to use the closest domain controller possible for faster reading and writing.

image

Select the object to process – “Users & Contacts”, specify the OU that should be synchronized.

image

Specify the target OU where objects will be created, also specify Target Search Base DN and load the Exchange attributes from AD and add them.

Since Office 365 is used, you need to specify a different targetAddress domain (forwarding) use the “Enable Internal Routing Domain” option and specify a domain in the value field. See my example in the screenshot below.

image

No connector order is selected.

image

A synchronization schedule is created, in my example 5 AM and 2 PM. The appropriate timing depends on how often and how many changes are done within Domino.

image

Press “Finish” to close the final window.

image

Groups synchronization, go to “Directory Connector – Connector Settings”. Press “Add” button and “Next” in the window.

image

Give the connector a friendly name like “Domino to AD – Groups”, verify the “Direction” value and press “Next”.

image

Type in Source information: domino server, username, password and LDAP port.

image

Type in Target information: domain controller, username, password and LDAP port.
In my scenario, I’ve specified a domain controller, so I enabled that checkbox.

Specification of domain controllers are common in scenarios where you want to use the closest domain controller possible for faster reading and writing.

image

Select the object to process by selecting “Groups” and specify the OU that should be synchronized.

image

Specify the target OU where objects will be created, also specify Target Search Base DN and load the Exchange attributes from AD and add them.

Since Office 365 is used, you need to specify a different targetAddress domain (forwarding) use the “Enable Internal Routing Domain” option and specify a domain in the value field. See my example in the screenshot below.

image

No connector order is selected.

image

A synchronization schedule is created, in my example 5 AM and 2 PM. The appropriate timing depends on how often and how many changes are done within Domino.

image

Press “Finish” to close the final window.

image

Resources synchronization, go to “Directory Connector – Connector Settings”. Press “Add” button and “Next” in the window.

image

Give the connector a friendly name like “Domino to AD – Resources”, verify the “Direction” value and press “Next”.

image

Type in Source information: domino server, username, password and LDAP port.

image

Type in Target information: domain controller, username, password and LDAP port.
In my scenario, I’ve specified a domain controller, so I enabled that checkbox.

Specification of domain controllers are common in scenarios where you want to use the closest domain controller possible for faster reading and writing.

image

Select what object to process “Resources”, specify the OU that should be synchronized.

image

Specify the target OU where objects will be created, also specify Target Search Base DN and load the Exchange attributes from AD and add them.

Since Office 365 is used, you need to specify a different targetAddress domain (forwarding) use the “Enable Internal Routing Domain” option and specify a domain in the value field. See my example in the screenshot below.

image

No connector order is selected.

image

A synchronization schedule is created, in my example 5 AM and 2 PM. The appropriate timing depends on how often and how many changes are done within Domino.

image

Press “Finish” to close the final window.

image

Free/Busy configuration

Since we now have the contact objects provisioned and the mail flow working, it’s time for the most involved part of the coexistence, the Free/Busy configuration.

Qcalcon configuration

The installation of Qcalcon on a Domino server is a standard “next-next-finish” procedure and a Domino server task will be created during the installation. The software can either be installed on an existing server or a dedicated Free/Busy server (I would recommend the latter IF possible).

Start the Qcalcon configuration by starting the “Coexistence Management Console”, see picture below.

image

Configure Qcalcon with the following properties (as an example):

“Gateway Mail File Name: mail.box” (verify with Domino Administrator on which to use)
”Quest Exchange Free/Busy Connector Service Endpoint: cmn35“ (resolvable DNS name to CMN server)

Note: You need to provide a valid license before the software can be used.

image

Domino configuration, go to the CMN server and start the CMN console, then go to “Domino Free/Busy Connector”.

Type in Domino configuration;
”Domino Server Name: domino/target” (specify server where Qcalcon is installed)
”Domino User fetch interval in minutes: 15
”Domino User SMTP domain: testlabs.se
”Exchange Forwarding Domain: domino.testlabs.se – testlabs.se
”Domino ID file path: C:\Temp\mmig.id” (Browse and select the ID file)
”Domino Password: *****” (Type in the password for that ID file)
”Enable Performance counters: Check

image

Go to “Quest Web Services”

Type in Domino configuration;
”Quest Autodiscover Host Name: domino.testlabs.se
”Quest Domino Free/Busy Connector Host Name: localhost

Don’t forget to create (if not done already as specified in part 6) the AvailabilityAddressSpace, or Free/Busy won’t work as expected. See cmdlet below picture.

image

$cred = Get-Credential

$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri `
ps.outlook.com/powershell -Credential $cred -Authentication Basic –AllowRedirection 

Import-PSSession $session
Enable-OrganizationCustomization

New-AvailabilityConfig -OrgWideAccount <Office365AdminAccont>

$CMNCred = Get-Credential

Add-AvailabilityAddressSpace -AccessMethod OrgWideFB -ForestName domino.testlabs.se `
-Credentials $CMNCred -TargetAutodiscoverEpr `
"https://autodiscover.domino.testlabs.se/autodiscover/autodiscover.xml"

Add-AvailabilityAddressSpace -AccessMethod OrgWideFB -ForestName testlabs.se `
-Credentials $CMNCred -TargetAutodiscoverEpr `
”https://autodiscover.domino.testlabs.se/autodiscover/autodiscover.xml”

Exchange configuration, let’s finish the Free/Busy configuration by completing the Exchange part by going to “Exchange Free/Busy Connector – Exchange Free/Busy”.

Type in Exchange configuration;

”Exchange Server location: Autodiscover Endpoint” (more about these options can be found in the User Guide)

”Exchange Host Name: autodiscover-s.outlook.com

”Exchange Online: Checked

”Exchange Username: username@testlabstrial.onmicrosoft.com

”Exchange Password: *****

”Show tentative As Busy: Yes

”Enable Performance Counters: Enable

Use the Test button to verify that the functionality is working as expected.

Note: Certificate needs to be deployed before a successful test.

image

Additional Configurations
Certificate/IIS

Coexistence Manager relies on certificates since it’s using HTTPS for requests. This is important to understand.

The provided “Quest Autodiscover URL” and “Quest EWS URL” is based on the value entered in the “Quest Autodiscover Host Name” field. This common name is used during Free/Busy requests and is required to be in the certificate used in IIS. It should be bound to IIS and the “QuestFreeBusy” website.

Once the certificates have been deployed into the CMN server and IIS, use the Test buttons in the CMN console to verify the Quest Autodiscover functionality. In most cases, the autodiscover DNS record is pointed to the Exchange so, in order to test this functionality, use the host file and point it to CMN server.

A last thing to verify is that the “QuestFreeBusy” website is enabled for HTTP (80) and HTTPS (443) traffic, since it’s a requirement.

Note: Since this is a Office 365 solution and Microsoft are not aware of our internal PKI solution and are not trusting the internal issued certificates we need to buy a certificate from a trusted root provider.

In my lab I’m using Comodo because they could provide a trial certificate up to 90 days.

Autodiscover

In short, I’ve copied a good description in a quote from the User Guide for Coexistence Manager..

When coexisting with Office 365: Direct free-busy lookups from Office 365

to Notes are not possible in a single-namespace configuration due to access/

permission restrictions to the remote Microsoft servers. If you require bi-directional

free/busy in a single-namespace environment with Office 365, consider a

hybrid implementation with a local Exchange server and calendar federation.

Probably the easiest way of describing this is to say that the autodiscover of the primary domain/s needs to be pointed to Office 365 and therefore a sub-domain needs to be implemented for having a way back reaching the users Free/Busy information.

The Autodiscover is used since the mail contacts have a targetAddress with “@domino.testlabs.se” and there is a configured value for that domain in the AvailabilityAddressSpace configuration. Because of that, the request ends up checking these contacts Free/Busy externally via Autodiscover, which is pointed to CMN.

Verification of functionality
Notes client (source)

 

Mail flow

A mail is sent from the Lotus Notes client (8.5.x) to a user that were migrated to Office 365 and now have an Exchange Online mailbox and uses Outlook 2013.

The mail is a standard mail, see picture below.

image

During the transport, these actions are being logged into the CMN.log file on the CMN server, some related entities can be found below:

2013-12-16 22:04:42,725 INFO  CMN.logging [45] – Connection received from 172.16.1.16.

2013-12-16 22:04:43,098 INFO  CMN.logging [45] – Message Number [22] on Thread [45] from Domino (172.16.1.16:2979) to Exchange (192.168.0.50:25): Connection established.

2013-12-16 22:04:51,019 INFO  CMN.logging [Proxy 22] – Message Number [22] on Thread [47] from Domino (172.16.1.16:2979) to Exchange (192.168.0.50:25): Processed Message ID: OF1E60FD00.7502912C-ONC1257C43.00739C32-C1257C43.0073C978@domino.testlabs.se – Size: 589 – From: Anette.Andersson@testlabs.se – To: Jonas.Andersson@testlabs.se – Processing Time: 3.443 Seconds – Changes: ActiveMailRemovedExtraneousAttachment, ActiveMailRemovedOnd, MimeModified

In the destination mailbox it should look like the picture below

image

And the reply from Outlook ends up in the source mailbox (Notes), just like the picture shows below

image

Calendar Free/Busy

A Free/Busy request was done by arranging a new meeting in the Notes client and selecting the migrated users. If the busytime lookup is working as expected, it should look similar to the picture below:

image

During the busytime lookup requests, these actions are being logged into the QCalCon.wlog on the Domino Qcalcon server and ExchangeFreeBusyService.wlog file on the CMN server. Some examples on log entries can be found while doing the busytime lookup, see below:

QCalCon.wlog:

2013-12-17 19:41:12,083 [mail.box] INFO  ScheduleRequestManager – Message retrieved from queue

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – ScheduleRequestHandler() enter

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – NotesInitThread

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Cast thread parameter to SchMsgWrapper instance

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Release SCHMSG instance from SchMsgWrapper instance

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Process SCHMSG message

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – SchContainer_DupHandle: Duplicate SCHMSG hContainer handle

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – SchContainer_GetRequest: Get hContainerObject request from message hContainer

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – UserNameList: 1

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager –   CN=Jonas Andersson/O=target@Exchange

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – ClientNameList: 0

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – DominoServerNameChain:

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Call GetFreeBusyForUsers

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – GetFreeBusyForUsers() enter

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – GetEmailsFromList() enter

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Create SmtpEmailList

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Create NameRepository

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – 1 entries in list

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – FullName:CN=Jonas Andersson/O=target@Exchange

2013-12-17 19:41:12,270 [12] INFO  NameRepository – TryGetMailAddressAndInternetAddressFromFullName() enter

2013-12-17 19:41:12,270 [12] INFO  NameRepository – FullName: CN=Jonas Andersson/O=target

2013-12-17 19:41:12,270 [12] INFO  NameRepository – MailAddress: Jonas.Andersson@testlabs.se@TARGET

2013-12-17 19:41:12,270 [12] INFO  NameRepository – InternetAddress: Jonas.Andersson@domino.testlabs.se

2013-12-17 19:41:12,270 [12] INFO  NameRepository – TryGetMailAddressAndInternetAddressFromFullName() exit

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – ScheduleRequestManager() exit

2013-12-17 19:41:12,270 [12] INFO  ScheduleRequestManager – Call ExchangeFreeBusyService net.tcp to get Free/Busy information

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – GetFreeBusyForUsers() exit

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – GetFreeBusyForUsers returned 1 results

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Create SCHED_LIST result instance for user jonas.andersson@testlabs.se

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Is a valid user.

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Allocate 12068 bytes to hold SCHED_LIST

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Convert 335 Free/Busy times to TIMEDATE format

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Schedule_NewFromSchedList()

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Set SCHMSG flags to SCHMSG_ReplyToRqst

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – MQPut: Place SCHMSG in output queue

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – SchContainer_FreeRequest: Free hContainerObject

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – SchContainer_Free: Free hContainer

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Delete SCHMSG message

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – NotesTermThread

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – Free/Busy request processing took 00:00:25.6019938

2013-12-17 19:41:37,864 [12] INFO  ScheduleRequestManager – ScheduleRequestHandler() exit

ExchangeFreeBusyService.wlog:

2013-12-17 19:41:24,233 [3] INFO  ExchangeFreeBusyConnector – Initialize() Enter

2013-12-17 19:41:24,247 [3] INFO  ExchangeConfiguration – User name credential is sa-account@testlabs.se

2013-12-17 19:41:24,251 [3] INFO  ExchangeFreeBusyConnector – Initialize() Exit

2013-12-17 19:41:24,262 [3] INFO  FreeBusyWcfServiceBase – GetFreeBusyForUsers() Begin

2013-12-17 19:41:24,263 [3] INFO  FreeBusyWcfServiceBase – Time span: 12/17/2013 19:30:00 Local — 06/03/2014 19:30:00 Local

2013-12-17 19:41:24,270 [3] INFO  FreeBusyWcfServiceBase – Email addresses:

2013-12-17 19:41:24,270 [3] INFO  FreeBusyWcfServiceBase –   Jonas.Andersson@testlabs.se

2013-12-17 19:41:24,284 [3] INFO  ExchangeFreeBusyConnector – GetFreeBusyInfo() Begin

2013-12-17 19:41:24,287 [3] INFO  ExchangeFreeBusyConnector –   Email Addressees (Count=1), Start=12/17/2013 00:00:00 (Utc), End=06/03/2014 00:00:00 (Utc)

2013-12-17 19:41:24,287 [3] INFO  ExchangeFreeBusyConnector –     jonas.andersson@testlabs.se

2013-12-17 19:41:24,288 [3] INFO  ExchangeConfiguration – User name credential is sa-account@testlabs.se

2013-12-17 19:41:24,292 [3] INFO  AutodiscoverResultCache – jonas.andersson@testlabs.se not found in cache.

2013-12-17 19:41:24,302 [3] INFO  AutodiscoverWorker – Using hint autodiscover address https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml

2013-12-17 19:41:24,302 [3] INFO  AutodiscoverWorker – Email address: jonas.andersson@testlabs.se

2013-12-17 19:41:24,303 [3] INFO  AutodiscoverWorker – ScpLookupOrder:Last

2013-12-17 19:41:31,733 [3] INFO  AutodiscoverWorker – Using redirect target address https://pod51036.outlook.com/autodiscover/autodiscover.xml

2013-12-17 19:41:34,453 [3] INFO  AutodiscoverWorker – User display name: Jonas Andersson

2013-12-17 19:41:34,453 [3] INFO  AutodiscoverWorker – Internal Autodiscover URI: https://pod51036.outlook.com/autodiscover/autodiscover.xml

2013-12-17 19:41:34,453 [3] INFO  AutodiscoverWorker – Internal EWS URI: https://outlook.office365.com/EWS/Exchange.asmx

2013-12-17 19:41:34,453 [3] INFO  AutodiscoverWorker – Autodiscover successfully returned EWS URI.

2013-12-17 19:41:34,454 [3] INFO  AutodiscoverWorker – 00:00:10.1529517

2013-12-17 19:41:34,456 [3] INFO  AutodiscoverResultCache – Add jonas.andersson@testlabs.se https://outlook.office365.com/EWS/Exchange.asmx

2013-12-17 19:41:34,456 [3] INFO  AutodiscoverResultCache – Contains jonas.andersson@testlabs.se False

2013-12-17 19:41:34,461 [3] INFO  EwsWorker – Sending EWS request to Exchange

2013-12-17 19:41:37,043 [3] INFO  EwsWorker – Receiving EWS response from Exchange 00:00:02.5816765

2013-12-17 19:41:37,049 [3] INFO  EwsWorker – Sending EWS request to Exchange

2013-12-17 19:41:37,314 [3] INFO  EwsWorker – Receiving EWS response from Exchange 00:00:00.2646486

2013-12-17 19:41:37,314 [3] INFO  EwsWorker – Sending EWS request to Exchange

2013-12-17 19:41:37,574 [3] INFO  EwsWorker – Receiving EWS response from Exchange 00:00:00.2597097

2013-12-17 19:41:37,574 [3] INFO  EwsWorker – Sending EWS request to Exchange

2013-12-17 19:41:37,867 [3] INFO  EwsWorker – Receiving EWS response from Exchange 00:00:00.2934156

2013-12-17 19:41:37,872 [3] INFO  ExchangeFreeBusyConnector – GetFreeBusyInfo() End 00:00:13.5837260

2013-12-17 19:41:37,882 [3] INFO  FreeBusyWcfServiceBase –   Email Address: jonas.andersson@testlabs.se

2013-12-17 19:41:37,882 [3] INFO  FreeBusyWcfServiceBase –     Valid User=True, Busy Time count=335

2013-12-17 19:41:37,882 [3] INFO  FreeBusyWcfServiceBase – GetFreeBusyForUsers() End Elapsed Time 00:00:13.6100533

Outlook 2013/OWA (destination/target)

Mail flow

A mail is sent from the Outlook 2013/OWA client to a user that has not been migrated and remains in Domino.

The mail is a standard mail, see picture below.

image

During the transport, these actions are being logged into the CMN.log file on the CMN server, some related entities can be found below:

2013-12-17 19:11:43,822 INFO  CMN.logging [5] – Connection received from 213.199.154.14.

2013-12-17 19:11:43,840 INFO  CMN.logging [5] – Message Number [1] on Thread [5] from Exchange (213.199.154.14:18414) to Domino (172.16.1.16:25): Connection established.

2013-12-17 19:11:46,535 INFO  CMN.logging [Proxy 1] – Message Number [1] on Thread [9] from Exchange (213.199.154.14:18414) to Domino (172.16.1.16:25): Processed Message ID: 36b115a4b2974ece99a97f9c00fa3171@AMXPR01MB088.eurprd01.prod.exchangelabs.com – Size: 2773 – From: jonas.andersson@testlabs.se – To: Anette.Andersson@domino.testlabs.se – Processing Time: .134 Seconds – Changes: NoChange

In the destination mailbox (Lotus Notes) it should look like the picture below

image

And the reply from Notes ends up in the target mailbox (Outlook), just like the picture shows below

image

Calendar Free/Busy

A Free/Busy request was done by arranging a new meeting in the Outlook 2013/OWA client and selecting the Domino users. If the Free/Busy request lookup is working as expected, it should look similar to the picture below:

image

During the busytime lookup requests, these actions are being logged into the Autodiscover.wlog, EWS.wlog and DominoFreeBusyService.wlog on the CMN server. Some examples on log entries can be found while doing the busytime lookup, see below:

Autodiscover.wlog

2013-12-17 20:51:20,607 [6] INFO  AutodiscoverPage – IsSecureConnection: True

2013-12-17 20:51:20,608 [6] INFO  AutodiscoverPage – UserAgent: ASAutoDiscover/CrossForest/EmailDomain//15.00.0847.008

2013-12-17 20:51:20,612 [6] INFO  AutodiscoverPage – UserHostName: 157.56.250.52

2013-12-17 20:51:20,612 [6] INFO  AutodiscoverPage – UserHostAddress: 157.56.250.52

2013-12-17 20:51:20,619 [6] INFO  AutodiscoverPage – Email Address: Anette.Andersson@domino.testlabs.se

2013-12-17 20:51:20,619 [6] INFO  AutodiscoverPage – Quest EWS URL: https://autodiscover.domino.testlabs.se/EWS/Service.asmx

EWS.wlog:

2013-12-17 20:51:22,993 [6] INFO  QuestEWSService – RequestedView: DetailedMerged

2013-12-17 20:51:22,994 [6] INFO  QuestEWSService – RequestedViewSpecified: True

2013-12-17 20:51:22,994 [6] INFO  QuestEWSService – MergedFreeBusyIntervalInMinutes: 30

2013-12-17 20:51:22,995 [6] INFO  QuestEWSService – TimeWindow: 12/08/2013 00:00:00 Unspecified — 12/29/2013 00:00:00 Unspecified

2013-12-17 20:51:22,998 [6] INFO  QuestEWSService – TimeZone bias: -60

2013-12-17 20:51:22,999 [6] INFO  QuestEWSService –  StandardTime: -10-Sunday 5 0

2013-12-17 20:51:22,999 [6] INFO  QuestEWSService –  DaylightTime: -3-Sunday 5 -60

2013-12-17 20:51:22,999 [6] INFO  QuestEWSService –   Anette.Andersson@domino.testlabs.se

2013-12-17 20:51:25,298 [6] INFO  QuestEWSService – Response:

2013-12-17 20:51:25,298 [6] INFO  QuestEWSService –   Email Address: anette.andersson@domino.testlabs.se, FreeBusy Count: 39

2013-12-17 20:51:25,305 [6] INFO  QuestEWSService – 00:00:02.3123684

DominoFreeBusyService.wlog:

2013-12-17 20:51:23,587 [3] INFO  FreeBusyWcfServiceBase – GetFreeBusyForUsers() Begin

2013-12-17 20:51:23,588 [3] INFO  FreeBusyWcfServiceBase – Time span: 12/07/2013 23:00:00 Utc — 12/28/2013 23:00:00 Utc

2013-12-17 20:51:23,592 [3] INFO  FreeBusyWcfServiceBase – Email addresses:

2013-12-17 20:51:23,592 [3] INFO  FreeBusyWcfServiceBase –   Anette.Andersson@domino.testlabs.se

2013-12-17 20:51:23,717 [3] INFO  SmtpDomainMappings – smtpMappings count:0

2013-12-17 20:51:23,726 [3] INFO  DominoFreeBusyConnector – GetFreeBusyInfo() enter

2013-12-17 20:51:23,726 [3] INFO  DominoFreeBusyConnector – Get Domino user map.

2013-12-17 20:51:23,767 [3] INFO  DominoSingleton – Ctor() enter

2013-12-17 20:51:23,768 [3] INFO  DominoSingleton – Create DominoLibrary

2013-12-17 20:51:23,769 [3] INFO  DominoSingleton – Initialize DominoLibrary

2013-12-17 20:51:23,823 [3] INFO  DominoSingleton – Create UserMapRepository

2013-12-17 20:51:23,824 [3] INFO  DominoUserMapRepository – ctor() enter; serverName = domino/target

2013-12-17 20:51:23,824 [3] INFO  DominoUserMapRepository – ctor() exit

2013-12-17 20:51:23,824 [3] INFO  DominoSingleton – Ctor() exit

2013-12-17 20:51:23,827 [3] INFO  DominoUserMapRepository – GetDominoUserMap() enter; smtpDomain = testlabs.se

2013-12-17 20:51:23,827 [3] INFO  DominoUserMapRepository – anette.andersson@domino.testlabs.se not found in cache.

2013-12-17 20:51:23,827 [3] INFO  DominoUserMapRepository – 1 cache miss.

2013-12-17 20:51:23,837 [3] INFO  NameRepository – GetTargetDominoUsers count:1

2013-12-17 20:51:23,838 [3] INFO  NameRepository – Querying Domino Server Name=domino/target Domain=testlabs.se

2013-12-17 20:51:25,234 [3] INFO  NameRepository – Completed Domino Query

2013-12-17 20:51:25,234 [3] INFO  NameRepository – No error in Domino query

2013-12-17 20:51:25,235 [3] INFO  NameRepository – Address To Locate: anette.andersson@domino.testlabs.se

2013-12-17 20:51:25,238 [3] INFO  NameRepository – Domino Type: Person

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino Internet Address: Anette.Andersson@domino.testlabs.se

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino Full Name: CN=Anette Andersson/O=target

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino Mail File: mail\aanderss

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino Mail Domain: target

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino List Name:

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Domino Mail Server: CN=domino/O=target

2013-12-17 20:51:25,239 [3] INFO  NameRepository – Adding Anette.Andersson@domino.testlabs.se to result set.

2013-12-17 20:51:25,239 [3] INFO  NameRepository – finally – NameRepository :: GetTargetDominoUsers

2013-12-17 20:51:25,241 [3] INFO  DominoUserMapRepository – 1 addresses found.

2013-12-17 20:51:25,241 [3] INFO  DominoUserMapRepository – Adding anette.andersson@domino.testlabs.se to cache.

2013-12-17 20:51:25,241 [3] INFO  DominoUserMapRepository – GetDominoUserMap() exit

2013-12-17 20:51:25,241 [3] INFO  DominoFreeBusyConnector – 1 Domino domain users found.

2013-12-17 20:51:25,241 [3] INFO  DominoFreeBusyConnector – Filter list to SMTP Domino domain users.

2013-12-17 20:51:25,241 [3] INFO  DominoFreeBusyConnector – Get Free/Busy information for each valid user in SMTP Domino domain user list.

2013-12-17 20:51:25,241 [3] INFO  DominoFreeBusyConnector – Get live Free/Busy for Anette.Andersson@domino.testlabs.se

2013-12-17 20:51:25,254 [3] INFO  DominoLibrary – Sending request to Domino for free busy information.

2013-12-17 20:51:25,263 [3] INFO  DominoLibrary – Domino response processing complete.

2013-12-17 20:51:25,275 [3] INFO  DominoFreeBusyConnector – Add to result list

2013-12-17 20:51:25,275 [3] INFO  DominoFreeBusyConnector – Sort the result list.

2013-12-17 20:51:25,278 [3] INFO  DominoFreeBusyConnector – 1 Free/Busy results found

2013-12-17 20:51:25,278 [3] INFO  DominoFreeBusyConnector – GetFreeBusyInfo() exit

2013-12-17 20:51:25,280 [3] INFO  FreeBusyWcfServiceBase –   Email Address: anette.andersson@domino.testlabs.se

2013-12-17 20:51:25,280 [3] INFO  FreeBusyWcfServiceBase –     Valid User=True, Busy Time count=39

2013-12-17 20:51:25,280 [3] INFO  FreeBusyWcfServiceBase – GetFreeBusyForUsers() End Elapsed Time 00:00:01.6876990

Notes from the field

Log reader tool – A good log reader, my favorite is the old tool that was included in the SMS 2003 resource kit called trace32.exe. It can be downloaded here.

Domino SMTP routing – Until I have published a new article on this topic, see the existing one since it can be difficult to understand on how SMTP routing is working between the systems. See the post about it here: http://www.testlabs.se/blog/?p=1042

Network MonitoringNetwork Monitoring or Wireshark may sometimes be your best friend during troubleshooting network connectivity. Portqry is another tool that could be of great value during initial network verification.

Don’t hesitate to comment if you would like to add anything or if you have other experiences, I will add it into the post and link your blog.

I have decided that I won’t publish any article about the Migration Manager product. If anyone are interested of writing one, I’m glad to support and review the article. If interested, contact me at: jonas.andersson@testlabs.se.

I will take a break from the migration articles for a while now and write about other topics that readers hopefully find interesting reading.

Load More