Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las directivas de conector avanzadas (ACP) rigen el uso del conector con una lista de permitidos estricta que bloquea los conectores de forma predeterminada. Además de la experiencia del Centro de administración de Power Platform, puede administrar ACP con código mediante la API de Power Platform y los SDK de administración (Admin). La automatización de ACP es útil al estandarizar la gobernanza en muchos grupos de entornos, replicar una directiva de línea de base entre grupos o administrar directivas como parte de una canalización de implementación.
En este tutorial, aprenderá a:
- Autenticar usando Power Platform API.
- Comprenda la forma de la directiva ACP.
- Cree una directiva y agréguela a un grupo de entornos.
- Habilite una acción de conector individual.
- Aplique o actualice una directiva en un único entorno.
- Copie una directiva de un grupo de entornos a otro.
- Quitar ACP de un grupo de entornos.
Las directivas de conector avanzadas se exponen a través de las governance/ruleBasedPolicies operaciones de Power Platform API. Una directiva contiene uno o varios conjuntos de reglas; el conjunto de reglas con el identificador ConnectorManagement contiene la lista de permitidos del conector ACP. Todos los ejemplos del artículo usan la versión 2024-10-01de API .
Prerequisites
Un registro de aplicaciones configurado para la API de Power Platform. Tenga en cuenta el identificador de aplicación (cliente) y el identificador de directorio (inquilino) del registro de la aplicación.
Permiso para administrar directivas de gobernanza. En el caso de las entidades de servicio, asigne un rol de RBAC que pueda escribir recursos, como colaborador de Power Platform o propietario de Power Platform. Para obtener más información, consulte Tutorial: Asignación de roles a entidades de servicio.
Para ver los ejemplos del SDK, instale el SDK que se distribuye mensualmente en su galería pública:
- C#: el paquete NuGet Microsoft.PowerPlatform.Management.
- Python: el paquete PyPI powerplatform-management.
dotnet add package Microsoft.PowerPlatform.Managementpip install powerplatform-management
Paso 1. Autenticar usando la API Power Platform
Todos los ejemplos se autentican con el identificador de cliente del registro de la aplicación, siguiendo las instrucciones de Autenticación. Los ejemplos siguientes inician sesión de forma interactiva como el usuario actual. Para ejecutar de forma desatendida con una entidad de servicio, consulte el flujo de cliente confidencial en el artículo Autenticación y asigne a la entidad de servicio un rol RBAC.
# Requires the MSAL.PS module: Install-Module MSAL.PS -Scope CurrentUser
Import-Module "MSAL.PS"
$clientId = "<application (client) ID of your app registration>"
$apiBaseUrl = "https://api.powerplatform.com"
$apiVersion = "2024-10-01"
# Sign in interactively and request a token for the Power Platform API
$auth = Get-MsalToken -ClientId $clientId -Scope "https://api.powerplatform.com/.default" -Interactive
$headers = @{ Authorization = "Bearer $($auth.AccessToken)" }
Paso 2. Comprender la estructura de la directiva ACP
Una directiva de conector avanzada es una directiva basada en reglas que contiene un conjunto de reglas con el identificador ConnectorManagement. Ese conjunto de reglas incluye un version y su inputs contiene un AllowedConnectorList, donde cada entrada admite un conector y define cómo se rigen sus acciones y tipos de conexión:
{
"name": "Contoso ACP baseline",
"ruleSets": [
{
"id": "ConnectorManagement",
"version": "1.0",
"inputs": {
"AllowedConnectorList": [
{
"AllowedConnector": "/providers/Microsoft.PowerApps/apis/shared_office365",
"AllowedActionsMode": "AllAllowed",
"AllowedConnectionTypesMode": "AllAllowed"
},
{
"AllowedConnector": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps",
"AllowedActionsMode": "SomeAllowed",
"AllowedActions": ["GetItem", "CreateRecord"],
"AllowedConnectionTypesMode": "AllAllowed"
}
]
}
}
]
}
Tenga en cuenta la semántica siguiente:
- Un conector que no está en
AllowedConnectorListestá bloqueado (denegación predeterminada). - Cada entrada establece
AllowedActionsMode.AllAllowedpermite todas las acciones del conector.SomeAllowedrestringe el conector a las acciones indicadas en el arrayAllowedActionsde la entrada. El paso 4 muestra cómo agregar una acción y establecer este modo. -
AllowedConnectionTypesModerige qué tipos de conexión se permiten y sigue el mismoAllAllowedpatrón. - Incluya el conjunto de
versionreglas cuando cree o actualice una directiva. Léelo desde una directiva existente y conserve el valor que devuelve el servicio.
Sugerencia
El valor exacto de AllowedConnector es el identificador de recursos del conector. La forma más confiable de aprender la forma de los conectores que ya están en el inquilino es leer primero una directiva existente (el paso 4 muestra cómo) o usar el catálogo de conectores (descrito a continuación) y, a continuación, reflejar esa forma al crear o actualizar directivas.
Búsqueda de identificadores de conector y acción con el catálogo de conectores
Para detectar qué conectores y acciones puede permitir, use la API del catálogo de conectores. Enumera los conectores disponibles en un entorno, junto con los identificadores que coloca en AllowedConnector y AllowedActions.
Nota:
Las operaciones del catálogo de conectores requieren un identificador de entorno en la ruta de accesoy un OData $filter que especifica el mismo entorno; por ejemplo, . $filter=environment eq '<environmentId>' Ambos son necesarios.
$environmentId = "<environment ID>"
$filter = [uri]::EscapeDataString("environment eq '$environmentId'")
# List connectors available in the environment
$connectors = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/connectivity/environments/$environmentId/connectors?`$filter=$filter&api-version=$apiVersion" `
-Headers $headers
$connectors.value | Select-Object name, @{ n = "displayName"; e = { $_.properties.displayName } }
# Get a single connector by ID (the connector's name, such as shared_office365)
$connectorId = "shared_office365"
$connector = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/connectivity/environments/$environmentId/connectors/$connectorId?`$filter=$filter&api-version=$apiVersion" `
-Headers $headers
$connector.id # full resource path to use as AllowedConnector
Utiliza id del conector (su ruta de acceso completa al recurso, como /providers/Microsoft.PowerApps/apis/shared_office365) como valor de AllowedConnector y los identificadores de operación del conector como los valores de AllowedActions. Puede acceder al mismo catálogo a través del espacio de nombres connectivity de los SDK de administración.
Paso 3. Crear una directiva y agregarla a un grupo de entornos
Agregar ACP a un grupo de entornos es una operación de dos partes: cree la directiva y asígnela al grupo. La llamada create devuelve la nueva directiva id, que se usa en la llamada de asignación.
Para asignar la directiva a todo el grupo, envíe una solicitud de asignación con un cuerpo vacío ({}). Cada entorno del grupo hereda la directiva y permanece sincronizada con ella.
$environmentGroupId = "<environment group ID>"
# 1. Create the policy with a ConnectorManagement rule set
$policyBody = @{
name = "Contoso ACP baseline"
ruleSets = @(
@{
id = "ConnectorManagement"
version = "1.0"
inputs = @{
AllowedConnectorList = @(
@{
AllowedConnector = "/providers/Microsoft.PowerApps/apis/shared_office365"
AllowedActionsMode = "AllAllowed"
AllowedConnectionTypesMode = "AllAllowed"
}
)
}
}
)
} | ConvertTo-Json -Depth 10
$policy = Invoke-RestMethod -Method Post `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $policyBody
Write-Host "Created policy $($policy.id)"
# 2. Assign the policy to the environment group (empty body = whole group)
Invoke-RestMethod -Method Post `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$($policy.id)/environmentGroups/$environmentGroupId/assignments?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body "{}"
Write-Host "Assigned policy $($policy.id) to group $environmentGroupId"
Paso 4. Habilitar una acción individual del conector
Para permitir solo acciones específicas en un conector, establezca su AllowedActionsMode en SomeAllowed y enumere las acciones permitidas en AllowedActions. En este ejemplo se agrega una acción, como una acción oculta que no se puede seleccionar en el centro de administración, a la lista de permitidos de un conector y establece el conector SomeAlloweden . Lea la directiva, actualice la entrada del conector y envíe de vuelta el conjunto de reglas actualizado mediante patch. La revisión actualiza un conjunto de reglas por identificador y deja intactos los demás conjuntos de reglas de la directiva.
$policyId = "<policy ID>"
$connectorId = "shared_commondataserviceforapps" # last segment of AllowedConnector
$actionToAdd = "aibuilderpredict_customprompt"
# 1. Read the current policy
$policy = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$policyId`?api-version=$apiVersion" `
-Headers $headers
# 2. Find the ConnectorManagement rule set and the connector entry
$ruleSet = $policy.ruleSets | Where-Object { $_.id -eq "ConnectorManagement" }
$entry = $ruleSet.inputs.AllowedConnectorList |
Where-Object { ($_.AllowedConnector -split "/")[-1] -eq $connectorId }
# 3. Restrict the connector to specific actions: add the action and set SomeAllowed
if ($entry) {
$actions = @()
if ($entry.PSObject.Properties.Name -contains "AllowedActions") { $actions = @($entry.AllowedActions) }
if ($actions -notcontains $actionToAdd) { $actions += $actionToAdd }
$entry | Add-Member -NotePropertyName AllowedActions -NotePropertyValue $actions -Force
$entry.AllowedActionsMode = "SomeAllowed"
# 4. Patch only the modified rule set back to the policy
$patchBody = @{ name = $policy.name; ruleSets = @($ruleSet) } | ConvertTo-Json -Depth 10
Invoke-RestMethod -Method Patch `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$policyId`?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $patchBody
Write-Host "Set '$connectorId' to SomeAllowed with '$actionToAdd' in policy $policyId"
}
Paso 5. Aplicar o actualizar una directiva en un único entorno
Puede aplicar una directiva a un único entorno en lugar de a un grupo de entornos. Este enfoque es útil para entornos regulados, piloto o de alto riesgo. Asigne la directiva al entorno y use el mismo patrón de parche del paso 4 para modificarla más adelante. Cada entorno admite una única política de ACP vigente.
$policyId = "<policy ID>"
$environmentId = "<environment ID>"
# Assign the policy directly to the environment
Invoke-RestMethod -Method Post `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$policyId/environments/$environmentId/assignments?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body "{}"
Write-Host "Assigned policy $policyId to environment $environmentId"
Paso 6. Copiar una directiva de un grupo de entornos a otro
Al replicar una línea de base de gobernanza en otro grupo, elija cuánto copiar mediante la CopyAllRules marca :
-
CopyAllRules = true: cree una nueva directiva a partir de todos los conjuntos de reglas del grupo de origen y asígnela al grupo de destino. La gobernanza del grupo de destino se convierte en una copia independiente del origen. -
CopyAllRules = false: extraiga solo el conjunto de reglasConnectorManagementde la política de origen e intégrelo en la política existente del grupo de destino. La operación de revisión agrega o actualiza el conjunto de reglas por identificador, por lo que el grupo de destino mantiene sus otras reglas.
$sourceGroupId = "<source environment group ID>"
$targetGroupId = "<target environment group ID>"
$CopyAllRules = $true
# 1. Find and read the policy assigned to the source group
$sourceAssignments = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/environmentGroups/$sourceGroupId/assignments?api-version=$apiVersion" `
-Headers $headers
$sourcePolicyId = $sourceAssignments.value[0].policyId
$source = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$sourcePolicyId`?api-version=$apiVersion" `
-Headers $headers
if ($CopyAllRules) {
# 2a. Copy ALL rule sets into a new policy and assign it to the target group
$copyBody = @{ name = "$($source.name) (copy)"; ruleSets = $source.ruleSets } | ConvertTo-Json -Depth 20
$copy = Invoke-RestMethod -Method Post `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $copyBody
Invoke-RestMethod -Method Post `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$($copy.id)/environmentGroups/$targetGroupId/assignments?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body "{}"
Write-Host "Copied all rules to policy $($copy.id) and assigned it to group $targetGroupId"
}
else {
# 2b. Merge ONLY the ConnectorManagement rule into the target group's existing policy
$sourceCm = $source.ruleSets | Where-Object { $_.id -eq "ConnectorManagement" }
$targetAssignments = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/environmentGroups/$targetGroupId/assignments?api-version=$apiVersion" `
-Headers $headers
$targetPolicyId = $targetAssignments.value[0].policyId
$targetPolicy = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$targetPolicyId`?api-version=$apiVersion" `
-Headers $headers
# Patch adds or updates the ConnectorManagement rule set by ID, keeping the target's other rules
$patchBody = @{ name = $targetPolicy.name; ruleSets = @($sourceCm) } | ConvertTo-Json -Depth 20
Invoke-RestMethod -Method Patch `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$targetPolicyId`?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $patchBody
Write-Host "Merged the ConnectorManagement rule into target policy $targetPolicyId"
}
Paso 7. Quitar ACP de un grupo de entornos
Mientras un grupo tenga una regla ACP activa, cada entorno del grupo se ajusta a la directiva del grupo. La manera de quitar la aplicación forzosa depende de si quieres que esos entornos mantengan su configuración actual o borrar por completo ACP:
-
Elimine la regla de la directiva del grupo para que el grupo deje de gestionar ACP. Use la operación
removeRulepara eliminar el conjunto de reglasConnectorManagementde la directiva del grupo. Los entornos mantienen su última configuración ACP aplicada, pero ya no se mantienen sincronizadas con el grupo. Puede administrar cada entorno individualmente y permitir que diverjan. -
Quite ACP del grupo y de todos los entornos para desactivar ACP en todos los entornos. Elimine la regla de la política del grupo y, a continuación, recorra en bucle los entornos del grupo y elimine también el conjunto de reglas
ConnectorManagementde la política de cada entorno.
Nota:
Eliminar la regla de la directiva de un grupo no elimina automáticamente ACP de los entornos que lo heredaron. Esos entornos conservan su última configuración aplicada para evitar una brecha de cumplimiento. Para borrar ACP en todas partes, quítelo de cada entorno, como se muestra en el ejemplo del bucle. Para más información, consulte Directivas de conector avanzadas.
Quitar la regla de la directiva del grupo
En el ejemplo siguiente se elimina el conjunto de reglas ConnectorManagement de una directiva mediante la operación removeRule.
$policyId = "<policy ID>"
# Read the policy, then send the rule set to remove
$policy = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$policyId`?api-version=$apiVersion" `
-Headers $headers
$ruleSet = $policy.ruleSets | Where-Object { $_.id -eq "ConnectorManagement" }
$body = @{ name = $policy.name; ruleSets = @($ruleSet) } | ConvertTo-Json -Depth 10
Invoke-RestMethod -Method Patch `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$policyId/removeRule?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $body
Write-Host "Removed the ConnectorManagement rule set from policy $policyId"
Quitar ACP de todos los entornos del grupo
Para desactivar ACP en todos los entornos de un grupo, quite primero la regla de la directiva del grupo (ejemplo anterior) y, a continuación, repita la eliminación de la regla en la directiva propia de cada entorno. Lea la directiva asignada de cada entorno a partir de la asignación del entorno y, a continuación, llame a removeRule para esa directiva. Proporcione los identificadores de entorno que pertenecen al grupo o los enumere mediante las API de administración del entorno.
# Environment IDs that belong to the group
$environmentIds = @("<environment ID 1>", "<environment ID 2>")
foreach ($environmentId in $environmentIds) {
# Find the policy currently assigned to the environment
$envAssignments = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/environments/$environmentId/assignments?api-version=$apiVersion" `
-Headers $headers
if (-not $envAssignments.value) { continue }
$envPolicyId = $envAssignments.value[0].policyId
# Remove the ConnectorManagement rule set from that environment's policy
$envPolicy = Invoke-RestMethod -Method Get `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$envPolicyId`?api-version=$apiVersion" `
-Headers $headers
$ruleSet = $envPolicy.ruleSets | Where-Object { $_.id -eq "ConnectorManagement" }
if ($ruleSet) {
$body = @{ name = $envPolicy.name; ruleSets = @($ruleSet) } | ConvertTo-Json -Depth 10
Invoke-RestMethod -Method Patch `
-Uri "$apiBaseUrl/governance/ruleBasedPolicies/$envPolicyId/removeRule?api-version=$apiVersion" `
-Headers $headers -ContentType "application/json" -Body $body
Write-Host "Removed ACP from environment $environmentId"
}
}
La misma llamada por entorno removeRule funciona con los SDK de C# y Python mostrados anteriormente. Envuelve la llamada en un bucle que recorra los ID de entorno del grupo.
Contenido relacionado
Directivas de conector avanzadas
Directivas basadas en reglas: referencia de la API REST
Autenticación
Tutorial: Asignación de roles a entidades de servicio
Información general sobre la programación y la extensibilidad