Migrate-Students.ps1

function Start-StudentMigration
{
<#
 .Synopsis
  Creates students in Microsoft Teams.
 
 .Description
  Reads ASV Data from Get-DataFromAsvXml and creates student user accounts based on ASV Data.
 
 .Parameter data
  Object returned from Get-DataFromAsvXml
  
 .Parameter AADUserOutput
  Path where output file of created users sould be stored.
 
 .Parameter Suffix
  Suffix after @ in UPN firstname.lastname@SUFFIX (somedomain.tld)
 
 .Parameter PasswordListPath
  Path to .csv file with exisiting passwords. Structure (vorname,nachname,pass)
 
 .Parameter WhatIf
  Does not create users in production system. Only prints users to console and creates output file.
 
 .Example
  # Creates students in asv.
  Start-StudentMigration -data $data -AADUserOutput C:\users\docuemtns\created-students.csv -Suffix myschool.tld
#>

  param
  (
    [parameter(
        Mandatory = $true,
        ValueFromPipeline = $true
    )]
    $data,
    [Parameter(
        Mandatory = $true
    )]
    $AADUserOutput,
    [Parameter(
        Mandatory = $true
    )]
    $Suffix,
    $PasswordListPath,
    $WhatIf = $false
  )
  
  $PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
  $PasswordProfile.ForceChangePasswordNextLogin = $true
  
  $LicensesToAssign = Get-LicensesToAssign -Plans @('STANDARDWOFFPACK_STUDENT')
  
  if($null -ne $PasswordListPath)
  {
    $PasswordList = Load-PasswordList -passwordlistpath $PasswordListPath
  }
  
  $newAADUsers = @()
  $aadusers = Get-AadUserHashTable

  
  foreach ($k in $data.Klassen)
  {

    foreach ($kg in $k.KlassenGruppen)
    {
      foreach ($kl in $kg.Klassenliste)
      {
              
        $vorname = Remove-DiacriticsAndSpaces $kl.Vorname
        $nachname = Remove-DiacriticsAndSpaces $kl.Familienname
        $gebdat = $kl.GebDatum.Split(".")[2]
        $upn = "{0}.{1}.schueler@{2}" -f $vorname,$nachname,$Suffix
        $klasse = $k.Klassenname
        $anrede = $kl.Anschriftstext
        $anschrift = $kl.Strasse
        $hsnr = $kl.HausNummer
        $plz = $kl.PLZ
        $ort = $kl.Ort
        $oldflag = $false
        
        $pass = (Get-RandomPassword(11).ToString()) + "!"

        if (!$aadusers.ContainsKey($upn)) 
        { 
          $luser = New-Object psobject
      
          # If password list is set and key with firstlastname exisists stored password
          if($null -ne $PasswordListPath)
          {
            if($null -ne ($PasswordList.("$($vorname)$($nachname)") ) )
            {
              $pass = ($PasswordList.("$($vorname)$($nachname)")).ToString()
              $oldflag = $true
            }
          }
          $PasswordProfile.Password = $pass
        
          if(!$WhatIf)
          {
            Write-Host "[CREATE] Create user $vorname $nachname"
        
            $aad = New-AzureADUser -DisplayName ("$vorname $nachname") -GivenName $vorname -Surname $nachname -UserPrincipalName $upn -PasswordProfile $PasswordProfile -MailNickName $upn.Split("@")[0] -AccountEnabled $true -UsageLocation DE
            Set-AzureADUserLicense -ObjectId $aad.ObjectId -AssignedLicenses $LicensesToAssign      
          
            $luser | Add-Member -MemberType NoteProperty -Name UPN -Value $aad.UserPrincipalName
          } else {
            Write-Host "[WHATIF] Create user $vorname $nachname"
            $luser | Add-Member -MemberType NoteProperty -Name UPN -Value $upn
          }
      
          $luser | Add-Member -MemberType NoteProperty -Name Pass -Value $pass
          $luser | Add-Member -MemberType NoteProperty -Name Nachname -Value $nachname
          $luser | Add-Member -MemberType NoteProperty -Name Vorname -Value $vorname
          $luser | Add-Member -MemberType NoteProperty -Name Geburtsdatum -Value $gebdat
          $luser | Add-Member -MemberType NoteProperty -Name Klasse -Value $klasse
          $luser | Add-Member -MemberType NoteProperty -Name Anrede -Value $anrede
          $luser | Add-Member -MemberType NoteProperty -Name Anschrift -Value $anschrift
          $luser | Add-Member -MemberType NoteProperty -Name Hausnummer -Value $hsnr
          $luser | Add-Member -MemberType NoteProperty -Name PLZ -Value $plz
          $luser | Add-Member -MemberType NoteProperty -Name Ort -Value $ort
          $luser | Add-Member -MemberType NoteProperty -Name OldFlag -Value $oldflag
          $newAADUsers += $luser
        }
      }
    }
  }
  
  $newAADUsers | Export-Csv -Path $AADUserOutput -Encoding UTF8
  return
}