Générer une liste des équipes Teams, leurs canaux, les propriétaires, membres … avec Power Automate ou PowerShell

Objectif :

Je souhaitais générer ce type de liste :

excelteams

 Premier essai, avec Power Automate

pa

Je me suis lancé dans la mise en oeuvre de la génération d’un excel avec Power Automate, cela ressemblait à cela :

 pa2

Pour établir la liste, cela peut suffire mais à l’heure où j’écris ce tuto, Power Automate ne sait pas encore extraire les membres, les propriétaires ni savoir si le canal ou l’équipe sont privés. Cela ne me convient donc pas, j’ai cherché une autre solution.

Second essai, utiliser PowerShell

Revenir aux outils puissants en ligne de commande est souvent le réflexe des informaticiens, et je n’ai pas été déçu avec le module MicrosoftTeams pour PowerShell.

Utilisant Jeedom, j’ai cherché à tester PowerShell adapté à Raspbian. Cela pour l’installer sur un Raspi3B+ qui héberge déja Jeedom.

J’ai deux Jeedoms, un en prod et un en dev, un sous Stretch et un sous Buster. Dans les docs de Microsoft, il est spécifié d’utiliser Stretch, chez moi, cela fonctionne sur les deux (pour ce que j’ai testé).

Installation de PowerShell Core

Se demander si on installe une version 32bits ou 64bits est la première étape, pour cela, taper :

uname -m

Toute valeur en dessous de ARMv7 sont en 32 bit.
La version 64 bit commence à AMRv8.

La dernière version de powershell peut être trouvée sur https://github.com/PowerShell/PowerShell pour Raspbian.Version 7.1.0 au jour de rédaction de ce tuto.

Si une version ancienne ou posant souci est déjà installée, il faut la supprimer par :

rm -rf ~/powershell

Lancer l’installation (mettre à jour le N° de version)

sudo su -
apt-get install '^libssl1.0.[0-9]$' libunwind8 -y
wget https://github.com/PowerShell/PowerShell/releases/download/v7.1.0/powershell-7.1.0-linux-arm32.tar.gz
mkdir ~/powershell
tar -xvf ./powershell-7.1.0-linux-arm32.tar.gz -C ~/powershell
sudo ~/powershell/pwsh -c New-Item -ItemType SymbolicLink -Path "/usr/bin/pwsh" -Target "$PSHOME/pwsh" -Force
Pour lancer PowerShell
~/powershell/pwsh
Pour vérifier la version
$psversiontable

Dans PowerShell, installer Module MicrosoftTeams

Uninstall-Module -Name MicrosoftTeams
Install-Module -Name MicrosoftTeams -AllowPrerelease
Import-Module MicrosoftTeams

Faire les premiers essais en ligne de commande

Pour vérifier la version et la bonne installation de MicrosoftTeams :

get-module | ft name, version

Faire un essai en récupérant la liste des équipes Teams

Connect-MicrosoftTeams

Nota : Depuis peu, une erreur xdg-open bloque l’identification, j’ai dû m’identifier par un script en utilisant Credential

Afficher la liste des commandes du Module MiscrosoftTeams

get-command -Module MicrosoftTeams

Suivre les instructions en jaune pour s’identifier

$AllTeams = Get-Team 
Write-Output $AllTeams

La liste des équipes doivent s’afficher

Installer PSFTP

Pour envoyer un fichier généré par Powershell sur un serveur FTP, le plus simple est d’installer PSFTP (Dans PowerShell)

apt-get install PSFPT

Lancer un script en ligne de commande

Pour lancer le script teams_sigalou.ps1, utiliser cette commande :

~/powershell/pwsh -File "teams_sigalou.ps1"

Générer un CSV avec la liste des équipes Teams

Après de multiples essais, voici le dernier script, n’hésitez pas à l’adapter.

