If you are utilizing external, guest, or B2B users in your Office 365 or Azure environments, you may need a way to determine which objects haven't been logged in or used in a while.  Azure AD doesn't provide an easy way to view this information (really only having the refresh token time avaiable).  This script uses the RefreshTokensValidFromDateTime property from the user in conjunction with one of the following:

The additional value, specified in the the StaleAgeInDays parameter, is added to the one of the three previous tenant token times.  If the user's refresh token is older than that value, the user is "stale."

This will help you idenify when users last logged on and determine if you need to perform further actions on them.  You can see some more on this script at https://www.undocumented-features.com/2018/06/22/how-to-find-staleish-azure-b2b-guest-accounts/.

PowerShell
Edit|Remove
<# 
.SYNOPSIS 
Check for stale Azure, Guest, or B2B accounts 
 
.PARAMETER Credential 
Specify a credential to use when connecting to Azure AD. 
 
.PARAMETER InstallRequiredModules 
This script requires the Get-AzureADPolicy cmdlet, which is only available in 
the AzureADPreview module.  If the module is not installed or not available, 
you can use either the MaxInactiveTime parameter or use the default of 90 days 
 
.PARAMETER Logfile 
Log events for script execution. 
 
.PARAMETER MaxInactiveTime 
Use this parameter to specify the MaxInactiveTime value for your tenant. This is 
token refresh value.  The default value for Azure Active Directory is 90 days. 
You cannot view, add, or modify an Azure AD policy without the AzureADPreview 
module.  If you do not want to install the module, you can use the default for  
this parameter or specify your own value. 
 
.PARAMETER Output 
Specify the output file listing stale acccounts. 
 
.PARAMETER StaleAgeInDays 
Use this parameter to specify how many days past the refresh token an account 
can be inactive before marking it stale. 
 
.EXAMPLE 
.\Get-AzureADStaleUsers.ps1 -MaxInactiveTime 30 -StaleAgeInDays 180 
Return all objects that have not generated a refresh token in 210 days. 
#>