TeamsUserEnroller.psm1

Function Import-TeamsUsers {

<#
    .SYNOPSIS
    Import-TeamsUsers is a Powershell function that will enrol users from a CSV file into a given Microsoft Teams group.
 
    .DESCRIPTION
    Import-TeamsUsers is a Powershell function that will enrol users from a CSV file into a given Microsoft Teams group.
 
    .PARAMETER File
    The path to the CSV file that contains your users. Can either be an absolute path or relative path.
 
    .PARAMETER Create
    If specified, create a new Group first, then add the users from the CSV file.
 
    .EXAMPLE
    Import-TeamsUsers -File "users.csv"
 
    .EXAMPLE
    Import-TeamsUsers -Create -File "users.csv"
#>


    Param(
        [parameter(Mandatory=$true, position=1, ParameterSetName='Params', HelpMessage="Specify CSV file")]
        [string]$File,
        [parameter(Mandatory=$false, position=2, ParameterSetName='Params', HelpMessage="Create new Teams group")]
        [switch]$Create
    )

    Begin {
        $ErrorActionPreference = 'Stop'
        ##### IMPORT CSV FILE #####
        Try {
            $Users = Import-CSV $File
        } Catch {
            Write-Host -ForegroundColor Red "$File is not a valid CSV file."
        }
        

        ##### CHECK MODULE IS INSTALLED AND IMPORTED #####
        if (Get-Module -ListAvailable -Name MicrosoftTeams) {
            Import-Module -Name MicrosoftTeams
            $Email = (Connect-MicrosoftTeams -Verbose:$false).Account
        } else {
            Write-Host -ForegroundColor Red "Module MicrosoftTeams doesn't exist. Please run 'Install-Module -Name MicrosoftTeams' and retry."
            Exit
        }
    }

    Process {
        If ($Create) {
            ##### CREATE NEW TEAM #####
            Clear-Host
            $NewTeamName = Read-Host -Prompt "Name of the new group"
            $NewTeamDesc = Read-Host -Prompt "Group description"
            $NewTeamPriv = Read-Host -Prompt "P[u]blic or P[r]ivate?"
            If ($NewTeamPriv -Eq "u") {
                $NewTeamVis = "Public"
            } Elseif ($NewTeamPriv -Eq "r") {
                $NewTeamVis = "Private"
            }
            $NewTeam = New-Team -DisplayName $NewTeamName -MailNickName $NewTeamName -Description $NewTeamDesc -Visibility $NewTeamVis
            $GroupId = $NewTeam.GroupId
        } Else {
            ##### GET USER'S TEAMS #####
            Clear-Host
            Write-Host -ForegroundColor Green "Getting your teams - please wait"
            $EligibleTeams = @()
            Get-Team -User $Email -Verbose:$false | ForEach-Object {
                $CTeamId = $_.GroupId
                $CTeamName = $_.DisplayName
                If (Get-TeamUser -GroupId $CTeamId | Select-Object -Property User,Role | Where-Object {$_.User -eq $Email} | Where-Object {$_.Role -eq "owner"}) {
                    $EligibleTeams += @{GroupId = $CTeamId; DisplayName = $CTeamName}
                }
                Clear-Variable -Name CTeamId
                Clear-Variable -Name CTeamName
            }
            Clear-Host
            Write-Host "Teams that you own:"
            $EligibleTeams | ForEach-Object {[PSCustomObject]$_} | Format-Table 'GroupId', 'DisplayName' -AutoSize
            $GroupId = Read-Host -Prompt "GroupId of the desired group"
        }

        ##### ENROL USERS #####
        $global:UsersAdded = 0;
        $UserCount = $Users | Measure-Object | Select-Object -expand count
        $Consent = Read-Host -Prompt "You are about to add $UserCount users. Are you sure? [y/N]"
        If ($Consent -eq "y" -Or $Consent -eq "Y") {
            $Users | ForEach-Object {
                $User = $_.email
                $Role = $_.role
                Try {
                    Add-TeamUser -GroupId $GroupId -Role $Role -User $User
                    Write-Host "Added user $User with role $Role"
                    $global:UsersAdded++
                } Catch [Microsoft.TeamsCmdlets.PowerShell.Custom.ErrorHandling.ApiException] {
                    Write-Host -ForegroundColor Red "Error adding user $User with role $Role"
                }
                Clear-Variable -Name User
                Clear-Variable -Name Role
            }
            Write-Host -ForegroundColor Green "$global:UsersAdded users added successfully."
        } Else {
            Write-Host -ForegroundColor Red "Aborting."
        }
    }
    
    End {
        @('UserCount', 'UsersAdded', 'Consent', 'Users', 'GroupId') | ForEach-Object {Clear-Variable -Name $_}
        Disconnect-MicrosoftTeams
    }
}