Filter Already Archived Teams

Copper Contributor

Hi,

 

I have a script to add MS groups that are teams enabled to a SP list.

 

However it's adding items that are already archived, I only want it to add items that haven't been archived?

 

I am getting the usage records and checking if that group ID has an ID also in Teams so I know that it's a teams enabled group or not. 

 

I think there is a isArchived parameter in Get-Team that could be used but I don't know how to write the code?

 

 

# Check and validate each M365 Group
#
#####
ForEach ($UsageRecord in $UsageData) {
	Write-Output "Proceed list entry $($Counter) from $($Count)..."
	if ($UsageRecord.'Is Deleted' -eq "True") {
		$Counter++
		continue
	}

   # Get Group ID and validate if it is Teams enabled
	$GroupId = $UsageRecord."Group Id"
	$TeamsEnabled = $AllTeams | Where-Object {$_.Id -eq $GroupId}
	if (!$TeamsEnabled)  {
		Write-Output "M365 Group with Id $($GroupId) is not Teams enabled- skip this record"
		continue
	}

    $Archived = $AllTeams | Where-Object ($_.Id -eq $GroupId ) 

 

 

Thanks,

Richard

 

3 Replies
That would depend on how you've populated those variables. Share the full script if possible.

Hi @VasilMichev Below is the full script. Any help most appreciated. Thanks  

 

# Script gets M365 Groups activity details and filters based on last activity date
# for inactive Teams.
# Inactive M365 groups are written to a SharePoint Online list
#
# created by Thorsten Pickhan
# Initial script created on 01.12.2022 (12/01/2022)
# 20231004 - Rewrite script to Managed Identity mode
# 20240415 - Filter M365 groups to Teams enabled only
#
# Version 1.2

# PowerShell 7.2 is required
# PNP PowerShell is required in Version
# Microsoft Graph PowerShell in version 2.6.1 required
# Microsoft.Graph.Authtentication
# Microsoft.Graph.Reports
# Microsoft.Graph.Teams

# https://mmsharepoint.wordpress.com/2023/05/04/authentication-in-azure-automation-with-managed-identity-on-sharepoint-and-microsoft-graph/
# https://thesysadminchannel.com/graph-api-using-a-managed-identity-in-an-automation-runbook/

# Should M365 Report data be concealed?
# more information can be found here
# https://learn.microsoft.com/en-us/microsoft-365/troubleshoot/miscellaneous/reports-show-anonymous-user-name
#
#####
$DisConcealedDisplayName = "True"

try {
    # Logging in to Azure.
    Connect-AzAccount -Identity | Out-Null
    # Get token and connect to MgGraph
    Connect-MgGraph -Identity -NoWelcome
} catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

# Function to disable or enable concealed M365 Reports
# Attention: Graph API endpoint is still beta (Oct 2023)
#
#####
function SetM365ReportSettings ([bool]$action){
    Write-Output "Setting M365 Report settings..."
    $HeaderApp = @{
        Authorization = "$((Get-AzAccessToken -ResourceTypeName MSGraph).type) $((Get-AzAccessToken -ResourceTypeName MSGraph).token)"
    }

    # GraphAPI endpoint for report settings
    #
    ###

    $GraphApiUrl = "https://graph.microsoft.com/beta/admin/reportSettings"

    # Get current state for DisplayConcealedNames in M365 Usage Reports
    #
    ###
    $FeatureEnabled = $action
    $ReportSettingsGet = Invoke-RestMethod -Headers $HeaderApp -Uri $GraphApiUrl -ContentType 'application/json' -Method Get
    $CurrentStatus = $ReportSettingsGet.displayConcealedNames
    Write-Output "Current State: $($CurrentStatus)"
    Write-Output "Requested State: $($FeatureEnabled)"

    if ($CurrentStatus -ne $FeatureEnabled) {
        # if DisplayConcealedNames is false, enable it
        # else disable it
        #
        ###
        
        if ($FeatureEnabled -eq $true) {
            #Write-Output "Enabling displayConcealedNames to hidde display Name from M365 Groups, Owner and member"
            $GraphApiBody = "{
                ""displayConcealedNames"": ""true""
            }"
            $ReportSettingsSet = Invoke-RestMethod -Headers $HeaderApp -Uri $GraphApiUrl -Body $GraphApiBody -ContentType 'application/json' -Method Patch
            $ReportSettingsGet = Invoke-RestMethod -Headers $HeaderApp -Uri $GraphApiUrl -ContentType 'application/json' -Method Get
            #Write-Output "Setting after update: $($ReportSettingsGet.displayConcealedNames)"
        }

        if ($FeatureEnabled -eq $false) {
            #Write-Output "Disabling displayConcealedNames to display Name from M365 Groups, Owner and member"
            $GraphApiBody = "{
                ""displayConcealedNames"": ""false""
            }"
            $ReportSettingsSet = Invoke-RestMethod -Headers $HeaderApp -Uri $GraphApiUrl -Body $GraphApiBody -ContentType 'application/json' -Method Patch
            $ReportSettingsGet = Invoke-RestMethod -Headers $HeaderApp -Uri $GraphApiUrl -ContentType 'application/json' -Method Get
            #Write-Output "Setting after update: $($ReportSettingsGet.displayConcealedNames)"

        }
    }
    else {
        Write-Output "no change required"
    }

}

