Hallo zusammen, 

es ist einige Zeit vergangen seit dem letzten Artikel über Microsoft Teams und PowerShell. Es gibt hier aber einige interessante Neuerungen im PowerShell Modul. Das Modul kann nun auch Teams finden, in welchen der aktuelle Benutzer kein Mitglied ist. 

Eine weitere entscheidende Verbesserung ist, dass der Administrator nun keine vollwertige Teams Lizenz besitzen muss. Es gibt nun einen „Teams Admin“, werde ich aber später nochmals darauf eingehen.

Was kann nun das neue Teams Modul? Es ist nun endlich möglich Teams zu finden, in denen der angemeldete Benutzer kein Mitglied ist.

Zunächst muss natürlich die aktuellste Version des Powershell Moduls installiert werden siehe hierzu auch PSGallery.

Das Modul kann in der normalen PowerShell, mit VS Code oder auch ISE gestartet werden. In meiner Demo-Umgebung starte ich es in der guten alten ISE, da ich mit ISEsteroids eine gute Umgebung für Scriptentwicklung besitze.

Install-Module MicrosoftTeams -Verbose -Force

Natürlich muss nach der Installation das MS Teams Modul auch noch in die Powershell Session importiert werden. Dies kann einfach über den Import-Module Befehl erledigt werden.

Import-Module MicrosoftTeams -Verbose -Force

Es sollte nun noch geprüft werden, ob das richtige Modul auch geladen wurde.

Get-Module MicrosoftTeams

Neuerungen in der Teams Administration?

Wie bereits in der Einleitung erwähnt, haben sich in letzter Zeit einige Änderungen im Bereich der Teams Administration ergeben. Es gibt nun einen „globalen Teamsadministrator“ . Also schauen wir direkt ins O365 Administrationsportal. Ich habe für die Teamsadministration einen eigenen Benutzer erstellt.

HINWEIS: für diesen Benutzer wird keine eigene O365 Lizenz benötigt

Für weitere Informationen zu Teams Administration siehe Link.

Nachdem der Benutzer aktiviert und die notwendigen Berechtigungen gesetzt sind, etwas Zeit geben, und es kann direkt mit der Powershell und dem angelegten Benutzer verbunden werden.

Der nachfolgende Code funktioniert nur in Powershell Console und ISE.

$tenant = (Connect-MicrosoftTeams)
$account = ($tenant.account)
$tenantdomain = ($tenant.TenantDomain)
$host.ui.RawUI.WindowTitle = "Windows Powershell remote connection to MSTeams Tenant: $tenantdomain with account $account "

Zur Demonstration führe ich den Code einmal direkt in der Powershell Console aus.

Nun gehe ich wieder zurück zur ISE Konsole und führe das selbe hier aus.

Nun haben wir die Grundvoraussetzungen geschaffen.

Umgang mit MS Teams und Powershell

Verwendet man den „Get-Team“ Befehl werden nun ALLE teams der kompletten Organisation angezeigt. Leider sieht man nur die GroupID, DisplayName und Beschreibung, also nicht all zuviel Informationen. Deshalb habe ich ein kleines Script erstellt, welches alle Teams prüft und Benutzer, Eigentümer und Gäste in einer Out-GridView (Separates Fenster) ausgibt. Einfach mal Kommentare im Script anschauen.

$userid = "user01@tenantname.onmicrosoft.com"
$Creds = Get-Credential $userid
Connect-MicrosoftTeams -Credential $Creds
#generate array for custom object
$teamsinfo = @()
#get all teams from organisation
$teams = get-team 
#find members, owner, guest
foreach($team in $teams){
  $displayname = ($team.DisplayName)
  $Description = ($team.Description)
  $groupid = $team.groupid
  $members = (Get-TeamUser -GroupId $groupid -Role Member).User
  $owner = (Get-TeamUser -GroupId $groupid -Role Owner).User
  $guests = (Get-TeamUser -GroupId $groupid -Role Guest).User
   #custom object for output
  $teamsinfo += [pscustomobject]@{
    DisplayName   = $displayname
    Owner = ("$owner")
    Members = ("$members")
    Guests = ("$guests")
    Description = ("$Description")
  }
}
#show teaminformation in OutGrid-View
$teamsinfo | Sort-Object DisplayName | Out-GridView -Title "All Office365 Groups created in MS Teams" 