# Script de génération de la liste des équipes Teams et export dans un fichier CSV puis envoie de ce fichier par FTP pour être exploité par un fichier Excel
# Réalisé par Sigalou 06/12/2020 sigalou@@@sigalou-domotique.fr
# Utilisez GitHub ou le mail pour toutes questions, demandes d'amélioration et n'hésitez pas à proposer des améliorations
# Merci de laisser ces lignes
# Source : http://jeedom.sigalou-domotique.fr/generer-une-liste-des-equipes-teams-leurs-canaux-les-proprietaires-membres
# ou https://github.com/sigalou/MicrosoftTeamstoCSV

# Identification FPT
    param([string]$UserName, [string]$Password, [switch]$MFA,[int]$Action) 
    $passwordFTP = ConvertTo-SecureString -AsPlainText "xxxxx" -Force
    $credentialsFTP = New-Object System.Management.Automation.PSCredential "xxxxx_ftp", $passwordFTP
    Import-Module PSFTP

# Identification M365
    $UserName = "[email protected]"
    $Password = "xxxx"

#Connect to Microsoft Teams
    $Module=Get-Module -Name MicrosoftTeams -ListAvailable 
    if($Module.count -eq 0)
    {
     Write-Host MicrosoftTeams module is not available  -ForegroundColor yellow 
     $Confirm= Read-Host Are you sure you want to install module? [Y] Yes [N] No
     if($Confirm -match "[yY]")
     {
      Install-Module MicrosoftTeams
     }
     else
     {
      Write-Host MicrosoftTeams module is required.Please install module using Install-Module MicrosoftTeams cmdlet.
      Exit
     }
    }
    Write-Host `n`n`n`n`n`nLancement ... -ForegroundColor Yellow

    #Autentication using MFA
    if($mfa.IsPresent)
    {
     $Team=Connect-MicrosoftTeams
    }
    #Authentication using non-MFA
    else
    {
     #Storing credential in script for scheduling purpose/ Passing credential as parameter
     if(($UserName -ne "") -and ($Password -ne ""))
     {
      $SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
      $Credential  = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword
      $Team=Connect-MicrosoftTeams -Credential $Credential
     }
     else
     {  
      $Team=Connect-MicrosoftTeams
     }
    }

    #Check for Teams connectivity
    If($Team -ne $null)
    {
     Write-host `nConnecté avec succès à Microsoft Teams -ForegroundColor Green
    }
    else
    {
     Write-Host Error occurred while creating Teams session. Please try again -ForegroundColor Red
     exit
    }

    # Mettre $True pour avoir un debug à l'ecran pour suivre la génération
    $modeDEBUG=$False
    $Result=""  
    $Results=@() 
    $Path="./TeamsData.csv"
    If (Test-Path $Path){
    Remove-Item $Path
    }
    Write-Host `nRécupération des données...
    $Count=0
    $Teams=Get-Team -Visibility Private 
    $nbTeamsPrivate=$Teams.Count
    #$Teams=Get-Team -Visibility Public -User [email protected]
    $Teams=Get-Team -Visibility Public 
    $nbTeams=$Teams.Count
    $ColA=$nbTeams.ToString()+"-"+$nbTeamsPrivate.ToString()
    $Result=@{'ColA'=$ColA;'ColB'="Actualisation du $((Get-Date -format 'dd-MM-yyyy` HH:mm').ToString())";}
    $Results= New-Object psobject -Property $Result
    $Results | select 'ColA','ColB' | Export-Csv $Path -NoTypeInformation -Append
    Write-Host `nTraitement des données...
    $Teams | Sort-Object DisplayName | foreach {
        $compteurLignes=0
        $TeamName=$_.DisplayName
        $Description=$_.Description
        $GroupId=$_.GroupId
        $TeamUser=Get-TeamUser -GroupId $GroupId
        $TeamMemberCount=$TeamUser.Count
        $TeamPrefix=""
        $mettreVirgule=0
        $NomProprio=""
        $TouslesProprios=$TeamUser| Where-Object { $_.Role -eq 'Owner' }
        $TouslesProprios | foreach {
            if ($mettreVirgule -eq 1) {
                $mettreVirgule=0 
                $NomProprio=$NomProprio+", "
            }
            $NomProprio=$NomProprio+$_.Name
            $mettreVirgule=1
        }
        $NomProprio=$NomProprio+" et "+$TeamMemberCount+" membres"
        if ($TeamMemberCount -gt 80) {
           $NomProprio=""
           $TeamPrefix="🌐 "
           } 
        if ($_.Archived -eq "True") {
           $TeamPrefix="🗄️ "
           $NomProprio="[ Archivée ]"
           } 
        If($Description -eq $TeamName) {$Description=""}
        Write-Progress -Activity "   $Count/$nbTeams $TeamName "
        if ($modeDEBUG) { Write-Host `n╔═══════[$TeamName] $Description -ForegroundColor green}
        $Count++
        Get-TeamChannel -MembershipType Standard -GroupId $GroupId | foreach {
            $ChannelName=$_.DisplayName
            If($ChannelName -ne "general") {
                Write-Progress -Activity "   $Count/$nbTeams $TeamName // $ChannelName"
                #$Description=$_.Description
                if ($modeDEBUG) { Write-Host ╠═══> [$ChannelName] $ChannelMemberCount $Description}
                $Result=@{'ColA'="";'ColB'=$ChannelName;}
            } else {
                $Result=@{'ColA'=$TeamPrefix+$TeamName;'ColB'=$NomProprio;}
            }
            $Results= New-Object psobject -Property $Result
            $Results | select 'ColA','ColB' | Export-Csv $Path -NoTypeInformation -Append
            $compteurLignes++
        } 
        $canauxprives=Get-TeamChannel -MembershipType Private -GroupId $GroupId
        $canauxprivescount=$canauxprives.Count
        If($canauxprivescount -eq "1") {
            if ($modeDEBUG) { Write-Host ╠═══> +$canauxprivescount canal privé }
            $Result=@{'ColA'="";'ColB'="+1 canal privé";'ColC'="";'ColD'="";}
            $Results= New-Object psobject -Property $Result
            $Results | select 'ColA','ColB' | Export-Csv $Path -NoTypeInformation -Append
            $compteurLignes++
        }
        elseIf($canauxprivescount -gt 1) {
            if ($modeDEBUG) { Write-Host ╠═══> +$canauxprivescount canaux privés }
            $Result=@{'ColA'="";'ColB'="+$canauxprivescount canaux privés";}
            $Results= New-Object psobject -Property $Result
            $Results | select 'ColA','ColB' | Export-Csv $Path -NoTypeInformation -Append
            $compteurLignes++
        }
        if ($compteurLignes -eq '1') {
            if ($modeDEBUG) { Write-Host ╠═══> On ajoute une ligne vide }
            $Result=@{'ColA'="";'ColB'=" ";}
            $Results= New-Object psobject -Property $Result
            $Results | select 'ColA','ColB' | Export-Csv $Path -NoTypeInformation -Append
            }
        if ($modeDEBUG) { Write-Host ╚══════════════════════════════════════════════════════ -ForegroundColor green }
    }
    Write-Progress -Activity "`n     Processed Teams count: $Count "`n"  Currently Processing: $TeamName  `n Currently Processing Channel: $ChannelName"  -Completed
    if((Test-Path -Path $Path) -eq "True") 
    {
    Write-Host `nReport available in $Path -ForegroundColor Green
    }
      
    Disconnect-MicrosoftTeams
    
# Envoyer le fichier TeamsData.csv dans ftp 
    Set-FTPConnection -Credentials $credentialsFTP -Server ftp.xxxx.org -Session FloFTP -ignoreCert -UseBinary -KeepAlive
    $Session = Get-FTPConnection -Session FloFTP
    Get-ChildItem ".\TeamsData.csv" | Add-FTPItem -Session $Session -Path /Teams/ -Overwrite      

Laisser un commentaire