# Define the SharePoint teamsite Url where the list is located - please edit
#
#####
$RootURL = "https://xxxxx.sharepoint.com/teams/TeamsAutomation/"

# Define the SharePoint Online List Id - please edit
#
#####
$SharePointList = "Lists/InactiveTeams"


# Connect to SharePoint Online
#
#####
Write-Output "Start connecting to SharePoint Online.."
Connect-PnPOnline -ManagedIdentity -Url $RootUrl | Out-Null
$RootConnection = Get-PnPConnection

if ($RootConnection) {
    Write-Output "SharePoint Online succesfully connected!"
    }
else {
    Write-Output "SharePoint Online connection failed!"
    Write-Output "Script will stop now"
    break
}

# Define the period of report [D7, D30, D90, D180]
#
#####
$PeriodOfReport = "D30"

# Define the CSV file path for usage report data
#
#####
$CsvFileName = ".\report.csv"

# If Concelead Reports should be disbaled, run function
#
#####
if ($DisConcealedDisplayName -eq "true") {
    SetM365ReportSettings -action $False
}

try {
    $TempReports = Get-MgReportOffice365GroupActivityDetail -Period $PeriodOfReport -OutFile $CsvFileName -ErrorAction Stop
}
catch {
    # If Concelead Reports should be disbaled, run function to reeanble it
    #
    #####
    if ($DisConcealedDisplayName -eq "true") {
        SetM365ReportSettings -action $True
    }
    Write-Error -Message $_.Exception
}

# If Concelead Report should be disbaled, run function to re-eanble it
#
#####
if ($DisConcealedDisplayName -eq "true") {
    SetM365ReportSettings -action $True
}

# Import M365 Usage report data
#
#####
$UsageData = Import-Csv $CsvFileName

$Count = $UsageData.count
$Counter = 1

# Set check date to compare with the last activity date
# Checkdate is set to today minus 30 days
# please customize to fit your business needs
#
#####
$CheckDate = (Get-Date).adddays(-30)

# Get all Teams enabled M365 Groups
#
# Filter Usage Data on Teams enabled M365 groups only
# Only these groups can be archived
#
#####
$AllTeams = Get-MgTeam

