{"id":434,"date":"2020-06-07T07:00:02","date_gmt":"2020-06-07T07:00:02","guid":{"rendered":"http:\/\/jeedom.sigalou-domotique.fr\/generer-une-liste-des-equipes-teams-leurs-canaux-les-proprietaires-membres"},"modified":"2024-04-21T13:14:56","modified_gmt":"2024-04-21T11:14:56","slug":"generer-une-liste-des-equipes-teams-leurs-canaux-les-proprietaires-membres","status":"publish","type":"post","link":"https:\/\/www.sigalou-domotique.fr\/de\/generer-une-liste-des-equipes-teams-leurs-canaux-les-proprietaires-membres","title":{"rendered":"Erstellen einer Liste von Teams, ihren Kan\u00e4len, Besitzern, \u2026-Mitgliedern mit Power Automate oder PowerShell"},"content":{"rendered":"<h1>Ziel:<\/h1>\n<p>Ich wollte diese Art von Liste erstellen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-431\" src=\"http:\/\/jeedom.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams.png\" alt=\"excelteams\" width=\"1396\" height=\"411\" srcset=\"https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams.png 1396w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams-600x177.png 600w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams-300x88.png 300w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams-1024x301.png 1024w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams-768x226.png 768w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/excelteams-1200x353.png 1200w\" sizes=\"auto, (max-width: 1396px) 100vw, 1396px\" \/><\/p>\n<p><!--more--><\/p>\n<h1>&nbsp;Erster Test mit Power Automate<\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-432\" src=\"http:\/\/jeedom.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/pa.png\" alt=\"pa\" width=\"295\" height=\"157\"><\/p>\n<p>Ich begann mit der Umsetzung der Generierung eines Excel mit Power Automate, das sah so aus:<\/p>\n<table border=\"2\">\n<tbody>\n<tr>\n<td>&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-433\" src=\"http:\/\/jeedom.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/pa2.png\" alt=\"pa2\" width=\"668\" height=\"632\" srcset=\"https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/pa2.png 668w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/pa2-600x568.png 600w, https:\/\/www.sigalou-domotique.fr\/wp-content\/uploads\/2020\/06\/pa2-300x284.png 300w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Um die Liste zu erstellen, kann dies ausreichen, aber zu dem Zeitpunkt, zu dem ich dieses Tutorial schreibe, <strong>Power Automate wei\u00df es noch nicht<\/strong> Entnahme von Mitgliedern, Eigent\u00fcmern oder Informationen dar\u00fcber, ob der Kanal oder das Team privat ist. Das passt mir also nicht, ich habe nach einer anderen L\u00f6sung gesucht.<\/p>\n<h1>Zweiter Versuch, PowerShell verwenden<\/h1>\n<p>Die R\u00fcckkehr zu leistungsstarken Befehlszeilen-Tools ist oft der Reflex von IT-Spezialisten, und ich wurde nicht entt\u00e4uscht mit <strong>das MicrosoftTeams-Modul f\u00fcr PowerShell<\/strong>.<\/p>\n<p>Unter Verwendung <a href=\"http:\/\/jeedom.sigalou-domotique.fr\/jeedom\">Jeedom<\/a>, Ich habe versucht, PowerShell f\u00fcr Raspbian zu testen. Dies geschieht, um es auf einem Raspi3B+ zu installieren, auf dem bereits Jeedom gehostet wird.<\/p>\n<p>Ich habe zwei Jeedoms, einen in prod und einen in dev, einen unter <strong>Stretch<\/strong> und ein Sub <strong>Buster<\/strong>. In den<a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/scripting\/install\/installing-powershell-core-on-linux?view=powershell-7#raspbian\" target=\"_blank\" rel=\"noopener noreferrer\"> Microsoft-Dokumente<\/a>, es wird angegeben, Stretch zu verwenden, zu Hause funktioniert es auf beiden (f\u00fcr das, was ich getestet habe).<\/p>\n<h2>Installation von PowerShell Core<\/h2>\n<p>Die Frage, ob eine 32-Bit- oder eine 64-Bit-Version installiert wird, ist der erste Schritt, um Folgendes einzugeben:<\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">uname -m<\/pre>\n\n\n\n<p>Alle Werte unter ARMv<strong>7<\/strong> Sie sind in 32 Bit.<br>64-Bit-Version startet bei AMRv<strong>8.<\/strong><\/p>\n<p>Die neueste Version von Powershell finden Sie unter&nbsp;<a href=\"https:\/\/github.com\/PowerShell\/PowerShell\">https:\/\/github.com\/PowerShell\/PowerShell<\/a> f\u00fcr Raspbian.Version 7.1.0 am Tag des Schreibens dieses Tutorials.<\/p>\n<p>Ist bereits eine \u00e4ltere oder problematische Version installiert, so ist diese zu l\u00f6schen durch:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">rm -rf ~\/powershell<\/pre>\n\n\n\n<p>Installation starten (Versionsnummer aktualisieren)<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\" data-enlighter-theme=\"classic\">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<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"><\/code><\/pre>\n\n\n\n<div>So starten Sie PowerShell<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"classic\" data-enlighter-linenumbers=\"false\">~\/powershell\/pwsh<\/pre>\n<\/div>\n\n\n\n<div>\n<div>\n<div>So \u00fcberpr\u00fcfen Sie die Version<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">$psversiontable<\/pre>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<h2>Installieren Sie in PowerShell das MicrosoftTeams-Modul<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Uninstall-Module -Name MicrosoftTeams Install-Module -Name MicrosoftTeams -AllowPrerelease Import-Module MicrosoftTeams<\/pre>\n<h2>Erste Tests in der Kommandozeile durchf\u00fchren<\/h2>\n<p>So \u00fcberpr\u00fcfen Sie die Version und die korrekte Installation von MicrosoftTeams:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">get-module | ft name, version<\/pre>\n<p>Probieren Sie es aus, indem Sie die Teamliste abrufen<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Connect-MicrosoftTeams<\/pre>\n<p><em><span style=\"text-decoration: underline;\">Nota<\/span> : In letzter Zeit blockiert ein xdg-open-Fehler die Identifizierung, ich musste mich mit einem Skript mit Credential identifizieren<\/em><\/p>\n<p>Liste der MiscrosoftTeams-Modul-Befehle anzeigen<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">get-command -MicrosoftTeams-Modul<\/pre>\n<p>Befolgen Sie die gelben Anweisungen, um sich zu identifizieren<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$AllTeams = Get-Team Write-Output $AllTeams<\/pre>\n<p class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Die Liste der Teams muss angezeigt werden<\/p>\n<h2>PSFTP installieren<\/h2>\n<p>Um eine von PowerShell generierte Datei an einen FTP-Server zu senden, installieren Sie am einfachsten PSFTP (In PowerShell)<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">apt-get install PSFPT<\/pre>\n\n\n\n<h2>Starten eines Befehlszeilenskripts<\/h2>\n<p>So starten Sie das Skript <a href=\"http:\/\/jeedom.sigalou-domotique.fr\/wp-content\/uploads\/2020\/12\/teams_sigalou.zip\">_sigalou-Teams<\/a>.ps1, verwenden Sie diesen Befehl:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">~\/powershell\/pwsh -File \"teams_sigalou.ps1\"<\/pre>\n\n\n\n<p><strong>Generieren eines CSV mit der Teamliste<\/strong><\/p>\n<p>Nach mehreren Versuchen ist hier das letzte Skript, z\u00f6gern Sie nicht, es anzupassen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># Skript zum Generieren der Teamliste und Exportieren in eine CSV-Datei und Senden dieser Datei per FTP, um von einer Excel-Datei verwendet zu werden # Regie: Sigalou 06\/12\/2020 sigalou@@@sigalou-domotique.fr # Verwenden Sie GitHub oder E-Mail f\u00fcr Fragen, Verbesserungsw\u00fcnsche und z\u00f6gern Sie nicht, Verbesserungen vorzuschlagen # Bitte hinterlassen Sie diese Zeilen # Quelle: http:\/\/jeedom.sigalou-domotique.fr\/generieren-eine-Liste-Teams-ihre-Kan\u00e4le-Eigent\u00fcmer-Mitglieder # oder https:\/\/github.com\/sigalou\/MicrosoftTeamstoCSV # FPT-Kennung param([string]$UserName, [string]$Password, [Switch]$MFA,[int]$Ma\u00dfnahme) $passwordFTP = ConvertTo-SecureString -AsPlainText \"xxxxx\" -Force $credentialsFTP = New-Object System.Management.Automation.PSCredential \"xxxxx_ftp\", $passwordFTP Import-Modul PSFTP # Kennung M365 $UserName = \"xxxxx@xxxxx.com\" $Password = \"xxxx\" #Connect zu 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 \u00bfn\u00bfn\u00bfn\u00bfn\u00bfnStart ... -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 \u00bfnMit Microsoft Teams erfolgreich verbunden -ForegroundColor Green } else { Write-Host Error occurred while creating Teams session. Please try again -ForegroundColor Red exit } # Setzen $True, um einen Debug auf dem Bildschirm zu haben, um die Generation zu verfolgen $modeDEBUG=$False $Result=\"\" $Results=@() $Path=\".\/TeamsData.csv\" If (Test-Path $Path){ Remove-Item $Path } Write-Host \u0301nDatenwiederherstellung... $Count=0 $Teams=Get-Team -Visibility Private $nbTeamsPrivate=$Teams.Count #$Teams=Get-Team -Visibility Public -User xxxxx@xxxxxxxxxxxxxxxx.de $Teams=Get-Team -Visibility Public $nbTeams=$Teams.Count $ColA=$nbTeams.ToString()+\"-\"+$nbTeamsPrivate.ToString() $Result=@{'ColA'=$ColA;'ColB'=\"Aktualisierung des $((Get-Date -format 'dd-MM-yyyy\u00bf HH:mm').ToString()\";} $Ergebnisse = New-Object psobject -Property $Result $Ergebnisse | select 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Lehrt Write-Host \u00bfnDatenverarbeitung... $Teams | Sort-Object DisplayName | foreach { $Z\u00e4hlerLinien=0 $TeamName=$_.DisplayName $Beschreibung=$_.Beschreibung $GroupId=$_.GroupId $TeamUser=Get-TeamUser -GroupId $GroupId $TeamMemberCount=$TeamUser.Count $TeamPrefix=\"\" $setzenVirgule=0 $NameProprio=\"\" $AlleProprios=$TeamUser| Where-Object { $_.Role -eq 'Owner' } $AlleProprios | foreach { if ($setzenVirgule -eq 1) { $setzenVirgule=0 $NameProprio=$NameProprio+\", \"}\" $NameProprio=$NameProprio+$_.Name $setzenVirgule=1 } $NameProprio=$NameProprio+\" und \"+\"$TeamMemberCount+\" Mitglieder\" if ($TeamMemberCount -gt 80) { $NameProprio=\"\" $TeamPrefix=\"\ud83c\udf10 \" } if ($_.Archived -eq \"True\") { $TeamPrefix=\"\ud83d\uddc4\u2014\" $NameProprio=\"[ Archiviert ]\" } If($Beschreibung -eq $TeamName) {$Beschreibung=\"\"} Write-Progress -Activity \" $Count\/$nbTeams $TeamName \" if ($modeDEBUG) { Write-Host \u0301n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550[$TeamName] $Beschreibung -ForegroundColor green} $Count++ Get-TeamChannel -MembershipType Standard -GroupId $GroupId | foreach { $ChannelName=$_.DisplayName If($ChannelName -ne \"general\") { Write-Progress -Activity \" $Count\/$nbTeams $TeamName \/\/ $ChannelName\" #$Beschreibung=$_.Description if ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; [$ChannelName] $ChannelMemberCount $Beschreibung} $Result=@{'ColA'=\"\";'ColB'=$ChannelName;} } else { $Result=@{'ColA'=$TeamPrefix+$TeamName;'ColB'=$NameProprio;} } $Ergebnisse = New-Object psobject -Property $Result $Ergebnisse | select 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Append $Z\u00e4hlerLinien++ } $kan\u00e4leprives=Get-TeamChannel -MembershipType Private -GroupId $GroupId $Kan\u00e4leprivescount=$kan\u00e4leprives.Count If($Kan\u00e4leprivescount -eq \"1\") { if ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; +$private Kan\u00e4le Privatkanal } $Result=@{'ColA'=\"\";'ColB'=\"+1 privater Kanal\";'ColC'=\"\";'ColD'=\"\";} $Ergebnisse = New-Object psobject -Property $Result $Ergebnisse | select 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Append $Z\u00e4hlerLinien++ } elseIf($Kan\u00e4leprivescount -gt 1) { if ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; +$private Kan\u00e4leprivate Kan\u00e4le } $Result=@{'ColA'=\"\";'ColB'=\"+$private Kan\u00e4leprivescount private Kan\u00e4le\";} $Ergebnisse = New-Object psobject -Property $Result $Ergebnisse | select 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Append $Z\u00e4hlerLinien++ } if ($Z\u00e4hlerLinien -eq '1') { if ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; Es wird eine leere }-Zeile hinzugef\u00fcgt $Result=@{'ColA'=\"\";'ColB'=\" \";} $Ergebnisse = New-Object psobject -Property $Result $Ergebnisse | select 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Append } if ($modeDEBUG) { Write-Host \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -ForegroundColor green } } Write-Progress -Activity \"\u00bfn Processed Teams count: $Count \"\u0301n\" Currently Processing: $TeamName \u0301n Currently Processing Channel: $ChannelName\" -Completed if((Test-Path -Path $Path) -eq \"True\") { Write-Host \u0301nReport available in $Path -ForegroundColor Green } Disconnect-MicrosoftTeams # Senden Sie die Datei TeamsData.csv an ftp Set-FTPConnection -Credentials $credentialsFTP -Server ftp.xxxx.org -FloFTP-Sitzung -ignoreCert -UseBinary -KeepAlive $Sitzung = Get-FTPConnection -FloFTP-Sitzung Get-ChildItem \".\\TeamsData.csv\" | Add-FTPItem -Sitzung $Sitzung -Path \/Teams\/ -Overwrite      <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Ziel: Ich wollte diese Art von Liste erstellen:<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[14,24],"tags":[51],"class_list":["post-434","post","type-post","status-publish","format-standard","hentry","category-domotique","category-microsoft-365","tag-teams"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/posts\/434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/comments?post=434"}],"version-history":[{"count":0,"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/posts\/434\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/media?parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/categories?post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/de\/wp-json\/wp\/v2\/tags?post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}