如何获取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三类方案均可实现。
实现步骤
该ProjectName Build Service (organization)属于服务主体类型,使用常规的用户、用户组查询命令无法获取到它的descriptor,需要先筛选服务主体类型的安全对象再做权限更新。
方案1:Azure DevOps CLI 实现
- 替换命令中组织名、项目名为实际值,拉取目标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
- 执行权限更新,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
相关产品推荐
相关产品推荐