# Check and validate each M365 Group
#
#####
ForEach ($UsageRecord in $UsageData) {
	Write-Output "Proceed list entry $($Counter) from $($Count)..."
	if ($UsageRecord.'Is Deleted' -eq "True") {
		$Counter++
		continue
	}

   # Get Group ID and validate if it is Teams enabled
	$GroupId = $UsageRecord."Group Id"
	$TeamsEnabled = $AllTeams | Where-Object {$_.Id -eq $GroupId}
	if (!$TeamsEnabled) {
		Write-Output "M365 Group with Id $($GroupId) is not Teams enabled- skip this record"
		continue
	}
    # Set columne values for SharePoint list entry
	$ReportRefreshDate = $UsageRecord."Report Refresh Date"
	$GroupDisplayName = $UsageRecord."Group Display Name"
	$IsDeleted = $UsageRecord."Is Deleted"
	$OwnerPrincipalName = $UsageRecord."Owner Principal Name"
	$LastActivityDate = $UsageRecord."Last Activity Date"
	$GroupType = $UsageRecord."Group Type"
	$MemberCount = $UsageRecord."Member Count"
	$ExternalMemberCount = $UsageRecord."External Member Count"
	$ExchangeReceivedEmailCount = $UsageRecord."Exchange Received Email Count"
	$SharePointActiveFileCount = $UsageRecord."SharePoint Active File Count"
	$YammerPostedMessageCount  = $UsageRecord."Yammer Posted Message Count"
	$YammerReadMessageCount = $UsageRecord."Yammer Read Message Count"
	$YammerLikedMessageCount = $UsageRecord."Yammer Liked Message Count"
	$ExchangeMailboxTotalItemCount = $UsageRecord."Exchange Mailbox Total Item Count"
	$ExchangeMailboxStorageUsedByte = $UsageRecord."Exchange Mailbox Storage Used (Byte)"
	$SharePointTotalFileCount = $UsageRecord."SharePoint Total File Count"
	$SharePointSiteStorageUsedByte = $UsageRecord."SharePoint Site Storage Used (Byte)"
	$ReportPeriod = $UsageRecord."Report Period"

    # Check if there is a last activity date in CSV
	if ($LastActivityDate) {
		$LastActiveDate = Get-Date $LastActivityDate
	}
	else {
		$LastActiveDate = Get-Date "01.01.1900"
		try {
			# No activity Teams should be archived
            Write-Output "Adding $($GroupDisplayName) to the list..."
			$AddSPListPerm = Add-PnPListItem -List $SharePointList -Values @{"ReportRefreshDate" = $ReportRefreshDate; "GroupDisplayName" = $GroupDisplayName; "Title" = $GroupDisplayName; "IsDeleted" = $IsDeleted; "GroupOwners" = $OwnerPrincipalName; "LastActivityDate" = $LastActiveDate; "GroupType" = $GroupType; "MemberCount" = $MemberCount; "ExternalMemberCount" = $ExternalMemberCount; "ExchangeReceivedEmailCount" = $ExchangeReceivedEmailCount; "SharePointActiveFileCount" = $SharePointActiveFileCount; "ExchangeMailboxTotalItemCount" = $ExchangeMailboxTotalItemCount; "ExchangeMailboxStorageUsedByte" = $ExchangeMailboxStorageUsedByte; "SharePointSiteStorageUsedByte" = $SharePointSiteStorageUsedByte; "GroupId" = $GroupId; "ReportPeriod" = $ReportPeriod; "ShouldBeArchived" ="True"; "IsArchived" ="False"; "ApprovedToArchive" ="False" } -Connection $RootConnection -ErrorAction Stop
		}
		catch {
			Write-Output $LastActiveDate
			Write-Output "Could not add entry to SharePoint List - $($_.Exception.Message)"
			break
		}
		$Counter++
		continue   
	}

    # if Last Activity date exists, check M365 group activity over the last 30 days
	if ($LastActiveDate -lt $CheckDate){
		try {
			# No activity -> Teams should be archived
            Write-Output "Adding $($GroupDisplayName) to the list..."
			$AddSPListPerm = Add-PnPListItem -List $SharePointList -Values @{"ReportRefreshDate" = $ReportRefreshDate; "GroupDisplayName" = $GroupDisplayName; "Title" = $GroupDisplayName; "IsDeleted" = $IsDeleted; "GroupOwners" = $OwnerPrincipalName; "LastActivityDate" = $LastActiveDate; "GroupType" = $GroupType; "MemberCount" = $MemberCount; "ExternalMemberCount" = $ExternalMemberCount; "ExchangeReceivedEmailCount" = $ExchangeReceivedEmailCount; "SharePointActiveFileCount" = $SharePointActiveFileCount; "ExchangeMailboxTotalItemCount" = $ExchangeMailboxTotalItemCount; "ExchangeMailboxStorageUsedByte" = $ExchangeMailboxStorageUsedByte; "SharePointSiteStorageUsedByte" = $SharePointSiteStorageUsedByte; "GroupId" = $GroupId; "ReportPeriod" = $ReportPeriod; "ShouldBeArchived" ="True"; "IsArchived" ="False"; "ApprovedToArchive" ="False" } -Connection $RootConnection -ErrorAction Stop
		}
		catch {
			Write-Output $LastActiveDate
			Write-Output $GroupDisplayName
			Write-Output "Could not add entry to SharePoint List - $($_.Exception.Message)"
			break
		}
	}

	$Counter++
}

 

Replace line 182 with:

Get-MgTeam -All | ? {!$_.IsArchived}