diff --git a/source/Private/Connect-M365Suite.ps1 b/source/Private/Connect-M365Suite.ps1 index 04fe394..ee7b7c4 100644 --- a/source/Private/Connect-M365Suite.ps1 +++ b/source/Private/Connect-M365Suite.ps1 @@ -2,19 +2,31 @@ function Connect-M365Suite { [OutputType([void])] [CmdletBinding()] param ( - [Parameter(Mandatory=$false)] + [Parameter(Mandatory = $false)] [string]$TenantAdminUrl, [Parameter(Mandatory)] - [string[]]$RequiredConnections + [string[]]$RequiredConnections, + + [Parameter(Mandatory = $false)] + [switch]$SkipConfirmation ) $VerbosePreference = "SilentlyContinue" + $tenantInfo = @() + $connectedServices = @() try { if ($RequiredConnections -contains "AzureAD" -or $RequiredConnections -contains "AzureAD | EXO" -or $RequiredConnections -contains "AzureAD | EXO | Microsoft Graph") { Write-Host "Connecting to Azure Active Directory..." -ForegroundColor Cyan Connect-AzureAD | Out-Null + $tenantDetails = Get-AzureADTenantDetail + $tenantInfo += [PSCustomObject]@{ + Service = "Azure Active Directory" + TenantName = $tenantDetails.DisplayName + TenantID = $tenantDetails.ObjectId + } + $connectedServices += "AzureAD" Write-Host "Successfully connected to Azure Active Directory." -ForegroundColor Green } @@ -22,11 +34,25 @@ function Connect-M365Suite { Write-Host "Connecting to Microsoft Graph with scopes: Directory.Read.All, Domain.Read.All, Policy.Read.All, Organization.Read.All" -ForegroundColor Cyan try { Connect-MgGraph -Scopes "Directory.Read.All", "Domain.Read.All", "Policy.Read.All", "Organization.Read.All" -NoWelcome | Out-Null + $graphOrgDetails = Get-MgOrganization + $tenantInfo += [PSCustomObject]@{ + Service = "Microsoft Graph" + TenantName = $graphOrgDetails.DisplayName + TenantID = $graphOrgDetails.Id + } + $connectedServices += "Microsoft Graph" Write-Host "Successfully connected to Microsoft Graph with specified scopes." -ForegroundColor Green } catch { Write-Host "Failed to connect to MgGraph, attempting device auth." -ForegroundColor Yellow Connect-MgGraph -Scopes "Directory.Read.All", "Domain.Read.All", "Policy.Read.All", "Organization.Read.All" -UseDeviceCode -NoWelcome | Out-Null + $graphOrgDetails = Get-MgOrganization + $tenantInfo += [PSCustomObject]@{ + Service = "Microsoft Graph" + TenantName = $graphOrgDetails.DisplayName + TenantID = $graphOrgDetails.Id + } + $connectedServices += "Microsoft Graph" Write-Host "Successfully connected to Microsoft Graph with specified scopes." -ForegroundColor Green } } @@ -34,20 +60,58 @@ function Connect-M365Suite { if ($RequiredConnections -contains "EXO" -or $RequiredConnections -contains "AzureAD | EXO" -or $RequiredConnections -contains "Microsoft Teams | EXO" -or $RequiredConnections -contains "EXO | Microsoft Graph") { Write-Host "Connecting to Exchange Online..." -ForegroundColor Cyan Connect-ExchangeOnline | Out-Null + $exoTenant = (Get-OrganizationConfig).Identity + $tenantInfo += [PSCustomObject]@{ + Service = "Exchange Online" + TenantName = $exoTenant + TenantID = "N/A" + } + $connectedServices += "EXO" Write-Host "Successfully connected to Exchange Online." -ForegroundColor Green } if ($RequiredConnections -contains "SPO") { Write-Host "Connecting to SharePoint Online..." -ForegroundColor Cyan Connect-SPOService -Url $TenantAdminUrl | Out-Null + $spoContext = Get-SPOSite -Limit 1 + $tenantInfo += [PSCustomObject]@{ + Service = "SharePoint Online" + TenantName = $spoContext.Url + TenantID = $spoContext.GroupId + } + $connectedServices += "SPO" Write-Host "Successfully connected to SharePoint Online." -ForegroundColor Green } if ($RequiredConnections -contains "Microsoft Teams" -or $RequiredConnections -contains "Microsoft Teams | EXO") { Write-Host "Connecting to Microsoft Teams..." -ForegroundColor Cyan Connect-MicrosoftTeams | Out-Null + $teamsTenantDetails = Get-CsTenant + $tenantInfo += [PSCustomObject]@{ + Service = "Microsoft Teams" + TenantName = $teamsTenantDetails.DisplayName + TenantID = $teamsTenantDetails.TenantId + } + $connectedServices += "Microsoft Teams" Write-Host "Successfully connected to Microsoft Teams." -ForegroundColor Green } + + # Display tenant information and confirm with the user + if (-not $SkipConfirmation) { + Write-Host "Connected to the following tenants:" -ForegroundColor Yellow + foreach ($tenant in $tenantInfo) { + Write-Host "Service: $($tenant.Service)" -ForegroundColor Cyan + Write-Host "Tenant Name: $($tenant.TenantName)" -ForegroundColor Green + #Write-Host "Tenant ID: $($tenant.TenantID)" + Write-Host "" + } + $confirmation = Read-Host "Do you want to proceed with these connections? (Y/N)" + if ($confirmation -notlike 'Y') { + Write-Host "Connection setup aborted by user." -ForegroundColor Red + Disconnect-M365Suite -RequiredConnections $connectedServices + throw "User aborted connection setup." + } + } } catch { $VerbosePreference = "Continue" diff --git a/source/Public/Invoke-M365SecurityAudit.ps1 b/source/Public/Invoke-M365SecurityAudit.ps1 index cfc5aed..0596078 100644 --- a/source/Public/Invoke-M365SecurityAudit.ps1 +++ b/source/Public/Invoke-M365SecurityAudit.ps1 @@ -240,11 +240,18 @@ function Invoke-M365SecurityAudit { $currentTestIndex = 0 # Establishing connections if required - $actualUniqueConnections = Get-UniqueConnection -Connections $requiredConnections - if (!($DoNotConnect) -and $PSCmdlet.ShouldProcess("Establish connections to Microsoft 365 services: $($actualUniqueConnections -join ', ')", "Connect")) { - Write-Information "Establishing connections to Microsoft 365 services: $($actualUniqueConnections -join ', ')" -InformationAction Continue - Connect-M365Suite -TenantAdminUrl $TenantAdminUrl -RequiredConnections $requiredConnections + try { + $actualUniqueConnections = Get-UniqueConnection -Connections $requiredConnections + if (!($DoNotConnect) -and $PSCmdlet.ShouldProcess("Establish connections to Microsoft 365 services: $($actualUniqueConnections -join ', ')", "Connect")) { + Write-Information "Establishing connections to Microsoft 365 services: $($actualUniqueConnections -join ', ')" -InformationAction Continue + Connect-M365Suite -TenantAdminUrl $TenantAdminUrl -RequiredConnections $requiredConnections + } } + catch { + Write-Host "Execution aborted: $_" -ForegroundColor Red + break + } + Write-Information "A total of $($totalTests) tests were selected to run..." -InformationAction Continue