I often use scripts that uses cmdlets from different modules so I can use all sorts of data sets when handling my Office365 administration tasks. The problem is that I often found myself connecting to a specific service such as the Exchange services, only to need the security center moments later – or the MSOL Module right after. When reinstalling my laptop I decided to not bump into this anymore, mostly to just get rid of my annoyance.
After a short search online I’ve found that there already was a bit of an example here on the Microsoft docs website. Unfortunately this guide is outdated and does not included the newer Teams Module. It also does not automatically find the correct SharePoint URL. As I am quite lazy and never want to look things up I also added the functionality to find the correct URL and to download the right modules. Currently it connects to the following services:
Services
Service | Module Name |
AzureAD (Graph) | AzureAD Module |
AzureAD(MSOL) | MSOL Module (Legacy) |
Teams | MicrosoftTeams(Beta) |
Exchange Online | PSSession to Exchange Endpoint |
Security & Compliance | PSSession to Protection endpoint |
Sharepoint | Microsoft.Online.SharePoint.PowerShell |
Skype for Business | SkypeOnlineConnector |
The function has only two options; a -Disconnect in case you want to end the sessions cleanly, and a -Credentials option for passing the credentials. Both are optional. To make sure the Function is always available to me I’ve added it both to my VSCode Profile and my PowerShell profile by starting a PowerShell prompt in both tools and entering the following one-liner:
New-Item -Path $profile -ItemType File
This creates a file in your profile path. Any code you paste here will always be loaded on startup. Because I use a lot of functions I do not like posting my code directly here, instead I save my modules to a specific folder, and have it look in that folder for any functions that I add.
$MyFunctions = "C:\Posh\Functions" write-host "Loading Functions" -ForegroundColor Yellow Get-ChildItem "$MyFunctions\*.ps1" | %{.$_} write-host "Done Loading functions." -ForegroundColor Green
This small piece of code looks in C:\Posh\Functions for all .PS1 files and loads these files as if I just run them as a script. This makes sure small functions which do not need to be an entire module on their own are loaded correctly. In C:\Posh\Functions I’ve saved the following script which I’ve called “Connect-Office365.ps1”
Script
function Connect-Office365 { param( [System.Management.Automation.PSCredential]$Credential, [switch]$Disconnect ) if($Disconnect){ Get-PSSession | remove-pssession Disconnect-SPOService Disconnect-AzureAD exit } write-host "Checking Prerequisites" -ForegroundColor Green try{ Import-Module AzureAD -ErrorAction stop } catch { write-host "Could not find AzureAD Module. Installing." -ForegroundColor Green install-module -Name AzureAD -Scope CurrentUser -force Import-Module AzureAD -ErrorAction stop } try{ Import-Module MSOnline -ErrorAction stop } catch { write-host "Could not find MSOL Module. Installing." -ForegroundColor Green install-module -Name MSOnline -Scope CurrentUser -force Import-Module MSOnline -ErrorAction stop } try{ Import-Module MicrosoftTeams -ErrorAction stop } catch { write-host "Could not find MSTeams Module. Installing" -ForegroundColor Green install-module -Name MicrosoftTeams -Scope CurrentUser -force Import-Module MicrosoftTeams } try{ Import-Module Microsoft.Online.SharePoint.PowerShell -ErrorAction stop } catch { write-host "Could not find Sharepoint Module. Installing" -ForegroundColor Green Install-Module -Name Microsoft.Online.SharePoint.PowerShell -Scope CurrentUser -force Import-Module Microsoft.Online.SharePoint.PowerShell } try{ Import-Module SkypeOnlineConnector -ErrorAction stop } catch { write-host "Could not find Skype For Business Module. Installing" -ForegroundColor Green Invoke-WebRequest "https://download.microsoft.com/download/2/0/5/2050B39B-4DA5-48E0-B768-583533B42C3B/SkypeOnlinePowerShell.Exe" -OutFile "$($env:TEMP)/SkypeOnlinePowerShell.exe" Start-Process "$($env:TEMP)/SkypeOnlinePowerShell.exe" -ArgumentList "/install /quiet" -wait Import-Module "C:\Program Files\Common Files\Skype for Business Online\Modules\SkypeOnlineConnector" } if(!$Credential){ $credential = Get-Credential } write-host "Connecting to AzureAD Module" -ForegroundColor Green Connect-AzureAD -Credential $credential write-host "Connecting to MSOL Services" -ForegroundColor Green Connect-msolservice -Credential $credential write-host "Connecting to Teams Services" -ForegroundColor Green Connect-MicrosoftTeams -Credential $credential write-host "Connecting to Exchange Online" -ForegroundColor Green $exchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $credential -Authentication "Basic" -AllowRedirection Import-PSSession $exchangeSession -DisableNameChecking write-host "Connecting to Security & Compliance Center" -ForegroundColor Green $SccSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://ps.compliance.protection.outlook.com/powershell-liveid/" -Credential $credential -Authentication "Basic" -AllowRedirection Import-PSSession $SccSession -Prefix cc Connect-MicrosoftTeams -Credential $Credential write-host "Getting initial domain for Sharepoint Online" $InitDomain = (Get-MsolDomain | Where-Object { $_.IsInitial -eq $true }).name $InitDomain = $InitDomain.Split(".") $SharepointDomain = $InitDomain[0] write-host "Connecting to $($SharePointDomain) Sharepoint" Connect-SPOService -Url "https://$($SharepointDomain)-admin.sharepoint.com" -credential $Credential $sfboSession = New-CsOnlineSession -Credential $credential Import-PSSession $sfboSession -AllowClobber }
And that’s it! the code above is a bit rough around the edges but that is because it is just a simple function I use for my own personal preference. To use it, all you have to do is type Connect-Office365 and there you go 🙂
If you encounter any issues or have questions, let me know! and as always, Be careful and happy PowerShelling!
How would this work with two form authentication?
Hi Chris, This blog does not support MFA, Please check my newer blogs for that. 🙂