I have this powershell script where I want to fetch all teams and users and store it into a CSV file. it works perfectly for some of the teams, but for 90% of the teams the script throws an error “Cannot bind argument to parameter ‘GroupId’ because it is null”. When provided with a -DisplayName filter for a specific team, the script will find all users in the team without issue but without the filter it will not find that team.
$Result = @()
#Get all teams
$AllTeams= Get-Team -NumberOfThreads 10
$TotalTeams = $AllTeams.Count
$i = 0
#Iterate teams one by one and get channels
ForEach ($Team in $AllTeams)
{
$i++
Write-Progress -Activity "Fetching users for $($Team.Displayname)" -Status "$i out of $TotalTeams completed"
Try
{
#Get team users
$TeamUsers = Get-TeamUser -GroupId $Team.GroupId
#Iterate users one by one and add to the result array
ForEach ($TeamUser in $TeamUsers)
{
#Add user info to the result array
$Result += New-Object PSObject -property $([ordered]@{
TeamName = $Team.DisplayName
TeamVisibility = $Team.Visibility
UserName = $TeamUser.Name
UserPrincipalName = $TeamUser.User
Role = $TeamUser.Role
GroupId = $Team.GroupId
UserId = $Team.UserId
})
}
}
Catch
{
Write-Host "Error occurred for $($Team.Displayname)" -f Yellow
Write-Host $_ -f Red
}
}
#Export the result to CSV file
$Result | Export-CSV "C:\Temp\AllTeamUsersDoc.csv" -NoTypeInformation -Encoding UTF8
Is there some constraint for amount of calls per minute or something that I’m missing?
Where exactly should I insert this snippet?
If I run this like so
Connect-MicrosoftTeams
$Result = @()
#Get all teams
$AllTeams= Get-Team -NumberOfThreads 20
$AllTeams |
Select-Object -Property DisplayName, GroupId
ForEach ($Team in $AllTeams)
{
Write-Host $Team
}
I get a lot of “too many requests” errors.
Edit: I ran the script with 1 thread instead of 20, which returns a lot more teams than before. I guess the issue has been throttling all along. But even with 1 thread, not all teams are returned as expected. However, I don’t know how to control the speed of calls being executed through Get-Team. Any ideas?
That was not meant to be inserted in your script at all … it was just to check if the query $AllTeams= Get-Team -NumberOfThreads 20 returns all desired information.
Did you try to run it with omitting the parameter -NumberOfThreads?
Unfortunately not. Sorry. As I said I don’t have experiences wiht or access to a Teams infrastructure.
I see, thanks for trying though!
20 is the default value, so omitting it won’t help. I guess setting to 1 is my best guess now.
I’ll try making a workaround for now. Can’t believe I can’t find any information online about this issue.
I would still give Olaf’s suggestion a try. Just confirm you are in fact getting all the teams. If you are getting all teams into a variable, then the rest of the script should just work.
$allTeams = get-team
keep it simple. then see if $allTeams holds all teams.
Microsoft knows there are some large companies out there, think 100k or more employees. So, unless you work for one of those, or in the process of migrating a larger on prem exchange or sharepoint to the cloud, that you are getting some data suggests you are not running into throttling.