Skip to content

Script to Count and Export Users from Azure AD to CSV with Last Sign-In Information

Azure AD User Export with Sign-In Activity Script

Section titled “Azure AD User Export with Sign-In Activity Script”

This script connects to Microsoft Graph to retrieve comprehensive user data from Azure AD, including critical sign-in activity information. It counts total users and exports detailed properties such as UserPrincipalName, account status, user type, and last sign-in timestamps to a CSV file for security monitoring and compliance reporting.


FeatureCapabilityBusiness Value
User EnumerationRetrieves all users in the tenantComplete user inventory
Activity TrackingCaptures last sign-in dates and timesIdentifies inactive accounts
Account StatusReports AccountEnabled and UserTypeSecurity posture assessment
Beta API AccessUses Graph Beta for sign-in dataAccess to advanced user properties

Ideal for: Security administrators, compliance officers, and IT auditors

Prerequisites:

  • Microsoft Graph PowerShell SDK installed
  • Global Administrator or User Administrator role
  • Microsoft Graph Beta module for sign-in activity
  • AuditLog.Read.All permissions for activity data

Terminal window
# Prompt the user to enter Tenant Id or Primary domain
$TenantId = Read-Host "Please enter Tenant Id or Primary domain"
# Define the scopes needed for the Microsoft Graph API permissions
$Scopes = "User.Read.All,AuditLog.Read.All,Directory.Read.All"
# Connect to Microsoft Graph
Connect-MgGraph -Scopes $Scopes
# Count users
$users = Get-MgUser -All
$userCount = $users.Count
Write-Host "Total number of users: $userCount"
# Define the output path
$OutputPath = "C:\temp\UsersExport.csv"
# Check if the directory exists
if (!(Test-Path -Path (Split-Path -Path $OutputPath -Parent))) {
Write-Host "The directory does not exist. Please check the output path and try again."
return
}
# Export users with specified properties
try {
Get-MgBetaUser -All -Property "Id, UserPrincipalName, AccountEnabled, userType, SignInActivity, SignInSessionsValidFromDateTime" |
Select-Object Id, UserPrincipalName, AccountEnabled, userType, SignInSessionsValidFromDateTime,
@{Name="LastNonInteractiveSignInDateTime"; Expression={$_.SignInActivity.LastNonInteractiveSignInDateTime}},
@{Name="LastSignInDateTime"; Expression={$_.SignInActivity.LastSignInDateTime}} |
Export-Csv -Path $OutputPath -NoTypeInformation
Write-Host "Export successful. The file is located at $OutputPath"
} catch {
Write-Host "Failed to export users. Please check your permissions and try again."
}

The generated CSV contains the following columns:

ColumnDescription
IdUnique user identifier
UserPrincipalNameUser’s sign-in address (UPN)
AccountEnabledAccount status (True/False)
userTypeUser type (Member/Guest)
SignInSessionsValidFromDateTimeWhen sign-in sessions became valid
LastNonInteractiveSignInDateTimeLast non-interactive sign-in timestamp
LastSignInDateTimeLast interactive sign-in timestamp

  • Identify users with no recent sign-in activity
  • Flag potentially abandoned accounts
  • Support account cleanup initiatives
  • Track user authentication frequency
  • Detect unusual sign-in patterns
  • Monitor guest user activity

  • Generate user activity reports
  • Identify dormant accounts for review
  • Assess overall tenant security posture
  • Document user access patterns
  • Support regulatory audit requirements
  • Maintain user lifecycle records
  • Identify inactive licensed users
  • Optimize Microsoft 365 license allocation
  • Reduce unnecessary subscription costs

Key Takeaway: This script provides essential visibility into user activity patterns, enabling proactive security management and license optimization through comprehensive sign-in data analysis.