The estimated reading time 3 minutes
Find microsoft teams organization wide with guests included
Some may have read my previous article about finding guests in teams, see link.
Unfortunately, with the “normal” teams cmdlets only user-based queries can be dropped, so if my user is not a member of the team, then I also do not find the O365 group.
So I looked for another solution. In the internet I quickly found this link.
It took me a long way, but now I had to rebuild and adapt my complete script because I no longer want to work with get-team (which does not mean it’s bad).
Of course, before the script can be executed, it must be connected to Exchange Online. Also, the teams cmdlets are loaded and connected. See link
The script works only in the ISE environment!
Connect to the Online Services.
$UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection Import-PSSession $Session Import-Module MicrosoftTeams Connect-MicrosoftTeams -Credential $UserCredential
script
# .SYNOPSIS script to find all ms teams group with guest accounts .DESCRIPTION .EXAMPLE no parameters needed .Notes connect to exchange online first, delet the # at the beginnig of the scripts https://technet.microsoft.com/en-us/library/jj984289(v=exchg.160).aspx --------------------------------------------------------------------------------- Script: get-allteams-with-guest-0-2.ps1 Author: A. Koehler; blog.it-koehler.com ModifyDate: 04/07/2018 Usage: identify all teams groups in office 365 and get guests Version: 0.2 --------------------------------------------------------------------------------- #> ### start connection to exchange online and ms teams # Set-ExecutionPolicy RemoteSigned # $UserCredential = Get-Credential # $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection # Import-PSSession $Session # Import-Module MicrosoftTeams # Connect-MicrosoftTeams -Credential $UserCredential ##################################################################################################### #get all o365 groups from exchange online $o365groups = Get-UnifiedGroup -ResultSize unlimited #generate array $externalteams = @() $output = @() foreach ($o365group in $o365groups) { try { $teamschannels = Get-TeamChannel -GroupId $o365group.ExternalDirectoryObjectId $output += [pscustomobject]@{GroupId = $o365group.ExternalDirectoryObjectId; GroupName = $o365group.DisplayName; TeamsEnabled = $true} } catch { $ErrorCode = $_.Exception.ErrorCode switch ($ErrorCode) { "404" { $output += [pscustomobject]@{GroupId = $o365group.ExternalDirectoryObjectId; GroupName = $o365group.DisplayName; TeamsEnabled = $false} break; } "403" { $output += [pscustomobject]@{GroupId = $o365group.ExternalDirectoryObjectId; GroupName = $o365group.DisplayName; TeamsEnabled = $true} break; } default { Write-Error ("Unknown ErrorCode trying to 'Get-TeamChannel -GroupId {0}' :: {1}" -f $o365group, $ErrorCode) } } } } #search for teamenabled groups $teams = $output | Where-Object{$_.TeamsEnabled -eq $true} #count teams $number = $teams.Count #check if there are teams enabled groups available if($number -eq "0"){ Write-host "there are no teams in your organization" -ForegroundColor yellow } else{ #go through every team and search for external users foreach ($team in $teams){ #get groupid of the team $groupid = ($team.groupid) #search external users $users = (Get-UnifiedGroup -Identity $groupid | Get-UnifiedGroupLinks -LinkType Members | Where-Object {$_.Name -like "*#EXT#*"}) #count external users $extcount = ($users.count) #go through every team an put teamname and teammembers in custom object foreach ($extuser in $users){ #get displayname from team $teamext = (($o365groups | Where-Object {$_.ExternalDirectoryObjectId -eq "$groupid"}).DisplayName).ToString() $teamextcreatedate = (($o365groups | Where-Object {$_.ExternalDirectoryObjectId -eq "$groupid"}).WhenCreated).ToString() #get the external users $ext = $extuser.Name #create custom object $externalteams += [pscustomobject]@{ ExtUser = $ext TeamName = $teamext TeamsCreationDate = $teamextcreatedate GroupID = $groupid } } } #check if there are some teams with external users or not if ($extcount -eq "0"){ Write-host "there are no external user added to any team in your organization" -ForegroundColor yellow } else{ #show custom object in powershell $externalteams | Out-GridView -Title "external members in Teams" <# $Header = @" <style> TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;} TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;} </style> "@ $externalteams | ConvertTo-Html -Property ExtUser,TeamName,GroupID -Head $Header | Out-File -FilePath .\msteam-guests.html Invoke-Expression ".\msteam-guests.html" #> } }
Hei, thank you for your effort and idea.
Correct me if I am wrong, but I believe your $extcount is formulated wrond, if your last groupId has no external then the result will always be “0” and thus you never trigger the gridview.
Hi,
I think you are right, but this article is really old, meanwhile there are lot of other ways to find guest users. I’ll write an update for this article and do some new scripting.
Thanks for your comment.
Have fun.
Alexander