【问题标题】:Get all users under all projects from Azure DevOps从 Azure DevOps 获取所有项目下的所有用户
【发布时间】:2020-09-03 14:29:48
【问题描述】:

我正在尝试让所有用户参与几个项目。情况是用户很多,我需要使用continuationToken。结果很混乱,因为我的逻辑很糟糕。我不知道如何使用第二个 foreach..

$outputItems = @()

foreach ($project in $projects) {
    $uriProjectDescriptor = "https://vssps.dev.azure.com/$OrganizationName/_apis/graph/descriptors/$($project.id)?api-version=5.0-preview.1"
    $projectDescriptor = Invoke-RestMethod -Uri $uriProjectDescriptor -Method Get -Headers $AzureDevOpsAuthenicationHeader
    $descriptors = $projectDescriptor.value

    foreach ($descriptor in $descriptors) {
    do
    {
        $uriUsers="https://vssps.dev.azure.com/$OrganizationName/_apis/graph/users?continuationToken=$continuationToken&scopeDescriptor=$($descriptor)&api-version=6.0-preview.1"
        $responseUsers=Invoke-WebRequest -Uri $uriUser -Method Get -ContentType "application/json" -Headers $AzureDevOpsAuthenicationHeader -UseBasicParsing -MaximumRedirection 0
        $continuationToken = $responseUsers.Headers.'x-ms-continuationtoken'
        $userSet = $responseUsers.content | ConvertFrom-Json
        $users += $userSet.value.Count
        $arealList = New-Object -TypeName PSObject -Property @{
            CountUsers = $users.Count
         } | Select-Object "CountUsers"
         $outputItems += $arealList
         $arealList = $null
    }
    while (($continuationToken))
    $ProgressPreference = 'Continue'
    }  
} $outputItems

【问题讨论】:

  • 嗨@Baequiraheal。这张票有更新吗?如果答案可以给你一些帮助,请随时告诉我。只是提醒this。谢谢。

标签: powershell azure-devops-rest-api


【解决方案1】:

您可以尝试以下 Powershell 脚本:

$token = "PAT"

$url="https://dev.azure.com/{Organizationname}/_apis/projects?api-version=6.0"


$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))

$responses = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json


ForEach ($response in $responses.value.id)
{
   

   $url1="https://vssps.dev.azure.com/{Organizationname}/_apis/graph/descriptors/$($response)?api-version=6.0-preview.1"

   $Descriptor = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json

   ForEach ($Descriptor1 in $Descriptor.value)
   {

     do
    {
      $url2="https://vssps.dev.azure.com/{Organizationname}/_apis/graph/users?scopeDescriptor=$($Descriptor1)&api-version=6.0-preview.1"

      $UserLists = Invoke-RestMethod -Uri $url2 -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json
      $continuationToken = $UserLists.Headers.'x-ms-continuationtoken'
   
    }
    while ($continuationToken -ne $null)
  
    Write-Host "result = $($UserLists | ConvertTo-Json -Depth 100)"
   }

} 

说明:

first Rest API 用于获取项目名称。

然后使用second Rest API获取描述符。

third Rest api 用于获取用户列表。

我使用foreach嵌套来实现响应Rest API的循环。

更新:

用continuationToken进行测试,项目返回的对象最大值为500。

我找到了另一个 Rest Api User Entitlements - List 来获取用户。

https://vsaex.dev.azure.com/Organization Name/_apis/userentitlements?top=10000&select=project&api-version=4.1-preview.1

这个Rest APi可以直接返回组织下的用户(Project Scope)。最大值为 10000。

【讨论】:

  • 我试过了,但最大用户数还是 500,似乎 continuationToken 不起作用
  • @Baequiraheal。是的。我再次测试它,最大值确实是500。似乎continuationToken有限制。我找到了另一个可以直接返回10000的rest api。请检查更新。
猜你喜欢
  • 2020-11-11
  • 2020-07-18
  • 2020-07-20
  • 2020-01-18
  • 2019-12-07
  • 2020-07-11
  • 1970-01-01
  • 2022-01-11
  • 2022-01-09
相关资源
最近更新 更多