Sieht schon ganz passabel aus, aber ich dachte die Informationen wären hilfreicher als HTML Report. Das ist ebenfalls nicht sonderlich kompliziert.

#show teaminfo in html site
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6264A7;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
$htmlreport = $teamsinfo | ConvertTo-Html -Head $Header 
$htmlreport | Out-File .\teams.html
Invoke-Item .\teams.html

Soweit so gut, aber es wäre vielleicht nicht schlecht den Report per Mail an die Administratoren zu verschicken. Also legen wir los! In meiner Demo-Umgebung benutze ich O365 SMTP als Relay Server für SMTP, es kann aber ebenso ein lokaler Mailserver verwendet werden.

HINWEIS: wenn ein O365 Mailrelay verwendet wird, muss der Benutzer im „FROM“ existieren und eine Exchange Lizenz hinterlegt haben.

$date = Get-Date
Send-MailMessage -From teams@it-koehler.com -To "General - sharepoint-demo <XXXXXXXX.it-koehler.com@emea.teams.ms>" -cc distributiongroup@it-koehler.com -Subject "MicrosoftTeamsReport $date" -BodyAsHtml "$htmlreport" -SmtpServer "smtp.office365.com"  -Credential $Creds -UseSsl -Port 587

Weitere Informationen siehe Reference

Es können ebenfalls mehrere Empfänger mit Komma getrennt eingetragen werden. Woher habe ich die Email Adresse eines Microsoft Teams erhalten?

Siehe Screenshot:

Wie sieht nun das fertige Ergebnis aus?

Es können nun alle Teile zusammengefügt werden zu einem kompletten Skript.

$userid = "teamsadmin01@it-koehler.com"
$Creds = Get-Credential $userid
Connect-MicrosoftTeams -Credential $Creds
#generate array for custom object
$teamsinfo = @()
#get all teams from organisation
$teams = get-team 
#find members, owner, guest
foreach($team in $teams){
  $displayname = ($team.DisplayName)
  $Description = ($team.Description)
  $groupid = $team.groupid
  $members = (Get-TeamUser -GroupId $groupid -Role Member).User
  $owner = (Get-TeamUser -GroupId $groupid -Role Owner).User
  $guests = (Get-TeamUser -GroupId $groupid -Role Guest).User
   #custom object for output
  $teamsinfo += [pscustomobject]@{
    DisplayName   = $displayname
    Owner = ("$owner")
    Members = ("$members")
    Guests = ("$guests")
    Description = ("$Description")
  }
}
#show teaminformation in OutGrid-View
$teamsinfo | Sort-Object DisplayName | Out-GridView -Title "All Office365 Groups created in MS Teams" 
#show teaminfo in html site
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6264A7;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
$htmlreport = $teamsinfo | ConvertTo-Html -Head $Header 
$htmlreport | Out-File .\teams.html
Invoke-Item .\teams.html
$date = Get-Date
Send-MailMessage -From teamsadmin01@it-koehler.com -To "General - sharepoint-demo <XXXXXXXXXX@emea.teams.ms>" -cc XXXXXXXX@it-koehler.com -Subject "MicrosoftTeamsReport $date" -BodyAsHtml "$htmlreport" -SmtpServer "smtp.office365.com"  -Credential $Creds -UseSsl -Port 587

Natürlich kann man mit dem Powershell Modul noch weitere tolle Dinge tun, dieses Tutorial beschäftigt sich aber nur mit der Beschaffung und Aufbereitung von Informationen. Wenn euch der Artikel gefallen hat, dann drückt auf „Helpful“. Vielen Dank fürs Lesen und schaut euch meine anderen Artikel zum Thema Teams an.

Print Friendly, PDF & Email
  • Was this Helpful ?
  • yes   no