{"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\/es\/generer-une-liste-des-equipes-teams-leurs-canaux-les-proprietaires-membres","title":{"rendered":"Generar una lista de equipos, sus canales, propietarios, miembros de \u2026 con Power Automate o PowerShell"},"content":{"rendered":"<h1>Objetivo:<\/h1>\n<p>Quer\u00eda generar este tipo de lista:<\/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;Primer intento, con 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>Me embarqu\u00e9 en la implementaci\u00f3n de la generaci\u00f3n de un Excel con Power Automate, se ve\u00eda as\u00ed:<\/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>Para elaborar la lista, esto puede ser suficiente, pero en el momento de escribir este tutorial, <strong>Power Automate a\u00fan no lo sabe<\/strong> extraer miembros, propietarios o si el canal o equipo es privado. As\u00ed que no me conviene, busqu\u00e9 otra soluci\u00f3n.<\/p>\n<h1>Segundo intento, usa PowerShell<\/h1>\n<p>Regresar a las poderosas herramientas de l\u00ednea de comandos es a menudo el reflejo de los profesionales de TI, y no me decepcion\u00f3 <strong>el m\u00f3dulo MicrosoftTeams para PowerShell<\/strong>.<\/p>\n<p>Uso <a href=\"http:\/\/jeedom.sigalou-domotique.fr\/jeedom\">Jeedom<\/a>, Intent\u00e9 probar PowerShell adaptado a Raspbian. Esto es para instalarlo en un Raspi3B + que ya alberga Jeedom.<\/p>\n<p>Tengo dos Jeedoms, uno en prod y uno en dev, uno en sous <strong>Estiramiento<\/strong> y un sub <strong>Buster<\/strong>. En el<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 Docs<\/a>, est\u00e1 especificado para usar Stretch, en casa funciona en ambos (para lo que prob\u00e9).<\/p>\n<h2>Instalaci\u00f3n de PowerShell Core<\/h2>\n<p>Preguntar si instala una versi\u00f3n de 32 bits o 64 bits es el primer paso, para esto, escriba:<\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">uname-m<\/pre>\n\n\n\n<p>Cualquier valor por debajo de ARMv<strong>7<\/strong> est\u00e1n en 32 bits.<br>La versi\u00f3n de 64 bits comienza en AMRv<strong>8.<\/strong><\/p>\n<p>La \u00faltima versi\u00f3n de powershell se puede encontrar en&nbsp;<a href=\"https:\/\/github.com\/PowerShell\/PowerShell\">https:\/\/github.com\/PowerShell\/PowerShell<\/a> para Raspbian.Version 7.1.0 el d\u00eda de escribir este tutorial.<\/p>\n<p>Si una versi\u00f3n antigua o preocupante ya est\u00e1 instalada, debe ser eliminada por:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">rm -rf ~\/powershell<\/pre>\n\n\n\n<p>Inicie la instalaci\u00f3n (actualice el n\u00famero de versi\u00f3n)<\/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\" -Fuerza<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"><\/code><\/pre>\n\n\n\n<div>Para lanzar 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>Para comprobar la versi\u00f3n<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">$psversiontable<\/pre>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<h2>En PowerShell, instale el m\u00f3dulo MicrosoftTeams<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Desinstalar-M\u00f3dulo -Nombre MicrosoftTeams Install-M\u00f3dulo -Nombre MicrosoftTeams -Permitir Prelanzamiento Importaci\u00f3n-M\u00f3dulo MicrosoftTeams<\/pre>\n<h2>Realice las primeras pruebas en la l\u00ednea de comandos<\/h2>\n<p>Para comprobar la versi\u00f3n y la instalaci\u00f3n correcta de MicrosoftTeams:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">get-module | ft nombre, versi\u00f3n<\/pre>\n<p>Pru\u00e9balo recuperando la lista de equipos<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Connect-MicrosoftTeams<\/pre>\n<p><em><span style=\"text-decoration: underline;\">Nota:<\/span> : Recientemente, un error xdg-open bloquea la identificaci\u00f3n, tuve que identificarme por un script usando Credential<\/em><\/p>\n<p>Ver la lista de comandos de MiscrosoftTeams Module<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">m\u00f3dulo get-command-MicrosoftTeams<\/pre>\n<p>Sigue las instrucciones en amarillo para identificarte<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$AllTeams = Get-Team Write-Output $AllTeams<\/pre>\n<p class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Se debe mostrar la lista de equipos<\/p>\n<h2>Instalar PSFTP<\/h2>\n<p>Para enviar un archivo generado por Powershell a un servidor FTP, la forma m\u00e1s f\u00e1cil es instalar PSFTP (En PowerShell)<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">apt-get instalar PSFPT<\/pre>\n\n\n\n<h2>Ejecutar un script de l\u00ednea de comandos<\/h2>\n<p>Para iniciar el script <a href=\"http:\/\/jeedom.sigalou-domotique.fr\/wp-content\/uploads\/2020\/12\/teams_sigalou.zip\">Categor\u00eda: Equipos de _sigalou<\/a>.ps1, utilice este comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">~\/powershell\/pwsh -Archivo \"teams_sigalou.ps1\"<\/pre>\n\n\n\n<p><strong>Generar un CSV con la lista Teams<\/strong><\/p>\n<p>Despu\u00e9s de m\u00faltiples pruebas, aqu\u00ed est\u00e1 el \u00faltimo script, no dude en adaptarlo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># Script para generar la lista Teams y exportar a un archivo CSV y luego enviar este archivo por FTP para ser explotado por un archivo Excel # Dirigida por Sigalou 06\/12\/2020 sigalou@@sigalou-domotique.fr # Utilice GitHub o correo electr\u00f3nico para cualquier pregunta, solicitudes de mejora y no dude en proponer mejoras # Por favor, deje estas l\u00edneas # Fuente: http:\/\/jeedom.sigalou-domotique.fr\/generate-a-list-teams-teams-their-channels-owners-members # o https:\/\/github.com\/sigalou\/MicrosoftTeamstoCSV # Par\u00e1metro de identificaci\u00f3n FPT([string]$Nombre de usuario, [string]$Contrase\u00f1a, [cambiar]$AMF,[int]$Acci\u00f3n) $passwordFTP = ConvertTo-SecureString -AsPlainText \"xxxxx\" -Fuerza $credentialsFTP = New-Object System.Management.Automation.PSCredential \"xxxxx _ftp\", $passwordFTP Importaci\u00f3n-M\u00f3dulo PSFTP # Identificaci\u00f3n M365 $Nombre de usuario = \"xxxxx@xxxxx.com\" $Contrase\u00f1a = \"xxxx\" #Con\u00e9ctese a Microsoft Teams $Module=Get-Module -Nombre MicrosoftTeams -ListAvailable if($Module.count -eq 0) { El m\u00f3dulo Write-Host de MicrosoftTeams no est\u00e1 disponible -ForegroundColor amarillo $Confirm= Read-Host \u00bfEst\u00e1 seguro de que desea instalar el m\u00f3dulo? [Y] S\u00ed [N] No if($Confirme -match \"[yY]\") { Install-Module MicrosoftTeams } else { Write-Host MicrosoftTeams module is required.Please install module using Install-Module MicrosoftTeams cmdlet. A la salida } } Write-Host \u2019n\u2019n\u2019n\u2019n\u2019n\u2019nLaunch ... -ForegroundColor Amarillo #Autenticaci\u00f3n mediante MFA if($mfa.IsPresente) { $\u00abEquipo=Connect-MicrosoftTeams }\u00bb (en ingl\u00e9s). #Autenticaci\u00f3n usando otra cosa que no sea MFA { #Almacenamiento de la credencial en el script para el prop\u00f3sito de la programaci\u00f3n \/ Pasar la credencial como par\u00e1metro if($UserName -ne \"\") -y ($Contrase\u00f1a -ne \"\")) { $SecuredPassword = ConvertTo-SecureString -AsPlainText $Contrase\u00f1a -Fuerza $Credencial = Nuevo-Objeto System.Management.Automation.PSCredential $Nombre de usuario,$SecuredPassword $Equipo=Conectar-MicrosoftEquipos -Credencial $Acreditaci\u00f3n } else { $\u00abEquipo=Connect-MicrosoftTeams } }\u00bb (en ingl\u00e9s). #Compruebe la conectividad de los equipos If($Equipo -ne $null) { Write-host \u0301nConnected successfully to Microsoft Teams -ForegroundColor Green } other { El error Write-Host ocurri\u00f3 al crear la sesi\u00f3n Teams. Por favor, int\u00e9ntelo de nuevo -ForegroundColor Red exit } # Colocaci\u00f3n $Fiel a tener una depuraci\u00f3n en la pantalla para seguir la generaci\u00f3n $modeDEBUG=$Falso $Resultado=\"\" $Resultados=@() $Path=\".\/TeamsData.csv\" Si (Test-Path $Ruta){ Remove-Item $\u00ab Path } Write-Host Data Recovery\u00bb (en ingl\u00e9s). $Recuento = 0 $Teams=Get-Team -Visibilidad Privada $nbTeamsPrivate=$Conde de Equipos #$Teams=Get-Team -Visibilidad P\u00fablica -Usuario xxxxx@xxxxxxxxxxxxx.fr $Teams=Get-Team -Visibilidad p\u00fablica $nbEquipos=$Conde de Equipos $ColA=$nbTeams.ToString()+\"-\"+$nbTeamsPrivate.ToString() $Resultado=@{'ColA'=$ColA;'ColB'=\"Actualizaci\u00f3n del $((Obtener-Fecha -formato 'dd-MM-aaaa' HH:mm').ToString()\";} $Resultados= Nuevo-Objeto psobject -Propiedad $Resultado $Resultados | selecciona 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -Append Write-Host \u2019nProcesamiento de datos... $Equipos | Ordenar-Objeto DisplayName | foreach { $counterLines=0 $Nombre del equipo=$_.Display $Descripci\u00f3n=$_.Descripci\u00f3n $GroupId=$_.GroupId $TeamUser=Get-TeamUser -GroupId $GroupId $Miembro del equipoCount=$TeamUser.Contador $TeamPrefix=\"\"\" $putVirgule=0 $NombreProprio=\"\" $AllProprios=$TeamUser | Where-Object { $_.Role-eq 'Propietario' } $a) TouslesProprios | foreach { si ($putVirgule -eq 1) { $putVirgule=0 $NombreProprio=$ApellidoProprio+\", \" } $NombreProprio=$NombreProprio+$_.Nombre $putVirgule=1 } $NombreProprio=$NombreProprio+\" y \"+$TeamMemberCount+\" miembros\" si ($TeamMemberCount -gt 80) { $NombreProprio=\"\" $\ud83c\udf10 \" } si ($_.Archived -eq \"Verdadero\") { $TeamPrefix=\"\ud83d\uddc4\" (en ingl\u00e9s). $: NameProprio=\"[ Archivado ]\" } If($Descripci\u00f3n -eq $Nombre del equipo) {$Descripci\u00f3n=\"\"} Escribir-Progreso -Actividad \" $Cuenta\/$nbEquipos $TeamName \" si$modeDEBUG) { Write-Host \u2019n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550[$Nombre del equipo] $Descripci\u00f3n -ForegroundColor green} $Count++ Get-TeamChannel -Membres\u00edaTipo Est\u00e1ndar -GroupId $GroupId | foreach { $Nombre del canal=$_.DisplayNombre Si($ChannelName -ne \"general\") { Escribir-Progreso -Actividad \" $Cuenta\/$nbEquipos $Nombre del equipo \/\/ $Nombre del canal\" #$Descripci\u00f3n=$_.Descripci\u00f3n si ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; [$Nombre del canal] $ChannelMemberCount $Descripci\u00f3n} $Resultado=@{'ColA'=\"\";'ColB'=$ChannelName;} } else { $Resultado=@{'ColA'=$TeamPrefix+$Nombre del equipo;'ColB'=$ApellidoProprio;} } $Resultados= Nuevo-Objeto psobject -Propiedad $Resultado $Resultados | selecciona 'ColA', 'ColB' | Export-Csv $Ruta de acceso -NoTypeInformation -Ap\u00e9ndice $MeterLines++ } $channelsprives=Get-TeamChannel -Tipo de Membres\u00eda Privada -GroupId $GroupId $canalesprivescount=$canalprives.Count Si($canalesprivescount -eq \"1\") { si ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; +$canalprivescount canal privado } $Resultado=@{'ColA'=\"\";'ColB'=\"+1 canal privado\";'ColC'=\"\";'ColD'=\"\";} $Resultados= Nuevo-Objeto psobject -Propiedad $Resultado $Resultados | selecciona 'ColA', 'ColB' | Export-Csv $Ruta de acceso -NoTypeInformation -Ap\u00e9ndice $\u00ab counterLines++ } elseIf\u00bb (en ingl\u00e9s).$canalesprivescount -gt 1) { si ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; +$Canales privadosprivescount Canales privados } $Resultado=@{'ColA'=\"\";'ColB'=\"+$canales privadosprivescount canales\";} $Resultados= Nuevo-Objeto psobject -Propiedad $Resultado $Resultados | selecciona 'ColA', 'ColB' | Export-Csv $Ruta de acceso -NoTypeInformation -Ap\u00e9ndice $MeterLines++ } si ($contraL\u00edneas -eq '1') { si ($modeDEBUG) { Write-Host \u2560\u2550\u2550\u2550&gt; A\u00f1adir una l\u00ednea } vac\u00eda $Resultado=@{'ColA'=\"\";'ColB'=\" \";} $Resultados= Nuevo-Objeto psobject -Propiedad $Resultado $Resultados | selecciona 'ColA', 'ColB' | Export-Csv $Path -NoTypeInformation -A\u00f1\u00e1dase } si ($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 \"\u201cn Processed Teams count: $Cuenta \u201cn\u201d Procesamiento actual: $TeamName \u2019n Canal de tratamiento actual: $ChannelName\" -Completado if((Test-Path -Path $Path) -eq \"True\") { Write-Host \u201cnReport available in $\u00ab Path -ForegroundColor Green } Disconnect-MicrosoftTeams\u00bb (en ingl\u00e9s). # Enviar el archivo TeamsData.csv en ftp Set-FTPConnection -Credentials $credentialsFTP -Server ftp.xxxx.org -Sesi\u00f3n FloFTP -ignoreCert -UseBinary -KeepAlive $Sesi\u00f3n = Get-FTPConnection -Sesi\u00f3n FloFTP Get-ChildItem \".\\TeamsData.csv\" | Add-FTPItem -Sesi\u00f3n $Sesi\u00f3n -Camino \/Equipos\/ -Sobreescritura      <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Objetivo: Quer\u00eda generar este tipo de lista:<\/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\/es\/wp-json\/wp\/v2\/posts\/434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/comments?post=434"}],"version-history":[{"count":0,"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/posts\/434\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/media?parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/categories?post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigalou-domotique.fr\/es\/wp-json\/wp\/v2\/tags?post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}