Powershell 从Azure DevOps获取所有项目下的所有用户

Powershell 从Azure DevOps获取所有项目下的所有用户,powershell,azure-devops-rest-api,Powershell,Azure Devops Rest Api,我正试图让所有的用户在两个项目下。情况是,在用户下有很多,我需要使用continuationToken。结果很混乱,因为我的逻辑不好。我不知道如何使用第二个foreach $outputItems = @() foreach ($project in $projects) { $uriProjectDescriptor = "https://vssps.dev.azure.com/$OrganizationName/_apis/graph/descriptors/$($pro

我正试图让所有的用户在两个项目下。情况是,在用户下有很多,我需要使用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

这是未经测试的,因为我不是在工作机器上,所以如果我在这里偏离了目标或把事情弄糟了,我表示歉意,但我认为这里的函数与您的重复操作会使您尝试做的更清楚

#输出数组
$OutputItems=@()
#用于获取描述符用户的可重复函数-在代码的主要部分之前定义此函数。
函数获取项目用户{
Param(
[参数(必需=$true)][字符串]$Descriptor,
[参数(必需=$false)][字符串]$ContinuationToken
)
#如果已传递延续令牌,则需要将其添加到API URI中。
if($PSBoundParameters.ContainsKey(“ContinuationToken”)){
$UriUsers=”https://vssps.dev.azure.com/$script:OrganizationName/_api/graph/users?continuationToken=$continuationToken&scopeDescriptor=$Descriptor&api version=6.0-preview.1“
}
否则{
$UriUsers=”https://vssps.dev.azure.com/$script:OrganizationName/_api/graph/users?scopeDescriptor=$Descriptor&api版本=6.0-preview.1“
}
#调用web请求并将自定义对象添加到输出数组中。
$Response=Invoke WebRequest-Uri$UriUsers-Method Get-ContentType“application/json”-Headers$script:AzureDevpAuthenticationheader-UseBasicParsing-MaximumRedirection 0
$UserSet=$Response.Content |从Json转换
$script:OutputItems+=[PSCustomObject]@{
CountUsers=$UserSet.Value.Count
}
#如果继续令牌存在,则返回它,以便我们可以继续调用API,直到没有其他记录为止。
if(![string]::IsNullOrEmpty($Response.Headers.x-ms-continuationtoken')){
返回$Response.Headers.'x-ms-continuationtoken'
}
否则{
返回$null
}
}
#主代码。
foreach($项目中的项目){
$UriProjectDescriptor=”https://vssps.dev.azure.com/$OrganizationName/_api/graph/descriptors/$($Project.id)?api版本=5.0-preview.1“
$ProjectDescriptor=调用RestMethod-Uri$UriProjectDescriptor-Method Get-Headers$AzureDevPSAuthenticationHeader
$Descriptors=$ProjectDescriptor.value
#在有延续令牌之前,我们不需要运行do循环。
foreach($描述符中的描述符){
$Repeat=获取项目用户-描述符$Descriptor
#如果Repeat不为null,我们可以使用do循环调用函数,直到它返回null。
如果($null-ne$重复){
做{
$Repeat=Get ProjectUsers-Descriptor$Descriptor-ContinuationToken$Repeat
}直到($null-相等$Repeat)
}
}
}

您可以尝试以下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)"
   }

} 
解释:

用于获取项目名称

然后,使用

用于获取用户列表

我使用foreach嵌套来实现对restapi的响应循环

更新:

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

我找到了另一个RESTAPI来获取用户

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

这个RESTAPI可以直接返回组织(项目范围)下的用户。最大值为10000。

如何在函数中传递项目描述符?抱歉,这对我来说还是一个新问题,如何将用户数作为输出传递给每个组?描述符通过一个函数参数传递,如
#Main code
下的示例,其中一行是
$Repeat=Get ProjectUsers-Descriptor$Descriptor
。用户计数是通过自定义对象添加到输出数组的函数中的,它的代码行数比您的问题中的代码行数要少-
$script:OutputItems+=[PSCustomObject]@{CountUsers=$UserSet.Value.Count}
。您可能希望传递的不仅仅是计数,比如描述符名称,或者只是一个计数列表。虽然我不想这么想,但我试过了,但以你的方式和凯文的方式,续集令牌由于某种原因不起作用。我仍然在排除故障,也许您遇到了一些超出延续标记的其他限制。我会查看文档,看看是否还有其他的例子。这张票有更新吗?如果答案能给你一些帮助,请随时告诉我。只是提醒一下。谢谢。我试过了,但是最大用户数是500,似乎continuationToken不是working@Baequiraheal. 对我再次测试它,最大值确实是500。continuationToken似乎有局限性。我发现另一个RESTAPI可以直接返回10000。请检查更新。