App modules (model-driven apps) define the structure, navigation, and components of model-driven applications in Dataverse. This guide covers creating, updating, retrieving, and deleting app modules using PowerShell.
$app = Get-DataverseAppModule -Connection $c -Id $appIdReturns parsed properties like Id, UniqueName, Name, Description, PublishedOn, etc.
$app = Get-DataverseAppModule -Connection $c -UniqueName "msdyn_SalesHub"$apps = Get-DataverseAppModule -Connection $c$salesApps = Get-DataverseAppModule -Connection $c -Name "Sales*"$app = Get-DataverseAppModule -Connection $c -Id $appId -RawReturns all raw attributes from the appmodule record instead of parsed properties.
$publishedApps = Get-DataverseAppModule -Connection $c -Published$appId = Set-DataverseAppModule -Connection $c -PassThru `
-UniqueName "my_custom_app" `
-Name "My Custom Application" `
-Description "A custom model-driven app"Set-DataverseAppModule -Connection $c `
-Id $appId `
-Name "Updated App Name" `
-Description "Updated description"Set-DataverseAppModule -Connection $c `
-UniqueName "my_custom_app" `
-Description "New description"$iconResourceId = (Get-DataverseRecord -Connection $c -TableName webresource -FilterValues @{name="app_icon.svg"}).webresourceid
Set-DataverseAppModule -Connection $c -PassThru `
-UniqueName "sales_app" `
-Name "Sales Application" `
-WebResourceId $iconResourceId `
-FormFactor 1 ` # Main form factor
-ClientType 1
### Create with navigation type and featured flag
```powershell
Set-DataverseAppModule -Connection $c -PassThru `
-UniqueName "featured_app" `
-Name "Featured App" `
-NavigationType MultiSession `
-IsFeatured $trueSet-DataverseAppModule -Connection $c -PassThru `
-UniqueName "ready_app" `
-Name "Ready App" `
-Validate `
-Publish# Only update if exists, don't create new
Set-DataverseAppModule -Connection $c `
-UniqueName "existing_app" `
-Name "Updated Name" `
-NoCreate# Only create if doesn't exist, don't update existing
Set-DataverseAppModule -Connection $c `
-UniqueName "new_app" `
-Name "New App" `
-NoUpdateSet-DataverseAppModule -Connection $c -PassThru `
-UniqueName "my_app" `
-Name "My App" `
-PublishSet-DataverseAppModule -Connection $c -PassThru `
-UniqueName "my_app" `
-Name "My App" `
-Validate `
-Publish# Set icon for an app module using an icon from an online icon set
Set-DataverseAppmoduleIconFromSet -UniqueName "my_app" `
-IconName "person" `
-IconSet FluentUI `
-PublisherPrefix "contoso" `
-PublishDownloads an icon from an online icon set, creates a web resource, and sets it as the app module's icon. See Set-DataverseAppmoduleIconFromSet for more details.
Remove-DataverseAppModule -Connection $c -Id $appId -Confirm:$falseRemove-DataverseAppModule -Connection $c -UniqueName "my_app" -Confirm:$false# Don't error if app doesn't exist
Remove-DataverseAppModule -Connection $c -UniqueName "maybe_exists" -IfExists -Confirm:$falseRemove-DataverseAppModule -Connection $c -UniqueName "my_app" -WhatIf# Get existing app
$originalApp = Get-DataverseAppModule -Connection $c -Id $originalAppId
# Create new app with same properties
$newAppId = Set-DataverseAppModule -Connection $c -PassThru `
-UniqueName "$($originalApp.UniqueName)_copy" `
-Name "$($originalApp.Name) (Copy)" `
-Description $originalApp.Description `
-WebResourceId $originalApp.WebResourceId `
-FormFactor $originalApp.FormFactor `
-ClientType $originalApp.ClientType$appConfigs = @(
@{ UniqueName = "sales_app"; Name = "Sales Hub"; Description = "Sales management app" },
@{ UniqueName = "service_app"; Name = "Customer Service"; Description = "Service management app" },
@{ UniqueName = "marketing_app"; Name = "Marketing Hub"; Description = "Marketing management app" }
)
foreach ($config in $appConfigs) {
Set-DataverseAppModule -Connection $c -PassThru `
-UniqueName $config.UniqueName `
-Name $config.Name `
-Description $config.Description
}# Get all apps and export metadata
$apps = Get-DataverseAppModule -Connection $c
$apps | Select-Object UniqueName, Name, Description, PublishedOn, FormFactor, IsFeatured |
Export-Csv -Path "app-audit.csv" -NoTypeInformation# Remove all apps with names starting with "dev_"
Get-DataverseAppModule -Connection $c -Name "dev_*" |
ForEach-Object {
Remove-DataverseAppModule -Connection $c -Id $_.Id -Confirm:$false
}When working with app modules, you'll encounter these key properties:
- Id: The unique identifier (GUID) of the app module
- UniqueName: The schema name used to reference the app (required for creation)
- Name: The display name shown in the app launcher
- Description: Optional description of the app's purpose
- WebResourceId: The web resource ID for the app icon
- FormFactor: The form factor (1=Main, 2=Quick, 3=Preview, 4=Dashboard)
- ClientType: The client type for the app
- NavigationType: The navigation type (Single session or Multi session)
- IsFeatured: Whether the app is featured in the app launcher
- PublishedOn: When the app was last published