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

如何获取Azure DevOps中Build Service的subject id以配置权限

Azure DevOps CLI配置Build Service账号权限方案

问题场景

参考Stack Overflow上的Azure DevOps CLI权限配置相关回答,我已通过如下命令成功将Contributors组的Force Push权限更新为允许:

az devops security permission update `
    --id $namespaceId `
    --subject $subject `
    --token "$repoV2" `
    --allow-bit $bit `
    --merge true `
    --org https://dev.azure.com/$org/

提取组subject id的命令如下:

$subject = az devops security group list `
    --org "https://dev.azure.com/$org/" `
    --scope organization `
    --subject-types vssgp `
    --query "graphGroups[?@.principalName == 'ForcePush'].descriptor | [0]"

操作截图
当前需求是为ProjectName Build Service (organization)(即截图中红色问号标注项)授予Contribute (GenericContribute)权限。该主体既不属于普通用户也不属于常规用户组,被归类在用户分类下,可通过命令行方案修改权限,az devops cli、REST API、Graph API三类方案均可实现。
Build Service项截图

实现步骤

该ProjectName Build Service (organization)属于服务主体类型,使用常规的用户、用户组查询命令无法获取到它的descriptor,需要先筛选服务主体类型的安全对象再做权限更新。

方案1:Azure DevOps CLI 实现

  1. 替换命令中组织名、项目名为实际值,拉取目标Build Service的descriptor:
# 配置基础参数
$org = "你的Azure DevOps组织名"
$projectName = "你的项目名"
$targetDisplayName = "$projectName Build Service ($org)"

# 查询服务主体类型的安全对象,匹配目标名称获取descriptor
$subject = az rest `
    --method get `
    --url "https://vssps.dev.azure.com/$org/_apis/graph/subjects?subjectTypes=svcsp&api-version=7.1-preview.1" `
    --query "value[?@.displayName == '$targetDisplayName'].descriptor | [0]" `
    --output tsv
  1. 执行权限更新,Git仓库命名空间下GenericContribute对应的权限位值为4,Git仓库命名空间固定ID为2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87:
# 配置权限参数
$namespaceId = "2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87"
$repoV2 = "repoV2/[你的项目ID]/[你的仓库ID]/" # 替换为实际仓库token
$allowBit = 4 # 对应GenericContribute权限

# 执行权限更新
az devops security permission update `
    --id $namespaceId `
    --subject $subject `
    --token "$repoV2" `
    --allow-bit $allowBit `
    --merge true `
    --org "https://dev.azure.com/$org/"

方案2:直接调用REST API实现

如果不需要CLI封装,可直接调用Azure DevOps权限更新接口完成配置:

# 基础参数配置
$org = "你的Azure DevOps组织名"
$subjectDescriptor = "上一步获取的Build Service descriptor"
$namespaceId = "2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87"
$repoToken = "repoV2/[你的项目ID]/[你的仓库ID]/"

# 构造请求体
$requestBody = @{
    token = $repoToken
    merge = $true
    accessControlEntries = @(
        @{
            descriptor = $subjectDescriptor
            allow = 4
            deny = 0
            extendedInfo = @{}
        }
    )
} | ConvertTo-Json -Depth 5

# 发送权限更新请求
az rest `
    --method post `
    --url "https://dev.azure.com/$org/_apis/accesscontrolentries/$namespaceId?api-version=7.1-preview.1" `
    --body $requestBody `
    --headers @{"Content-Type" = "application/json"}

权限校验

执行完命令后可通过如下命令回查权限配置是否生效:

az devops security permission show `
    --id $namespaceId `
    --subject $subject `
    --token "$repoV2" `
    --org "https://dev.azure.com/$org/"

返回结果中allow位包含4即代表GenericContribute权限已成功授予。

内容的提问来源于stack exchange,提问作者Maytham Fahmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:18:24