我需要通过 API 或脚本从 Azure DevOps 组织的访问级别删除直接访问方面的帮助,使用选择功能,我们只能删除 100 个用户,但我们有超过 4ooo 个用户。
要求:一种仅删除直接访问的机制,因此强制执行组规则。
谢谢
尝试从 UI 中删除成员,但我们只能删除数百个成员,而且当项目管理员将成员添加到任何 Azure DevOps 项目时,利益相关者也会将直接访问权限分配给成员。
我们对访问级别使用组规则,但直接访问优先,当直接为多个用户分配项目权限时,我们必须删除对多个用户的直接访问权限。
没有公开记录的 Azure DevOps CLI/API 可用于删除直接分配。
但是,当我尝试在 Azure DevOps 的 Web UI 上手动删除直接分配(组织设置 > 用户)时,如果我从
Developer tools
打开浏览器的“
Network
”窗口选项卡,我可以看到下面的API被调用。
HTTP URI
POST https://vsaex.dev.azure.com/<organization>/_apis/MEMInternal/RemoveExplicitAssignment?select=grouprules&ruleOption=0&api-version=5.0-preview.1
请求正文
[
"<user ID>"
]
下面我将分享一个 PowerShell 脚本示例,以展示如何使用上述 API 删除 Azure DevOps 组织中每个用户的直接分配:
调用API“会员权利-搜索会员权利”列出组织中的所有用户。
循环调用上述API以删除每个用户的直接分配。
注意: 组织所有者无法删除直接分配。这也无法在 Azure DevOps 的 Web UI 上手动删除。所以,在循环中调用API时,还需要排除组织所有者。
下面是PowerShell脚本。我已经尝试过,可以正常工作。
$organization = "xxxx" # Name of your Azure DevOps organization.
$ownerMailAddress = "xxxx" # Email address of organization owner.
$pat = "xxxx" # Your Personal Access Token.
$base64Token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "", $pat)))
$headers = @{
Authorization = "Basic $base64Token"
"Content-Type" = "application/json"
}
$continuationToken = "first_api_call"
while ($continuationToken -ne $null)
{
$uri_list_users = $null
if ("$continuationToken" -eq "first_api_call") {
$uri_list_users = "https://vsaex.dev.azure.com/${organization}/_apis/memberentitlements?api-version=7.1-preview.2"
}
else {
$uri_list_users = "https://vsaex.dev.azure.com/${organization}/_apis/memberentitlements?continuationToken=${continuationToken}&api-version=7.1-preview.2"
}
# List all users in the Azure DevOps organization.
$users = Invoke-RestMethod -Method GET -Uri $uri_list_users -Headers $headers
# Remove direct assignments for each user, exclude the organization owner.
foreach ($user in $users.items)
{
$userMailAddress = $user.member.mailAddress
if ("$userMailAddress" -ne "$ownerMailAddress")
{
Write-Host "-----------------------------------"
Write-Host "Remove direct assignments for user:"
$userName = $user.member.displayName
$userId = $user.id
Write-Host $userName
Write-Host $userId
$uri_remove_direct_assign = "https://vsaex.dev.azure.com/${organization}/_apis/MEMInternal/RemoveExplicitAssignment?select=grouprules&ruleOption=0&api-version=5.0-preview.1"
$body = @($userId) | ConvertTo-Json -Depth 5 -AsArray
Invoke-RestMethod -Method POST -Uri $uri_remove_direct_assign -Headers $headers -Body $body
}
}
$continuationToken = $users.continuationToken
}
您需要将以下信息传递给脚本:
将 Azure DevOps 组织的名称传递给变量“
$organization
”。
将组织所有者的电子邮件地址传递给变量“
$ownerMailAddress
”。您可以在“组织设置”>“概览”页面找到组织所有者的姓名和电子邮件。
将用户的 PAT(个人访问令牌)传递给变量“
$pat
”。用户应该是 PCA(Project Collection Administrators)组的成员。默认情况下,组织所有者是 PCA。
注意: 当我将 PAT 的范围设置为“
Member Entitlement Management (Read & write)
”时,它可以成功调用第一个 API 列出所有用户,但在调用第二个 API 删除直接时出现 401 错误作业。当我将范围更改为“Full access
”后,所有 API 都可以正常工作。