You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#编程将Service Principal批量分配到Power BI工作区

Power BI 服务主体批量分配工作区权限实现方案

完全可以通过编程方式实现服务主体的全工作区权限批量分配,核心依赖Power BI官方提供的REST API,以下是可直接落地的两种实现方案:

前置准备

操作前需要先完成以下配置,否则会出现接口鉴权失败问题:

  • 首先在Power BI管理中心开启服务主体API访问权限:路径为租户设置 -> 开发者设置 -> 允许服务主体使用Power BI API,该设置需要租户全局管理员或Power BI服务管理员开启
  • 在AAD中为你的服务主体授予Workspace.ReadWrite.All或Tenant.ReadWrite.All的应用权限,权限配置完成后需要点击「授予管理员同意」完成生效
  • 提前留存三个必要信息:服务主体的客户端ID、客户端密钥、所属AAD租户ID、服务主体的AAD对象ID

方案1:PowerShell 脚本实现(最常用,适合Windows环境运维人员)

使用微软官方发布的Power BI Management模块完成操作:

  1. 安装Power BI管理模块
Install-Module -Name MicrosoftPowerBIMgmt -Scope CurrentUser
  1. 使用服务主体鉴权登录Power BI服务
$clientId = "替换为你的服务主体客户端ID"
$clientSecret = "替换为你的服务主体客户端密钥"
$tenantId = "替换为你的AAD租户ID"

$secureSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($clientId, $secureSecret)
Connect-PowerBIServiceAccount -ServicePrincipal -Credential $credential -Tenant $tenantId
  1. 批量分配工作区权限
$spObjectId = "替换为你的服务主体AAD对象ID"
$assignRole = "Admin" # 可根据需求替换为Member/Contributor/Viewer

# 获取租户下所有非个人工作区
$allWorkspaces = Get-PowerBIWorkspace -All | Where-Object {$_.Type -ne "PersonalGroup"}

foreach ($workspace in $allWorkspaces) {
    Add-PowerBIWorkspaceUser -WorkspaceId $workspace.Id -AccessRight $assignRole -PrincipalType App -Identifier $spObjectId
    Write-Host "已完成工作区"$workspace.Name"的权限分配"
}

方案2:Python 脚本实现(适合跨环境自动化流程集成)

通过调用原生Power BI REST API实现,可直接集成到现有自动化流水线中:

  1. 安装依赖包
pip install msal requests
  1. 执行脚本
import msal
import requests

# 替换为你的实际配置信息
CLIENT_ID = "服务主体客户端ID"
CLIENT_SECRET = "服务主体客户端密钥"
TENANT_ID = "AAD租户ID"
SP_OBJECT_ID = "服务主体AAD对象ID"
ASSIGN_ROLE = "Admin" # 可自定义角色

# 鉴权获取访问令牌
app = msal.ConfidentialClientApplication(
    client_id=CLIENT_ID,
    client_credential=CLIENT_SECRET,
    authority=f"https://login.microsoftonline.com/{TENANT_ID}"
)
token_result = app.acquire_token_for_client(scopes=["https://analysis.windows.net/powerbi/api/.default"])
access_token = token_result["access_token"]
req_headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
}

# 获取所有非个人工作区
workspace_resp = requests.get(
    url="https://api.powerbi.com/v1.0/myorg/admin/groups?$filter=type ne 'PersonalGroup'&$top=5000",
    headers=req_headers
)
all_workspaces = workspace_resp.json()["value"]

# 批量分配权限
for ws in all_workspaces:
    add_perm_url = f"https://api.powerbi.com/v1.0/myorg/admin/groups/{ws['id']}/users"
    payload = {
        "identifier": SP_OBJECT_ID,
        "groupUserAccessRight": ASSIGN_ROLE,
        "principalType": "App"
    }
    resp = requests.post(add_perm_url, headers=req_headers, json=payload)
    if resp.status_code == 200:
        print(f"工作区{ws['name']}权限分配成功")
    else:
        print(f"工作区{ws['name']}分配失败,错误信息:{resp.text}")

注意事项

  • 批量操作前建议先注释循环逻辑,测试单个工作区的权限分配是否符合预期,再全量执行
  • 如果租户工作区总数超过5000,需要自行处理API的分页逻辑,通过$skip参数拉取全量数据
  • 可以根据业务需求添加工作区过滤逻辑,跳过不需要分配权限的特殊工作区

内容的提问来源于stack exchange,提问作者Neehar Gadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:48:03