powershellservice-principal

I want to create an output with all the Azure AD applications, which returns a)listing of all b) listing of expiring apps


This is what I have so far, but the $expirationlist doesn't return back a listing of ALL the applications expiring with the $expirationlist variable.

$date= get-date
$expirationdate= $date.AddDays(30)
$ADApplications = Get-AzADApplication 
$result = foreach ($application in $ADApplications)
{
$credentials = Get-AzADAppCredential -ApplicationId 
$application.ApplicationId 
$StartDate = $credentials.StartDate
$EndDate = $credentials.EndDate



[PSCustomObject]@{
    ApplicationName = $application.DisplayName
    ApplicationID = $application.ApplicationId
    ObjectID = $application.ObjectId
    CreationDate = $StartDate
    ExpirationDate = $EndDate
   

}
if($EndDate -lt $expirationdate)
   {
        $expirationlist = [PSCustomObject]@{
       ApplicationName = $application.DisplayName
       ApplicationID = $application.ApplicationId
        ObjectID = $application.ObjectId
        CreationDate = $StartDate
        ExpirationDate = $EndDate  
        }
    }
}
$expirationlist

Solution

  • The error comes from casting a PSCustomObject with a $null key:

    Example:

    PS /> [pscustomobject]@{ $null = 'asd' }
    A null key is not allowed in a hash literal.
    At line:1 char:19
    + [pscustomobject]@{ $null = 'asd' }
    +                    ~~~~~
        + CategoryInfo          : InvalidOperation: (System.Collecti...deredDictionary:OrderedDictionary) [], RuntimeException
        + FullyQualifiedErrorId : InvalidNullKey
    

    Since these variables are not defined they are basically null:

    $ApplicationName, $ApplicationID, $ObjectID, etc.

    Try with this, it should work, I also added a minor efficiency improvement:

    $ADApplications = Get-AzADApplication
    $result = foreach ($application in $ADApplications)
    {
        $credentials = Get-AzADAppCredential -ApplicationId $application.ApplicationId 
        
        foreach($credential in $credentials)
        {
            $StartDate = $credential.StartDate
            $EndDate = $credential.EndDate
        
            [PSCustomObject]@{
                ApplicationName = $application.DisplayName
                ApplicationID = $application.ApplicationId
                ObjectID = $application.ObjectId
                CreationDate = $StartDate
                ExpirationDate = $EndDate
            }
        }
    }
    
    $result | Where-Object {[datetime]$_.EndDate -lt [datetime]::Now.AddDays(30)}