通过 API 或脚本从 Azure DevOps 组织的访问级别删除直接访问

问题描述 投票:0回答:1

我需要通过 API 或脚本从 Azure DevOps 组织的访问级别删除直接访问方面的帮助,使用选择功能,我们只能删除 100 个用户,但我们有超过 4ooo 个用户。

要求:一种仅删除直接访问的机制,因此强制执行组规则。

谢谢

尝试从 UI 中删除成员,但我们只能删除数百个成员,而且当项目管理员将成员添加到任何 Azure DevOps 项目时,利益相关者也会将直接访问权限分配给成员。

我们对访问级别使用组规则,但直接访问优先,当直接为多个用户分配项目权限时,我们必须删除对多个用户的直接访问权限。

azure-devops azure-devops-rest-api azure-devops-extensions
1个回答
0
投票

没有公开记录的 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 组织中每个用户的直接分配:

  1. 调用API“会员权利-搜索会员权利”列出组织中的所有用户。

  2. 循环调用上述API以删除每个用户的直接分配。

  3. 注意: 组织所有者无法删除直接分配。这也无法在 Azure DevOps 的 Web UI 上手动删除。所以,在循环中调用API时,还需要排除组织所有者。

  4. 下面是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 都可以正常工作。

    enter image description here


© www.soinside.com 2019 - 2024. All rights reserved.