From 7ef5a575b0154dbc1d08c0d68fd605085db0ede2 Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:15:54 +0530 Subject: [PATCH] Auto Archive Inactive Teams in MS Teams --- .../AutoArchiveInactiveTeams.ps1 | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 Auto Archive Inactive Teams in MS Teams/AutoArchiveInactiveTeams.ps1 diff --git a/Auto Archive Inactive Teams in MS Teams/AutoArchiveInactiveTeams.ps1 b/Auto Archive Inactive Teams in MS Teams/AutoArchiveInactiveTeams.ps1 new file mode 100644 index 0000000..dbc09c9 --- /dev/null +++ b/Auto Archive Inactive Teams in MS Teams/AutoArchiveInactiveTeams.ps1 @@ -0,0 +1,206 @@ +<# +============================================================================================= +Name: Auto Archive Teams in Microsoft Teams +Version: 1.0 +Website: o365reports.com + +Script Highlights: +~~~~~~~~~~~~~~~~~ +1. Export all inactive teams along with their last activity date and inactive days. +2. Automatically archives inactive teams based on their inactivity period. +3. List all teams that have had no activity since creation. +4. Find teams that have been inactive for a specific period. +5. Automatically install the Microsoft Graph PowerShell module (if not installed already) upon your confirmation. +6. The script can be executed with an MFA-enabled account too. +7. Supports Certificate-based Authentication too. +8. The script is scheduler friendly.Sends password expiry notifications to users about upcoming password expiry. + + +For detailed Script execution: https://o365reports.com/2025/03/18/how-to-archive-inactive-teams-in-microsoft-teams/ +============================================================================================ +#> + +Param +( + [switch]$CreateSession, + [string]$TenantId, + [string]$ClientId, + [string]$CertificateThumbprint, + [int]$InactiveDays, + [Switch]$IncludeTeamsWithNoActivity, + [Switch]$ArchiveInactiveTeams, + [switch]$Force + +) +Function Connect_MgGraph +{ + #Check for module installation + $Module=Get-Module -Name Microsoft.Graph -ListAvailable + if($Module.count -eq 0) + { + Write-Host Microsoft Graph PowerShell SDK is not available -ForegroundColor yellow + $Confirm= Read-Host Are you sure you want to install module? [Y] Yes [N] No + if($Confirm -match "[yY]") + { + Write-host "Installing Microsoft Graph PowerShell module..." + Install-Module Microsoft.Graph -Repository PSGallery -Scope CurrentUser -AllowClobber -Force + } + else + { + Write-Host "Microsoft Graph PowerShell module is required to run this script. Please install module using Install-Module Microsoft.Graph cmdlet." + Exit + } + } + #Disconnect Existing MgGraph session + if($CreateSession.IsPresent) + { + Disconnect-MgGraph | Out-Null + } + + + Write-Host Connecting to Microsoft Graph... + if(($TenantId -ne "") -and ($ClientId -ne "") -and ($CertificateThumbprint -ne "")) + { + Connect-MgGraph -TenantId $TenantId -AppId $ClientId -CertificateThumbprint $CertificateThumbprint -NoWelcome + } + else + { + Connect-MgGraph -Scopes "Reports.Read.All","TeamSettings.ReadWrite.All" -NoWelcome + } +} +Connect_MgGraph + + +$Location=Get-Location +$TempFile="$Location\TeamsUsageReport_tempFile_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm-ss` tt).ToString()).csv" +$ExportCSV = "$Location\ArchiveInactiveTeams_Report_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm-ss` tt).ToString()).csv" +$Count=0 +$PrintedTeams=0 +$ArchiveStatus="-" + +if($ArchiveInactiveTeams.IsPresent) +{ + if($InactiveDays -eq "") + { + Write-Host `nInactive days is mandatory to archive inactive teams. -ForegroundColor Magenta + $InactiveDays= Read-host Enter Inactive days + } + #Getting consent for archiving inactive teams + if(!($Force.IsPresent)) + { + $Confirm= Read-Host `nDo you want to archive teams that are inactive for $InactiveDays days [Y] Yes [N] No + if($Confirm -notmatch "[yY]") + { + Write-host Exiting script... + Exit + } + } +} + +#Retrieving Teams usage report +Try +{ + Get-MgReportTeamActivityDetail -Period 'D7' -OutFile $TempFile +} +Catch +{ +Write-Host Unable to fetch teams usage report. Error occurred - $($Error[0].Exception.Message) -ForegroundColor Red +Exit +} + +Write-Host Generating inactive teams report... +#Import and process teams usage report +Import-Csv -Path $TempFile | foreach { + $TeamName=$_.'Team Name' + $Count++ + $Print=1 + Write-Progress -Activity "`n Processed teams: $Count - $EnterpriseAppName " + $TeamType=$_.'Team Type' + $LastActivityDate=$_.'Last Activity Date' + if($LastActivityDate -eq "") + { + $LastActivityDate = "Never Active" + $InactivePeriod = "-" + } + else + { + $InactivePeriod=(New-TimeSpan -Start $LastActivityDate).Days + } + $IsDeleted=$_.'Is Deleted' + $TeamId=$_.'Team Id' + + #Filter teams based on inactive days + if($InactivePeriod -ne "-") + { + if(($InactiveDays -ne "") -and ($InactiveDays -gt $InactivePeriod)) + { + $Print=0 + } + } + + #Filter for excluding never active teams + if(!($IncludeTeamsWithNoActivity.IsPresent) -and ($LastActivityDate -eq "Never Active")) + { + $Print=0 + } + + #Exclude deleted teams + if($IsDeleted -eq $true) + { + $Print=0 + } + + if(($ArchiveInactiveTeams.IsPresent) -and ($Print -eq 1)) + { + #Check if team is already archived + if((Get-mgteam -TeamId $TeamId).IsArchived) + { + $ArchiveStatus="Team is already archived" + } + else + { + Invoke-MgArchiveTeam -TeamId $TeamId -ShouldSetSpoSiteReadOnlyForMembers + if($?) + { + $ArchiveStatus="Successfully archived" + } + else + { + $ArchiveStatus="Error occurred" + } + } + } + + + #Export the output to CSV + if($Print -eq 1) + { + $PrintedTeams++ + $ExportResult=[PSCustomObject]@{'Team Name'=$TeamName;'Team Type'=$TeamType;'Last Activity Date'=$LastActivityDate;'Inactive Days'=$InactivePeriod;'Archive Status Log'=$ArchiveStatus} + $ExportResult | Export-Csv -Path $ExportCSV -Notype -Append + } +} + +#Remove/delete the reference file +Remove-Item $TempFile +Disconnect-MgGraph | Out-Null +Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green +Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline; Write-Host " to get access to 1800+ Microsoft 365 reports. ~~" -ForegroundColor Green `n`n + +#Open Output file after execution + if((Test-Path -Path $ExportCSV) -eq "True") + { + Write-Host `The exported report contains $PrintedTeams teams . + Write-Host `nDetailed report available in: -NoNewline -Foregroundcolor Yellow; Write-Host $ExportCSV + $Prompt = New-Object -ComObject wscript.shell + $UserInput = $Prompt.popup("Do you want to open output file?",` + 0,"Open Output File",4) + If ($UserInput -eq 6) + { + Invoke-Item "$ExportCSV" + } + } + else + { + Write-Host No teams found for the given criteria. + }