Skip to content

Validate Microsoft Graph Application Credentials and Owners with Sign-In Data

Validate Microsoft Graph Application Credentials and Owners

Section titled “Validate Microsoft Graph Application Credentials and Owners”

This script connects to Microsoft Graph using the scopes 'Application.ReadWrite.All' and 'AuditLog.Read.All', retrieves all applications in the tenant, and checks the status of each application’s credentials (passwords and certificates). It determines whether these credentials are valid by comparing their expiration dates to the current date. The script also retrieves the application’s owner details and checks for any recent sign-in activity. All the information is logged into a custom object, including details like secret and certificate validity, owner, and last sign-in date.


Ideal for: Azure AD administrators managing application lifecycle and security

FeatureCapabilityBusiness Value
Credential ValidationChecks secret and certificate expiration datesPrevents application authentication failures
Owner IdentificationRetrieves application owner informationEnsures proper accountability
Sign-In TrackingMonitors recent application activityIdentifies unused or compromised apps
Comprehensive ReportingStructured output for all application dataSimplifies audit and compliance processes

Terminal window
Connect-MgGraph -Scopes 'Application.ReadWrite.All','AuditLog.Read.All'
$Messages = @{
    DurationNotice = @{
        Info = @(
            'The operation is running and will take longer the more applications the tenant has...'
            'Please wait...'
        ) -join ' '
    }
}
Write-Host $Messages.DurationNotice.Info -ForegroundColor yellow
$Applications = Get-MgApplication -All
$Logs = @()
foreach ($App in $Applications) {
    $AppName = $App.DisplayName
    $AppID   = $App.Id
    $ApplID  = $App.AppId
    Write-Output "Getting $AppName Data..."
    $AppCreds = $Applications | Where-Object Id -EQ $AppID |
        Select-Object PasswordCredentials, KeyCredentials
    $now = Get-Date
    # Secret validation
    $SecretValid = $false
    $Secrets = $AppCreds.PasswordCredentials
    if ($Secrets) {
        $SecretEndDate = $Secrets | Sort-Object EndDateTime -Descending -Top 1 | Select-Object -ExpandProperty EndDateTime
        if($SecretEndDate -gt $now){
            $SecretValid = $true
        }
    }
    # Certificate validation
    $CertValid = $false
    $Certs = $AppCreds.KeyCredentials
    if($Certs){
        $CertEndDate = $Certs | Sort-Object EndDateTime -Descending -Top 1 | Select-Object -ExpandProperty EndDateTime
        if ($CertEndDate -gt $now) {
            $CertValid = $true
        }
    }
    # Get Owner
    Write-Output "Getting Owner Info"
    $Owner    = Get-MgApplicationOwner -ApplicationId $App.Id
    $Username = $Owner.AdditionalProperties.userPrincipalName -join ';'
    $OwnerID  = $Owner.Id -join ';'
    if ($null -eq $Owner.AdditionalProperties.userPrincipalName) {
        $Username = @(
            $Owner.AdditionalProperties.displayName
            '**<This is an Application>**'
        ) -join ' '
    }
    if ($null -eq $Owner.AdditionalProperties.displayName) {
        $Username = '<<No Owner>>'
    }
    Write-Output "Getting SignIn Info"
    $Signin = $false
    $SigninDate = Get-MgAuditLogSignIn -Filter "appId eq '$ApplID'" -Top 1 | Select-Object -ExpandProperty CreatedDateTime
    if($SigninDate){
        $Signin = $true
    }
    ############################################
    $Logs += [PSCustomObject]@{
        'ApplicationName'        = $AppName
        'ApplicationID'          = $ApplID
        'Secret Valid'           = $SecretValid
        'Secret End Date'        = $SecretEndDate
        'Certificate Valid'      = $CertValid
        'Certificate End Date'   = $CertEndDate
        'Owner'                  = $Username
        'Owner_ObjectID'         = $OwnerID
        'Signin Present'         = $Signin
        'Last Sign-In Date'      = $SigninDate
    }
    ############################################
}
$Logs

ComponentRequirementPurpose
Microsoft Graph ModuleMicrosoft.GraphAPI connectivity
Application PermissionsApplication.ReadWrite.All, AuditLog.Read.AllAccess application and audit data
Admin RightsGlobal Administrator or Application AdministratorSufficient permissions for all operations

Validation TypeMethodSuccess Criteria
Secret ValidityCompare end date with current dateEnd date > current date
Certificate ValidityCompare end date with current dateEnd date > current date
Owner VerificationRetrieve owner object propertiesValid owner object exists
Sign-In ActivityQuery audit logs for recent activitySign-in record exists

FieldDescriptionBusiness Value
ApplicationNameDisplay name of the applicationEasy identification
ApplicationIDUnique application identifierAPI reference
Secret ValidBoolean indicating secret statusQuick health check
Certificate ValidBoolean indicating certificate statusQuick health check
OwnerOwner display name or UPNAccountability tracking
Signin PresentBoolean for recent activityUsage monitoring
Last Sign-In DateTimestamp of last authenticationActivity tracking

  • Review all application credentials
  • Identify expired or soon-to-expire credentials
  • Ensure proper owner assignment
  • Detect unused applications
  • Monitor for suspicious sign-in patterns
  • Validate credential security posture
  • Generate application inventory reports
  • Document credential status for audits
  • Track application ownership changes

Key Takeaway: This script provides comprehensive visibility into application credential health, ownership, and usage patterns, enabling proactive security management and compliance reporting for Azure AD applications.