Skip to Content

PowerShell Function: Get-UnusedPowerApps

Get-UnusedPowerApps

Overview

Get-UnusedPowerApps is a PowerShell function that helps Power Platform administrators identify unused Power Apps across their environments. It identifies apps that either have no assigned users or haven't been modified for a specified period (default: 180 days).

This tool is particularly valuable for:

  • Environment cleanup initiatives
  • License optimization efforts
  • Security reviews
  • Governance processes
  • Application lifecycle management

Prerequisites

  • PowerShell 5.1 or higher
  • Microsoft.PowerApps.Administration.PowerShell module installed
  • Power Platform Administrator permissions
  • Active authenticated session (via Add-PowerAppsAccount)

Installation

Option 1: Import as a Module

  1. Save the script as PowerPlatformTools.psm1
  2. Import it into your PowerShell session:
Import-Module .\PowerPlatformTools.psm1

Option 2: Dot-Source the Function

. .\Get-UnusedPowerApps.ps1

Syntax

Get-UnusedPowerApps 
    -EnvironmentName <String> 
    [-UnusedDays <Int32>] 
    [-IncludeAppDetails] 
    [-ExportFormat <String>] 
    [-ExportPath <String>]

Parameters

Parameter Type Required Default Description
EnvironmentName String Yes - The ID of the Power Platform environment to check. Can be piped in from other commands.
UnusedDays Int32 No 180 Number of days since last modification to consider an app as "unused".
IncludeAppDetails Switch No False Include additional app details in the results, like app type, description, and creation info.
ExportFormat String No "None" Format for exporting results. Options are: "None", "CSV", or "JSON".
ExportPath String No Auto-generated Path to save the export file. If not specified, a default path with timestamp is used.

Output

The function returns an array of PowerShell objects with the following properties for each unused app:

Property Description
AppName Display name of the app
AppId Unique identifier of the app
EnvironmentName Name/display name of the environment
EnvironmentId ID of the environment
CreatedTime When the app was created
LastModifiedTime When the app was last modified
DaysSinceLastModified Number of days since the app was last modified
HasUsers Whether the app has any assigned users
UserCount Number of assigned users
UsedRecently Whether the app has been modified within the specified unused days threshold
Owner Display name of the app owner
OwnerEmail Email address of the app owner
UnusedReason Reason why the app is considered unused ("No Users Assigned" or "Not Used in Last X Days")

When IncludeAppDetails is specified, additional properties include:

  • AppType
  • Description
  • CreatedBy
  • CreatedByEmail
  • IsHeroApp
  • IsFeaturedApp

Examples

Example 1: Find unused apps in a specific environment

Get-UnusedPowerApps -EnvironmentName "12345678-1234-1234-1234-1234567890ab"

Returns all unused Power Apps in the specified environment.

Example 2: Find apps unused in the last 90 days

Get-UnusedPowerApps -EnvironmentName "12345678-1234-1234-1234-1234567890ab" -UnusedDays 90

Returns Power Apps that have no users or haven't been modified in the last 90 days.

Example 3: Export results to CSV

Get-UnusedPowerApps -EnvironmentName "12345678-1234-1234-1234-1234567890ab" -ExportFormat CSV

Returns unused Power Apps and exports the results to a CSV file in the current directory.

Example 4: Process all environments and export to JSON

Get-AdminPowerAppEnvironment | 
    Select-Object -ExpandProperty EnvironmentName | 
    Get-UnusedPowerApps -ExportFormat JSON -ExportPath "C:\Reports\UnusedApps.json"

Processes all environments and exports the combined results to a JSON file.

Example 5: Find apps in all Sandbox environments

Get-AdminPowerAppEnvironment | 
    Where-Object { $_.EnvironmentType -eq "Sandbox" } | 
    Select-Object -ExpandProperty EnvironmentName | 
    Get-UnusedPowerApps -IncludeAppDetails

Finds unused apps in all sandbox environments with detailed information.

Practical Applications

Regular Cleanup

Set up a monthly automated job to identify unused applications:

# Connect using service principal (recommended for automation)
Add-PowerAppsAccount -TenantID $tenantId -ApplicationId $applicationId -ClientSecret $clientSecret

# Get all environments and find unused apps
Get-AdminPowerAppEnvironment | 
    Select-Object -ExpandProperty EnvironmentName | 
    Get-UnusedPowerApps -UnusedDays 90 -ExportFormat CSV -ExportPath "C:\Reports\MonthlyUnusedApps.csv"

Usage Reporting

Create a dashboard of app usage by combining with other data:

$allEnvs = Get-AdminPowerAppEnvironment
$results = @()

foreach ($env in $allEnvs) {
    $envName = $env.EnvironmentName
    $envDisplayName = $env.DisplayName
    
    $unusedApps = Get-UnusedPowerApps -EnvironmentName $envName -IncludeAppDetails
    $allApps = Get-AdminPowerApp -EnvironmentName $envName
    
    $results += [PSCustomObject]@{
        EnvironmentName = $envDisplayName
        TotalApps = $allApps.Count
        UnusedApps = $unusedApps.Count
        UsagePercentage = if ($allApps.Count -gt 0) { 
            [math]::Round(($allApps.Count - $unusedApps.Count) / $allApps.Count * 100, 2) 
        } else { 0 }
    }
}

$results | Export-Csv -Path "C:\Reports\AppUsageByEnvironment.csv" -NoTypeInformation

Limitations and Considerations

  • The function uses LastModifiedTime as a proxy for app usage, which isn't a perfect measure of actual usage
  • Role assignments check might not capture shared apps where users access via environment-level permissions
  • Processing large environments may take time, especially with many apps or role assignments
  • Requires admin permissions to access the environments and apps

Troubleshooting

Common Issues

  1. Connection errors
    • Ensure you're connected via Add-PowerAppsAccount before running
    • Check your permissions on the environments
  2. No data returned
    • Verify the environment ID is correct
    • Check if there are any apps in the environment
  3. Export errors
    • Ensure the specified path is writable
    • Try using an absolute path instead of a relative one

Diagnostic Steps

  1. Run with verbose output:
    $VerbosePreference = "Continue"
    Get-UnusedPowerApps -EnvironmentName "your-environment-id"
    $VerbosePreference = "SilentlyContinue"
    
  2. Test environment access:
    Get-AdminPowerAppEnvironment -EnvironmentName "your-environment-id"
    

Version History

  • v1.0 (March 2025): Initial release
  • v1.1 (Coming soon): Add app usage analytics integration

Support

For questions, suggestions, or issues, please contact:

  • Email: info@theofficelab.eu
  • GitHub: 

License

This script is provided under the MIT License. Feel free to modify and distribute it, but please include the original attribution.