Connect-O365.ps1
<#PSScriptInfo
.VERSION 1.4 .GUID a3515355-c4b6-4ab8-8fa4-2150bbb88c96 .AUTHOR Jos Verlinde [MSFT] .COMPANYNAME Microsoft .COPYRIGHT .TAGS O365 RMS 'Exchange Online' 'SharePoint Online' 'Skype for Business' 'PnP-Powershell' 'Office 365' .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES MSOnline, Microsoft.Online.SharePoint.PowerShell, SkypeOnlineConnector, AADRM, OfficeDevPnP.PowerShell.V16.Commands .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES v1.4 Corrected bug wrt compliance search, remove prior created remote powershell sessions V1.3 Add dependend module information V1.2 add try-catch for SPO PNP Powershell, as that is less common V1.1 initial publication to scriptcenter #> <# .Synopsis Connect to Office 365 and get ready to admin anything. .DESCRIPTION Connect to Office 365 and most related services and get ready to admin anything. The commandlet support saving the credentials in a save manner so that it can be used in unattended files requirement and dependency is that the relevant modules are installed on the systenm the cmdlet is used on. -O365 -Azure Ad -SharePoint Online and PNP-PowerShell .EXAMPLE connect-O365 -Account 'admin@contoso.com' -SharePoint .EXAMPLE connect-O365 -Account 'admin@contoso.com' -SPO -EXO -Skype -Compliance -AADRM .EXAMPLE connect-O365 -Account 'admin@contoso.com' -Persist:$false .EXAMPLE connect-O365 -Account 'admin@contoso.com' #retrieve credentials for use in other cmdlets $Creds = Get-myCreds 'admin@contoso.com' #> [CmdletBinding()] [Alias("COL")] [OutputType([int])] Param ( # Accoutn to authenticate with [Parameter(Mandatory=$false,Position=0)] [string]$Account, # Save the account credentials for later use [Parameter(Mandatory=$false)] [switch]$Persist = $false, #Azure AD [Parameter(Mandatory=$false)] [Alias("AzureAD")] [switch]$AAD = $true, #Azure # [Parameter(Mandatory=$false)] # [switch]$Azure = $false, #Exchange Online [Parameter(Mandatory=$false)] [Alias("EXO")] [switch]$Exchange = $false, #Skype Online [Parameter(Mandatory=$false)] [Alias("CSO")] [switch]$Skype = $false, # [Parameter(Mandatory=$false)] [Alias("SPO")] [switch]$SharePoint = $false, #Compliance center [Parameter(Mandatory=$false)] [switch]$Compliance = $false, #Azure Rights Management [Parameter(Mandatory=$false)] [Alias("AZRMS")] [Alias("RMS")] [switch]$AADRM = $false ) function global:Store-myCreds ($username){ $Credential = Get-Credential -Credential $username MkDir "$env:USERPROFILE\Creds" -ea 0 | Out-Null $Credential.Password | ConvertFrom-SecureString | Set-Content $env:USERPROFILE\Creds\$USERNAME.txt return $Credential } function global:Get-myCreds ($UserName , [switch]$Persist){ $Store = "$env:USERPROFILE\creds\$USERNAME.txt" if (Test-Path $store ) { $Password = Get-Content $store | ConvertTo-SecureString $Credential = New-Object System.Management.Automation.PsCredential($UserName,$Password) return $Credential } else { if ($persist -and -not [string]::IsNullOrEmpty($UserName)) { $admincredentials = Store-myCreds $UserName return $admincredentials } else { return Get-Credential -Credential $username } } } $admincredentials = Get-myCreds $account -Persist:$Persist if ($admincredentials -eq $null){ throw "A valid Tenant Admin Account is required." } if($Close) { write-verbose "Closing open sessions for Exchange Online and Compliance Center" #Close Existing (remote Powershell Sessions) Get-PSSession -Name "Exchange Online" -ea SilentlyContinue | Remove-PSSession Get-PSSession -Name "Compliance Center" -ea SilentlyContinue | Remove-PSSession Get-PSSession -Name "Skype Online" -ea SilentlyContinue| Remove-PSSession } if ( $AAD) { write-verbose "Connecting to Azure AD" #Imports the installed Azure Active Directory module. Import-Module MSOnline -Verbose:$false if (-not (Get-Module MSOnline ) ) { Throw "Module not installed"} #Establishes Online Services connection to Office 365 Management Layer. Connect-MsolService -Credential $admincredentials } IF ($Skype ){ write-verbose "Connecting to Skype Online" #Imports the installed Skype for Business Online services module. Import-Module SkypeOnlineConnector -Verbose:$false -Force #Remove prior Session Get-PSSession -Name "Skype Online" -ea SilentlyContinue| Remove-PSSession #Create a Skype for Business Powershell session using defined credential. $SkypeSession = New-CsOnlineSession -Credential $admincredentials -Verbose:$false $SkypeSession.Name="Skype Online" #Imports Skype for Business session commands into your local Windows PowerShell session. Import-PSSession $lyncSession -AllowClobber -Verbose:$false } If ($SharePoint) { write-verbose "Connecting to SharePoint Online" if (!$AAD) { Throw "AAD Connection required" } else { #get tenant name for AAD Connection $tname= (Get-MsolDomain | ?{ $_.IsInitial -eq $true}).Name.Split(".")[0] } #Imports SharePoint Online session commands into your local Windows PowerShell session. Import-Module Microsoft.Online.Sharepoint.PowerShell -DisableNameChecking -Verbose:$false #lookup the tenant name based on the intial domain for the tenant Connect-SPOService -url https://$tname-admin.sharepoint.com -Credential $admincredentials try { write-verbose "Connecting to SharePoint Online PNP" import-Module OfficeDevPnP.PowerShell.V16.Commands -DisableNameChecking -Verbose:$false Connect-SPOnline -Credential $admincredentials -url "https://$tname.sharepoint.com" } catch {} } if ($Exchange ) { write-verbose "Connecting to Exchange Online" #Remove prior Session Get-PSSession -Name "Exchange Online" -ea SilentlyContinue| Remove-PSSession #Creates an Exchange Online session using defined credential. $ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $admincredentials -Authentication "Basic" -AllowRedirection $ExchangeSession.Name = "Exchange Online" #This imports the Office 365 session into your active Shell. Import-PSSession $ExchangeSession -AllowClobber -Verbose:$false } if ($Compliance) { write-verbose "Connecting to the Unified Compliance Center" #Remove prior Session Get-PSSession -Name "Compliance Center" -ea SilentlyContinue| Remove-PSSession $PSCompliance = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.compliance.protection.outlook.com/powershell-liveid/ -Credential $AdminCredentials -Authentication Basic -AllowRedirection $PSCompliance.Name = "Compliance Center" Import-PSSession $PSCompliance -AllowClobber -Verbose:$false } If ($AADRM) { write-verbose "Connecting to Azure Rights Management" #Azure RMS import-module AADRM -Verbose:$false Connect-AadrmService -Credential $admincredentials } <# if ($false) { #Azure MFA $auth = New-Object -TypeName Microsoft.Online.Administration.StrongAuthenticationRequirement $auth.RelyingParty = "*" #any devices issued for a user before this date would require MFA setup. Normally, we would select the date of running the command. $auth.RememberDevicesNotIssuedBefore = (Get-Date) $auth.State = "Enabled" Set-MsolUser -UserPrincipalName jos@atticware.com -StrongAuthenticationRequirements $auth -MobilePhone +31651446844 $u = Get-MsolUser -UserPrincipalName jos@atticware.com $u | fl * $u.StrongAuthenticationPhoneAppDetails | FL * $u.StrongAuthenticationRequirements| FL * $u.StrongAuthenticationUserDetails| FL * $u.StrongAuthenticationProofupTime| FL * #MFA - ADFS server implements MFS - requires ADFS and on-prem MFA Server Set-MsolDomainFederationSettings -DomainName atticware.com -SupportsMFA $true get-MsolDomainFederationSettings -DomainName atticware.com } #> |