Massenänderung Benutzerprinzipalname UPN per PowerShell in ActiveDirectory

The estimated reading time 3 minutes

Oft müssen Benutzer innerhalb eines Active Directorys fit für Cloud oder auch andere Dienste gemacht werden. Deshalb sind einige Unternehmen dazu gezwungen den UPN vieler Mitarbeiter anzupassen. Diese Anforderung hatte ich nun schon öfters von Kunden und habe hierzu eine kleines PowerShell Skript entworfen um dies zu vereinfachen. Es ist nicht sonderlich kompliziert und erstellt zu Dokumentationszwecken ein CSV vorher und nachher. Mit diesem simplen Mechanismus kann auch ein Rollback (falls notwendig) durchgeführt werden. Ziel ist es den UPN zur Mailadresse zu ändern. (Achtung; es wird das ActiveDirectory PowerShell Modul benötigt)
HINWEIS: bevor UPNs geändert werden, sollte geklärt sein, ob diese per LDAP oder auch anders in weiteren Applikationen verwendet werden (wenn das nicht geklärt werden kann, können die UPNs zunächst bei einigen Benutzern manuell umgestellt werden um zu sehen, ob Probleme im täglichen Betrieb auftreten).

Wie sehen also meine Demobenutzer aus?

Nach dem Ausführen des Skriptes sollte der UserlogonName (Attribut UserPrincipalName UPN) geändert sein.

HINWEIS: bitte auch überprüfen ob der alternative Suffix für die Anmeldung im AD konfiguriert ist (in meinem Fall die Domäne it-koehler.com).

Das Skript erstellt zwei CSV Dateien, wenn also Probleme auftreten können die UPNs vorher und nachher ausgewertet werden.

Nun also endlich das versprochene Skript:

$ous = "OU=MENGEN,OU=DEMO,DC=demo,DC=it-koehler,DC=com","OU=SIGMARINGEN,OU=DEMO,DC=demo,DC=it-koehler,DC=com"
[boolean]$logonly = $true
[string] $csvuserLogfilePath = "C:\temp\UPN"
  
  [string] $csvuserLogfileDate = Get-Date -Format "yyyy-MM-dd-HH-mm"
  [string] $csvuserLogfileNamePrefix = "UPN-Before"
  [string] $csvuserLogfileName = $($csvuserLogfileNamePrefix + $csvuserLogfileDate + ".csv")
  [string] $csvuserLogfile = $csvuserLogfilePath + "\" + $csvuserLogfileName

  [string] $csvuserLogfileNamePrefix = "UPN-Changed"
  [string] $csvuserLogfileName = $($csvuserLogfileNamePrefix + $csvuserLogfileDate + ".csv")
  [string] $csvuserLogfilechanged = $csvuserLogfilePath + "\" + $csvuserLogfileName
    $dcfqdn  = ((Get-ADDomainController).Hostname)
 Add-Content -Path $csvuserLogfile -Value "SamAccountName;UserPrincipalName;Mail"
 if($logonly -ne "$true"){
 Add-Content -Path $csvuserLogfilechanged -Value "SamAccountName;UserPrincipalName;Mail"
 }
foreach($ou in $ous){

    $users = (Get-ADUser -Server $dcfqdn  -Filter * -Properties * -SearchBase "$ou"   | Where-Object {$_.mail -ne $null}) 

        foreach($user in $users){
                $attribute1 = $user | Select-Object samaccountname -ExpandProperty samaccountname
                $attribute2 = $user | Select-Object userprincipalname -ExpandProperty userprincipalname
                $attribute3 = $user | Select-Object mail -ExpandProperty mail
                    Add-Content -Path $csvuserLogfile -Value "$attribute1;$attribute2;$attribute3"
                
                if($logonly -ne "$true"){
                Write-Host "set UPN $attribute3 for user $attribute1" -ForegroundColor Green 
                Set-ADUser -Server "$dcfqdn" -Identity "$user" -UserPrincipalName "$attribute3"
                $changeduser = Get-ADUser -Server $dcfqdn -Identity "$attribute1" -Properties mail | select samaccountname,userprincipalname,mail
                $change1 = $changeduser | Select-Object samaccountname -ExpandProperty samaccountname
                $change2 =  $changeduser | Select-Object userprincipalname -ExpandProperty userprincipalname
                $change3 = $changeduser | Select-Object mail -ExpandProperty mail
                Add-Content -Path $csvuserLogfilechanged -Value "$change1;$change2;$change3"
                
                 }
                
               
                }

    }

Wenn ihr das Skript bei euch laufen lasst, müssen Zeile 1-3 auf eure Umgebung angepasst werden.
-> distinguished name der OUs in denen die Benutzer liegen, welche bearbeitet werden sollen (rekursive Bearbeitung)
->Logonly $true = macht keine Änderung sondern schreibt nur die CSV Dateien
-> Pfad zu den CSV Dateien

Ich hoffe, dass das Skript einigen Admins eine Hilfestellung ist. Kommentare und Anregungen sind gerne willkommen. Sollte euch der Artikel gefallen haben, klickt bitte auf „helpful“.

Was this article helpful?
YesNo
0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments