บทช่วยสอน: จัดการนโยบายตัวเชื่อมต่อขั้นสูงทางโปรแกรม

นโยบายตัวเชื่อมต่อขั้นสูง (ACP) ควบคุมการใช้ตัวเชื่อมต่อด้วยอนุญาตที่เข้มงวดที่บล็อกตัวเชื่อมต่อตามค่าเริ่มต้น นอกเหนือจากประสบการณ์ ศูนย์การจัดการ Power Platform คุณสามารถจัดการ ACP ด้วยรหัสได้โดยใช้ Power Platform API และ SDK การดูแลระบบ (Admin) ACP อัตโนมัติมีประโยชน์เมื่อคุณกําหนดมาตรฐานการกํากับดูแลทั่วกลุ่มสภาพแวดล้อมหลายกลุ่ม ทําซ้ํานโยบายพื้นฐานระหว่างกลุ่มหรือจัดการนโยบายเป็นส่วนหนึ่งของไปป์ไลน์การปรับใช้

ในบทช่วยสอนนี้ เรียนรู้วิธีการ:

  1. ยืนยันตัวตนโดยใช้ Power Platform API
  2. ทําความเข้าใจรูปร่างนโยบาย ACP
  3. สร้างนโยบาย และเพิ่มนโยบายลงในกลุ่มสภาพแวดล้อม
  4. เปิดใช้งานการดำเนินการของตัวเชื่อมต่อแต่ละรายการ
  5. นําไปใช้หรืออัปเดตนโยบายในสภาพแวดล้อมเดียว
  6. คัดลอกนโยบายจากกลุ่มสภาพแวดล้อมหนึ่งไปยังอีกกลุ่มหนึ่ง
  7. ลบ ACP ออกจากกลุ่มสภาพแวดล้อม

นโยบายตัวเชื่อมต่อขั้นสูงสามารถเข้าถึงได้ผ่านการดำเนินการ governance/ruleBasedPolicies ของ Power Platform API นโยบายประกอบด้วยชุดกฎอย่างน้อยหนึ่งชุด กฎที่กําหนดด้วย ID ConnectorManagement จะเก็บรายการอนุญาตของตัวเชื่อมต่อ ACP ไว้ ตัวอย่างทั้งหมดในบทความใช้เวอร์ชัน 2024-10-01API

Prerequisites

ขั้นตอนที่ 1. ตรวจสอบความถูกต้องโดยใช้ Power Platform API

ตัวอย่างทั้งหมดจะรับรองความถูกต้องด้วย ID ไคลเอ็นต์ของการลงทะเบียนแอป โดยทําตามคําแนะนําในการรับรองความถูกต้อง ตัวอย่างต่อไปนี้ลงชื่อเข้าใช้แบบโต้ตอบในฐานะผู้ใช้ปัจจุบัน เมื่อต้องการเรียกใช้โดยไม่ต้องมีผู้ใช้เฝ้าดูแลโดยใช้ Service Principal ให้ดูโฟลว์ไคลเอ็นต์แบบ confidential client ในบทความ การรับรองความถูกต้อง และกำหนด บทบาท RBAC ให้กับ Service Principal

# 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)" }

ขั้นตอนที่ 2 ทําความเข้าใจกับรูปร่างนโยบาย ACP

นโยบายตัวเชื่อมต่อขั้นสูงคือนโยบายตามกฎที่ประกอบด้วยชุดกฎที่มี ID ConnectorManagement ชุดกฎนั้นมี version และ inputs ของมันมี AllowedConnectorList โดยที่แต่ละรายการอนุญาตให้ใช้ตัวเชื่อมต่อ และกำหนดวิธีควบคุมการดำเนินการและชนิดการเชื่อมต่อ:

{
  "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"
          }
        ]
      }
    }
  ]
}

คํานึงถึงตรรกะต่อไปนี้:

  • ตัวเชื่อมต่อที่ไม่ได้อยู่ใน AllowedConnectorListถูกบล็อก (ปฏิเสธค่าเริ่มต้น)
  • แต่ละรายการจะตั้งค่า AllowedActionsMode AllAllowed อนุญาตทุกการดําเนินการบนตัวเชื่อมต่อ SomeAllowedจํากัดตัวเชื่อมต่อไปยังการดําเนินการที่แสดงอยู่ในอาร์เรย์ของรายการAllowedActions ขั้นตอนที่ 4 แสดงวิธีการเพิ่มการดําเนินการและตั้งค่าโหมดนี้
  • AllowedConnectionTypesModeจะควบคุมชนิดการเชื่อมต่อที่ได้รับอนุญาตและเป็นไปตามรูปแบบเดียวกันAllAllowed
  • รวมชุดของ version กฎเมื่อคุณสร้างหรืออัพเดตนโยบาย อ่านจากนโยบายที่มีอยู่และคงค่าที่บริการส่งกลับมาไว้

Tip

ค่าที่แน่นอนของ AllowedConnector คือตัวระบุทรัพยากรของตัวเชื่อมต่อ วิธีที่เชื่อถือได้ที่สุดในการเรียนรู้รูปร่างสําหรับตัวเชื่อมต่อที่มีอยู่แล้วในผู้เช่าของคุณคือการอ่านนโยบายที่มีอยู่ก่อน (ขั้นตอนที่ 4 แสดงวิธีการ) หรือใช้แค็ตตาล็อกตัวเชื่อมต่อ (อธิบายไว้ถัดไป) จากนั้นสะท้อนรูปร่างนั้นเมื่อคุณสร้างหรืออัปเดตนโยบาย

ค้นหาตัวเชื่อมต่อและรหัสการดําเนินการด้วยแค็ตตาล็อกตัวเชื่อมต่อ

หากต้องการค้นหาตัวเชื่อมต่อและการดําเนินการที่คุณสามารถใช้ได้ ให้ใช้ แค็ตตาล็อก API ของตัวเชื่อมต่อ แสดงรายการตัวเชื่อมต่อที่พร้อมใช้งานในสภาพแวดล้อม พร้อมกับตัวระบุที่คุณวางใน AllowedConnector และAllowedActions

โน้ต

การดําเนินการแค็ตตาล็อกตัวเชื่อมต่อจําเป็นต้องใช้รหัสสภาพแวดล้อมในเส้นทางและ OData $filter ที่ระบุสภาพแวดล้อมเดียวกัน ตัวอย่างเช่น $filter=environment eq '<environmentId>' ทั้งสองอย่างจําเป็น

$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

ใช้ของidตัวเชื่อมต่อ (เส้นทางทรัพยากรแบบเต็ม เช่น /providers/Microsoft.PowerApps/apis/shared_office365) เป็นAllowedConnectorค่า และรหัสการดําเนินการของตัวเชื่อมต่อเป็นค่าในAllowedActions คุณสามารถเข้าถึงแค็ตตาล็อกเดียวกันผ่าน connectivity เนมสเปซของ SDK ของผู้ดูแลระบบได้

ขั้นตอนที่ 3 สร้างนโยบาย และเพิ่มนโยบายลงในกลุ่มสภาพแวดล้อม

การเพิ่ม ACP ไปยังกลุ่มสภาพแวดล้อมเป็นการดําเนินการสองส่วน: สร้างนโยบาย จากนั้นกําหนดนโยบายให้กับกลุ่ม การเรียกสร้างส่งกลับนโยบาย idใหม่ ที่คุณใช้ในการเรียกใช้การกําหนด

เมื่อต้องการกําหนดนโยบายให้กับกลุ่มทั้งหมด ให้ส่งการร้องขอการกําหนดด้วยเนื้อความที่ว่างเปล่า ({}) ทุกสภาพแวดล้อมในกลุ่มจะสืบทอดนโยบายและคงการซิงค์กับนโยบายนั้นอยู่เสมอ

$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"

ขั้นตอนที่ 4 เปิดใช้งานการดําเนินการตัวเชื่อมต่อแต่ละรายการ

เพื่ออนุญาตให้ดําเนินการที่เฉพาะเจาะจงกับตัวเชื่อมต่อเท่านั้น ให้ตั้งค่าเป็น AllowedActionsModeSomeAllowed และแสดงรายการการดําเนินการที่อนุญาตในAllowedActions ตัวอย่างนี้เพิ่มการดําเนินการ เช่น การดําเนินการที่ซ่อนอยู่ที่ไม่สามารถเลือกได้ในศูนย์การจัดการ ในรายการอนุญาตของตัวเชื่อมต่อ และตั้งค่าตัวเชื่อมต่อเป็นSomeAllowed อ่านนโยบาย อัปเดตรายการตัวเชื่อมต่อ และส่งชุดกฎที่อัปเดตแล้วกลับโดยใช้โปรแกรมแก้ไข โปรแกรมแก้ไขอัปเดตกฎที่กําหนดโดย ID และปล่อยให้ชุดกฎอื่นของนโยบายไม่ถูกปรับใช้

$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"
}

ขั้นตอนที่ 5 นําไปใช้หรืออัปเดตนโยบายในสภาพแวดล้อมเดียว

คุณสามารถกําหนดเป้าหมายนโยบายในสภาพแวดล้อมเดียวแทนที่จะเป็นกลุ่มสภาพแวดล้อม วิธีการนี้มีประโยชน์สําหรับสภาพแวดล้อมที่มีความเสี่ยงสูง นําร่อง หรือสภาพแวดล้อมที่มีการควบคุม กําหนดนโยบายให้กับสภาพแวดล้อม และใช้รูปแบบโปรแกรมแก้ไขเดียวกันจากขั้นตอนที่ 4 เพื่อปรับเปลี่ยนในภายหลัง แต่ละสภาพแวดล้อมสนับสนุนนโยบาย ACP ที่มีประสิทธิภาพหนึ่งข้อ

$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"

ขั้นตอนที่ 6 คัดลอกนโยบายจากกลุ่มสภาพแวดล้อมหนึ่งไปยังอีกกลุ่มหนึ่ง

เมื่อคุณทําซ้ําข้อมูลพื้นฐานด้านการกํากับดูแลไปยังกลุ่มอื่น ให้เลือกจํานวนที่จะคัดลอกโดยใช้ค่า CopyAllRules สถานะ:

  • CopyAllRules = true: สร้างนโยบายใหม่จากชุดกฎของกลุ่มแหล่งข้อมูล ทั้งหมด และกําหนดให้กับกลุ่มเป้าหมาย การกํากับดูแลของกลุ่มเป้าหมายจะกลายเป็นสําเนาแหล่งที่มาที่เป็นอิสระจากกัน
  • CopyAllRules = false: แยกเฉพาะ ConnectorManagement ชุดกฎจากนโยบายแหล่งข้อมูลและผสานลงในนโยบายที่มีอยู่ของกลุ่มเป้าหมาย การดำเนินการแพตช์จะเพิ่มหรืออัปเดตชุดกฎตาม ID ดังนั้นกลุ่มเป้าหมายจึงยังคงมีกฎอื่น ๆ ของตนอยู่
$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"
}

ขั้นตอนที่ 7 ลบ ACP ออกจากกลุ่มสภาพแวดล้อม

ในขณะที่กลุ่มมีกฎ ACP ที่ใช้งานอยู่ ทุกสภาพแวดล้อมในกลุ่มจะตรงกับนโยบายของกลุ่ม วิธีที่คุณเอาการบังคับใช้ขึ้นอยู่กับว่าคุณต้องการให้สภาพแวดล้อมเหล่านั้นเก็บการกําหนดค่าปัจจุบันหรือล้าง ACP ทั้งหมด:

  • เอากฎออกจากนโยบายของกลุ่ม เพื่อหยุดกลุ่มจากการจัดการ ACP removeRuleใช้การดําเนินการเพื่อลบConnectorManagementชุดกฎออกจากนโยบายของกลุ่ม สภาพแวดล้อมจะเก็บการกําหนดค่า ACP ที่ใช้ล่าสุดเอาไว้ แต่จะไม่ซิงค์กับกลุ่มอีกต่อไป คุณสามารถจัดการแต่ละสภาพแวดล้อมแยกกันและปล่อยให้แตกต่างกันได้
  • ลบ ACP ออกจากกลุ่มและจากทุกสภาพแวดล้อม เพื่อปิด ACP ทุกที่ ลบกฎออกจากนโยบายของกลุ่ม แล้ววนรอบสภาพแวดล้อมของกลุ่มและลบชุดกฎออกจาก ConnectorManagement นโยบายของแต่ละสภาพแวดล้อมด้วย

โน้ต

การลบกฎออกจากนโยบายของกลุ่มจะไม่ล้าง ACP ออกจากสภาพแวดล้อมที่สืบทอดโดยอัตโนมัติ สภาพแวดล้อมเหล่านั้นยังคงใช้การกําหนดค่าล่าสุดเพื่อหลีกเลี่ยงช่องว่างการบังคับใช้ เมื่อต้องการล้าง ACP ทุกที่ ให้ลบออกจากแต่ละสภาพแวดล้อม ดังที่แสดงในตัวอย่างการวนรอบ สําหรับข้อมูลเพิ่มเติม ให้ดู นโยบายตัวเชื่อมต่อขั้นสูง

ลบกฎออกจากนโยบายของกลุ่ม

ตัวอย่างต่อไปนี้เอา ConnectorManagement ชุดกฎออกจากนโยบายโดยใช้ 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"

ลบ ACP ออกจากทุกสภาพแวดล้อมในกลุ่ม

เมื่อต้องการปิด ACP ในทุกสภาพแวดล้อมในกลุ่ม ก่อนอื่นให้เอากฎออกจากนโยบายของกลุ่ม (ตัวอย่างก่อนหน้า) จากนั้นทําซ้ําการลบสําหรับแต่ละนโยบายของแต่ละสภาพแวดล้อม อ่านนโยบายที่กำหนดให้กับแต่ละสภาพแวดล้อมจากการกำหนดสภาพแวดล้อมของสภาพแวดล้อมนั้น จากนั้นเรียกใช้ removeRule กับนโยบายนั้น ระบุรหัสสภาพแวดล้อมที่เป็นของกลุ่ม หรือแจกแจงโดยใช้ API การจัดการสภาพแวดล้อม

# 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"
    }
}

การเรียกใช้ต่อสภาพแวดล้อมremoveRuleเดียวกันทํางานกับ C# และ SDK Python ที่แสดงไว้ก่อนหน้านี้ ครอบการเรียกใช้ไว้ในลูปที่วนซ้ำผ่านรหัสสภาพแวดล้อมของกลุ่ม

นโยบายตัวเชื่อมต่อขั้นสูง
นโยบายตามกฎ - การอ้างอิง REST API
การรับรองความถูกต้อง
บทช่วยสอน: กำหนดบทบาทให้บริการหลัก
ภาพรวมความสามารถในการเขียนโปรแกรมและความสามารถในการขยาย