Objectif :
Je souhaitais générer ce type de liste :
Premier essai, avec Power Automate
Je me suis lancé dans la mise en oeuvre de la génération d’un excel avec Power Automate, cela ressemblait à cela :
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
~/powershell/pwsh
$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 = "xxxxx@xxxxx.com" $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 xxxxx@xxxxxxxxxxxxxxxx.fr $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