Juni 9, 2026

Onboarding Exchange Online: UPN & Email-Adresse vereinheitlichen

Die meisten Exchange-Umgebungen sind historisch gewachsen und spätestens beim Migrieren fällt den meisten auf, dass es schon schön und zielführend wäre, wenn UPN und Email-Adresse einheitlich (identisch) wären. So müssen die Benutzer sich im Zweifelsfall nur ihre Email-Adresse merken, 2 Fliegen mit einer Klappe. Übrigens empfiehlt Microsoft dies schon seit Jahren so, beispielsweise hier nachzulesen.

Da dies wie so vieles für mich eine wiederkehrende Aufgabe bei verschiedenen Kunden ist, habe ich auch hier schon vor Jahren ein Skript erstellt, das ich im Laufe der Zeit erweitert und optimiert habe. Vermutlich seht ihr deutlich: OK, das hat der selbst geschrieben, ohne KI… 😉 Nicht schön, aber mir hat es so gereicht.

param(
[Parameter(Mandatory=$false)]
[switch] $createInputFile,
[Parameter(Mandatory=$false)]
[string] $inputfile,
[Parameter(Mandatory=$false)]
[bool] $revert,
[Parameter(Mandatory=$false)]
[switch] $whatIf
)

if($createInputFile -eq $null){$createInputFile=$false}
if($revert -eq $null){$revert=$false}

if ($PSBoundParameters.Count -eq 0) {$createInputFile = 1}

$cleandatetime = get-date -uformat "%Y-%m-%d_%H-%M-%S"
$outfile = "mailToUPN_UPNs-and-Mail_" + $cleandatetime + ".csv"

if($createInputFile){
    $newinputFile = "INPUT_" + $cleandatetime + ".csv"
    $UsersWithMailAndUPN = Get-ADUser -Filter * -Property mail, userPrincipalName | ?{$_.mail -and $_.userPrincipalName} | Select-Object mail, userPrincipalName | ogv -PassThru -Title "Select the accounts to include in the input file" | export-csv $newinputFile -Delimiter ";" -NoTypeInformation
    if (Test-Path $newinputFile){Write-Output "Input file created: $newinputFile"}
    exit
}

# csv as inputfile expected with at least a column "mail" containing e-mail addresses
# in case of $revert -eq true, a previous output file created by this script is expected as $inputfile
# these files also contain the previous UserPrincipalName 
$Users = Import-Csv $inputfile -Delimiter ";"
foreach($User in $Users)
{
    $Mail = $User.mail
    if($revert){$UPN = $User.UserPrincipalName}
    $x = Get-ADUser -Filter {mail -eq $Mail} -Properties *
    if($x.ReturnValue -ne 0)
    {
        $out = $Mail + ' --> ***NOT FOUND!***'
    }
    else
    {
        if($Mail -ne $x.UserPrincipalName){
            $UPNinAD = $x.UserPrincipalName
            $out = "UPN and mail are different. Changing UPN from [$UPNinAD] to [$Mail]"
            if (-Not (Test-Path $outfile)){"mail;UserPrincipalName;DN" | Out-File $outfile}
            $Mail + ';' + $x.UserPrincipalName + ';' + $x.DistinguishedName| out-File $outfile -Append
            if($whatIf){$x | Set-ADUser -UserPrincipalName $Mail -WhatIf}
            else{$x | Set-ADUser -UserPrincipalName $Mail}
        }
        else{
            if(-Not $revert){
                $out = "UPN and mail are identical. No change for [$Mail]"
            }
            else{
                $UPNinAD = $x.UserPrincipalName
                $out = "Reverting Changes. Changing UPN from [$UPNinAD] to [$UPN]"
                if($whatIf){$x | Set-ADUser -UserPrincipalName $UPN -WhatIf}
                else{$x | Set-ADUser -UserPrincipalName $UPN}
            }
        }
    }
    if($out -like "*identical*"){Write-Host $out -ForegroundColor DarkGray}
    else{Write-Output $out}
}
if (Test-Path $outfile){Write-Output "Previous state written to: $outfile"}

Zunächst müsst ihr in Schritt 1 ein Inputfile erstellen. In Schritt 2 folgt dann die Umsetzung mit diesem Inputfile. Bei mir heißt das Skript meistens „mailToUpn.ps1“.

.\mailToUpn.ps1 -createInputFile

Im folgenden Dialog wählt ihr alle User aus, die berücksichtigt werden sollen – am einfachsten mit STRG-A alle wählen und OK drücken.

Das Skript gibt euch den Dateinamen direkt aus

Und so geht es dann ans Eingemachte, am besten zunächst mit -whatif.

Am Ende des Durchlaufs erstellt das Skript ein File mailToUPN_UPNs-and-Mail_<DATUM>.csv. Dort sind genau diejenigen Einträge vermekrt, bei denen tatsächlich etwas geändert wurde. Sollte irgendetwas schief gelaufen sein, könnt ihr mit diesem file ein Rollback machen.

0 0 Bewertungen
Article Rating
Abonnieren
Benachrichtigen bei
guest
0 Comments
0
Deine Meinung würde uns sehr interessieren. Bitte kommentiere.x