diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b6ce97bf9..de71694bde 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Fixed an issue with `Add-PnPListItem` and `Set-PnPListItem` cmdlets when trying to set taxonomy fields by passing in a GUID or term instance using a Batch. [#5174](https://github.com/pnp/powershell/pull/5174)
- Fixed issue with Azure functions not working properly when we also have other modules like Az which rely on .NET 10. [#5393](https://github.com/pnp/powershell/pull/5393)
- Fixed multi-geo compatibility issues with `Get-PnPGeoAdministrator` response handling, `Set-PnPMultiGeoExperience` confirmation prompts, and unsupported-version errors for `Set-PnPMultiGeoCompanyAllowedDataLocation`. [#5401](https://github.com/pnp/powershell/pull/5401)
+- Fixed Power Apps cmdlets to use cloud-specific Power Apps service audiences and endpoints for government clouds. [#5404](https://github.com/pnp/powershell/pull/5404)
### Removed
diff --git a/documentation/Get-PnPPowerApp.md b/documentation/Get-PnPPowerApp.md
index 10a29fa114..b6616c828e 100644
--- a/documentation/Get-PnPPowerApp.md
+++ b/documentation/Get-PnPPowerApp.md
@@ -14,6 +14,7 @@ title: Get-PnPPowerApp
**Required Permissions**
* Azure: management.azure.com
+* PowerApps: service.powerapps.com
Returns the Power Apps for a given environment
diff --git a/documentation/Set-PnPPowerAppByPassConsent.md b/documentation/Set-PnPPowerAppByPassConsent.md
index be34ee4274..57824a80a0 100644
--- a/documentation/Set-PnPPowerAppByPassConsent.md
+++ b/documentation/Set-PnPPowerAppByPassConsent.md
@@ -14,6 +14,7 @@ title: Set-PnPPowerAppByPassConsent
**Required Permissions**
* Azure: management.azure.com
+* PowerApps: service.powerapps.com
Sets the consent bypass flag of a Power Apps for a given environment
diff --git a/src/Commands/Base/PnPAzureManagementApiCmdlet.cs b/src/Commands/Base/PnPAzureManagementApiCmdlet.cs
index c1f1acc3c9..349b9e0757 100644
--- a/src/Commands/Base/PnPAzureManagementApiCmdlet.cs
+++ b/src/Commands/Base/PnPAzureManagementApiCmdlet.cs
@@ -1,5 +1,6 @@
using System.Management.Automation;
using Microsoft.SharePoint.Client;
+using PnP.PowerShell.Commands.Utilities;
using PnP.PowerShell.Commands.Utilities.Auth;
using PnP.PowerShell.Commands.Utilities.REST;
@@ -18,7 +19,7 @@ public abstract class PnPAzureManagementApiCmdlet : PnPConnectedCmdlet
///
/// The default audience to target PowerApps APIs
///
- public string PowerAppDefaultAudience => "https://service.powerapps.com/.default";
+ public string PowerAppDefaultAudience => $"{PowerPlatformUtility.GetPowerAppsServiceEndpoint(Connection.AzureEnvironment)}/.default";
///
/// Returns an Access Token for the Microsoft Office Management API, if available, otherwise NULL
diff --git a/src/Commands/Base/TokenHandler.cs b/src/Commands/Base/TokenHandler.cs
index fe00279e4a..1123f9d62c 100644
--- a/src/Commands/Base/TokenHandler.cs
+++ b/src/Commands/Base/TokenHandler.cs
@@ -125,7 +125,17 @@ internal static Enums.ResourceTypeName DefineResourceTypeFromAudience(string aud
"azure" or "management.azure.com" or "management.chinacloudapi.cn" or "management.usgovcloudapi.net" => Enums.ResourceTypeName.AzureManagementApi,
"exchangeonline" or "outlook.office.com" or "outlook.office365.com" => Enums.ResourceTypeName.ExchangeOnline,
"flow" or "service.flow.microsoft.com" => Enums.ResourceTypeName.PowerAutomate,
- "powerapps" or "api.powerapps.com" => Enums.ResourceTypeName.PowerApps,
+ "powerapps"
+ or "api.powerapps.com"
+ or "service.powerapps.com"
+ or "api.powerapps.cn"
+ or "service.powerapps.cn"
+ or "gov.api.powerapps.us"
+ or "gov.service.powerapps.us"
+ or "high.api.powerapps.us"
+ or "high.service.powerapps.us"
+ or "api.apps.appsplatform.us"
+ or "service.apps.appsplatform.us" => Enums.ResourceTypeName.PowerApps,
"dynamics" or "admin.services.crm.dynamics.com" or "api.crm.dynamics.com" => Enums.ResourceTypeName.DynamicsCRM,
"gcs" or "gcs.office.com" => Enums.ResourceTypeName.Gcs,
diff --git a/src/Commands/PowerPlatform/PowerApps/GetPowerApp.cs b/src/Commands/PowerPlatform/PowerApps/GetPowerApp.cs
index 968778ad09..1d909c473a 100644
--- a/src/Commands/PowerPlatform/PowerApps/GetPowerApp.cs
+++ b/src/Commands/PowerPlatform/PowerApps/GetPowerApp.cs
@@ -40,7 +40,10 @@ protected override void ExecuteCmdlet()
{
LogDebug($"Retrieving all PowerApps within environment '{environmentName}'");
- var apps = PowerAppsRequestHelper.GetResultCollection($"{powerAppsUrl}/providers/Microsoft.PowerApps/apps?api-version=2016-11-01&$filter=environment eq '{environmentName}'");
+ var requestUrl = AsAdmin
+ ? $"{powerAppsUrl}/providers/Microsoft.PowerApps/scopes/admin/environments/{environmentName}/apps?api-version=2016-11-01"
+ : $"{powerAppsUrl}/providers/Microsoft.PowerApps/apps?api-version=2016-11-01&$filter=environment eq '{environmentName}'";
+ var apps = PowerAppsRequestHelper.GetResultCollection(requestUrl);
WriteObject(apps, true);
}
}
diff --git a/src/Commands/Utilities/PowerPlatformUtility.cs b/src/Commands/Utilities/PowerPlatformUtility.cs
index ffe147861a..01178149c5 100644
--- a/src/Commands/Utilities/PowerPlatformUtility.cs
+++ b/src/Commands/Utilities/PowerPlatformUtility.cs
@@ -1,4 +1,5 @@
-using PnP.Framework;
+using System;
+using PnP.Framework;
using PnP.PowerShell.Commands.Utilities.REST;
using System.Linq;
using PnP.Framework.Diagnostics;
@@ -26,6 +27,7 @@ public static string GetPowerAutomateEndpoint(AzureEnvironment environment)
AzureEnvironment.USGovernmentHigh => "https://high.api.flow.microsoft.us",
AzureEnvironment.USGovernmentDoD => "https://api.flow.appsplatform.us",
AzureEnvironment.PPE => "https://api.flow.microsoft.com",
+ AzureEnvironment.BleuCloud or AzureEnvironment.DelosCloud or AzureEnvironment.GovSGCloud => throw GetUnsupportedPowerPlatformCloudException(environment),
_ => "https://api.flow.microsoft.com"
};
}
@@ -41,15 +43,37 @@ public static string GetPowerAppsEndpoint(AzureEnvironment environment)
{
AzureEnvironment.Production => "https://api.powerapps.com",
AzureEnvironment.Germany => "https://api.powerapps.com",
- AzureEnvironment.China => "https://api.powerautomate.cn",
+ AzureEnvironment.China => "https://api.powerapps.cn",
AzureEnvironment.USGovernment => "https://gov.api.powerapps.us",
AzureEnvironment.USGovernmentHigh => "https://high.api.powerapps.us",
AzureEnvironment.USGovernmentDoD => "https://api.apps.appsplatform.us",
AzureEnvironment.PPE => "https://api.powerapps.com",
+ AzureEnvironment.BleuCloud or AzureEnvironment.DelosCloud or AzureEnvironment.GovSGCloud => throw GetUnsupportedPowerPlatformCloudException(environment),
_ => "https://api.powerapps.com"
};
}
+ ///
+ /// Returns the audience URL for acquiring tokens for Power Apps APIs based on the Azure Environment
+ ///
+ /// Azure Environment to indicate the type of cloud to target
+ /// Audience URL for acquiring tokens for Power Apps APIs
+ public static string GetPowerAppsServiceEndpoint(AzureEnvironment environment)
+ {
+ return environment switch
+ {
+ AzureEnvironment.Production => "https://service.powerapps.com",
+ AzureEnvironment.Germany => "https://service.powerapps.com",
+ AzureEnvironment.China => "https://service.powerapps.cn",
+ AzureEnvironment.USGovernment => "https://gov.service.powerapps.us",
+ AzureEnvironment.USGovernmentHigh => "https://high.service.powerapps.us",
+ AzureEnvironment.USGovernmentDoD => "https://service.apps.appsplatform.us",
+ AzureEnvironment.PPE => "https://service.powerapps.com",
+ AzureEnvironment.BleuCloud or AzureEnvironment.DelosCloud or AzureEnvironment.GovSGCloud => throw GetUnsupportedPowerPlatformCloudException(environment),
+ _ => "https://service.powerapps.com"
+ };
+ }
+
///
/// Returns the BaseUrl for calling into the Business Applications APIs based on the Azure Environment
///
@@ -66,10 +90,16 @@ public static string GetBapEndpoint(AzureEnvironment environment)
AzureEnvironment.USGovernmentHigh => "https://high.api.bap.microsoft.us",
AzureEnvironment.USGovernmentDoD => "https://api.bap.appsplatform.us",
AzureEnvironment.PPE => "https://api.bap.microsoft.com",
+ AzureEnvironment.BleuCloud or AzureEnvironment.DelosCloud or AzureEnvironment.GovSGCloud => throw GetUnsupportedPowerPlatformCloudException(environment),
_ => "https://api.bap.microsoft.com"
};
}
+ private static NotSupportedException GetUnsupportedPowerPlatformCloudException(AzureEnvironment environment)
+ {
+ return new NotSupportedException($"Power Platform endpoints for AzureEnvironment '{environment}' are not currently documented or supported.");
+ }
+
///
/// Returns the default Power Platform environment
///