Wiederherstellung von Benutzern in Entra ID

Entra ID verwendet ähnlich wie Active Directory eine Art Papierkorb, um gelöschte Objekte noch für einen gewissen Zeitraum (30 Tage) vorzuhalten. Dies ermöglicht eine schnelle Wiederherstellung.
Allerdings kann es spezielle Szenarien geben, in denen der Einsatz von PowerShell zielführender ist, beispielsweise

  • wenn ein Benutzerkonto mit einem anderen Benutzerprinzipalnamen wiederhergestellt werden soll
  • wenn die benutzerdefinierte Domäne des wiederherzustellenden Kontos nicht mehr existiert und das Konto auch E-Mail-Aliase dieser Domäne verwendet

Einfache Wiederherstellung mittels PowerShell

Eine einfache Wiederherstellung mit Standardeinstellungen kann sowohl über die grafische Oberfläche als auch mittels PowerShell erfolgen:

# Benötigtes Modul prüfen und bei Bedarf installieren
if (!(Get-InstalledModule Microsoft.Graph.Identity.DirectoryManagement -ErrorAction SilentlyContinue)){Install-Module Microsoft.Graph.Identity.DirectoryManagement -Scope CurrentUser}

# Zu Microsoft Graph mit den benötigten Berechtigungen verbinden
Connect-MgGraph -Scopes User.ReadWrite.All,User.DeleteRestore.All

# Wiederherstellungsmodus abfragen
$RestoreChoice = Read-Host 'Alle oder einzelnes Benutzerobjekt wiederherstellen? (1:Alle 2:Einzeln)'

# Alle Objekte wiederherstellen
if ($RestoreChoice -eq '1')
   {
   $DeletedObjects = Get-MgDirectoryDeletedItemAsUser -All 
   ForEach ($DeletedObject in $DeletedObjects)
      {
      Write-Host "Stelle $($DeletedObject.DisplayName) wieder her..." -ForeGroundColor Yellow
      Restore-MgDirectoryDeletedItem -DirectoryObjectId $DeletedObject.Id
      }
   }
   
# Einzel-Wiederherstellung
if ($RestoreChoice -eq '2')
   {
   $Selection = Get-MgDirectoryDeletedItemAsUser -All | Out-GridView -Title 'Bitte wiederherzustellendes Objekt auswählen' -OutputMode:Single
   Write-Host "Stelle $($Selection.DisplayName) wieder her..." -ForeGroundColor Yellow
   Restore-MgDirectoryDeletedItem -DirectoryObjectId $Selection.Id
   }
PowerShell

Wiederherstellung ohne Aliase und/oder neuem Benutzerprinzipalnamen

Sofern zusätzliche Parameter für die Wiederherstellung erforderlich sind, reicht die vorher beschriebene Variante nicht aus, da hier keine individuellen Parameter definiert werden können. Individuelle Anforderungen können über zwei Varianten abgebildet werden:

  • Graph API
  • Entra PowerShell

Diese Vorgehensweise eignet sich beispielweise im Rahmen von Mandanten-Migrationen, bei denen benutzerdefinierte Domänen übertragen werden müssen. Hierzu ist es zunächst erforderlich, alle Referenzen zur Domäne in der Quellumgebung zu entfernen. Anstatt dies teilweise mühsam per Hand durchzuführen, können die Objekte temporär gelöscht und nach Übertragung der Domäne mittels der folgenden Skripte wiederhergestellt werden. Dies kann dazu beitragen, eine Migration erheblich zu beschleunigen.

Graph API

# Benötigte Module prüfen und bei Bedarf installieren
if (!(Get-InstalledModule Microsoft.Graph.Authentication -ErrorAction SilentlyContinue)){Install-Module Microsoft.Graph.Authentication -Scope CurrentUser}
if (!(Get-InstalledModule Microsoft.Graph.Identity.DirectoryManagement -ErrorAction SilentlyContinue)){Install-Module Microsoft.Graph.Identity.DirectoryManagement -Scope CurrentUser}

# Zu Microsoft Graph mit den benötigten Berechtigungen verbinden
Connect-MgGraph -Scopes User.ReadWrite.All,User.DeleteRestore.All,Domain.Read.All

# Parameter für die Wiederherstellung definieren
$params = @{
   autoReconcileProxyConflict = $true   # Mit diesem Parameter werden Aliase ignoriert, die auf einer nicht mehr existierenden Domäne basieren
   }

# Wiederherstellungsmodus abfragen
$RestoreChoice = Read-Host 'Alle oder einzelnes Benutzerobjekt wiederherstellen? (1:Alle 2:Einzeln)'

# Wiederherstellungsmodus abfragen
$RestoreOptions = Read-Host 'Neuen Benutzerprinzipalnamen definieren? (1:Ja 2:Nein)'
if ($RestoreOptions -eq 1){$UserDomain = (Get-MgDomain | Out-GridView -Title 'Bitte neue Domäne auswählen' -OutputMode:Single).Id

# Alle Objekte wiederherstellen
if ($RestoreChoice -eq '1')
   {
   $DeletedObjects = Get-MgDirectoryDeletedItemAsUser -All 
   ForEach ($DeletedObject in $DeletedObjects)
      {
      if ($RestoreOptions -eq 1)
         {
         # Neuen Benutzerprinzipalnamen zusammenbauen
         $UPN = $DeletedObject.Mail
         $Temp = $UPN -Split ('@')
         $Prefix = $Temp[0]
         $NewUPN = $Prefix + '@' + $UserDomain
         
         # Parameter hinzufügen
         $UserParams['NewUserPrincipalName'] = $NewUPN
         }
      $URL = 'https://graph.microsoft.com/v1.0/directory/deletedItems/' + $DeletedObject.Id + '/restore'
      Write-Host "Stelle Benutzer $($DeletedObject.DisplayName) wieder her..." -ForeGroundColor Yellow
      Invoke-MgGraphRequest -Method POST $URL -Body $params
      }
   }  
   
# Einzel-Wiederherstellung
if ($RestoreChoice -eq '2')
   {
   $Selection = Get-MgDirectoryDeletedItemAsUser -All | Out-GridView -Title 'Bitte wiederherzustellendes Objekt auswählen' -OutputMode:Single
   if ($RestoreOptions -eq 1)
      {
      # Neuen Benutzerprinzipalnamen zusammenbauen
      $UPN = $Selection.Mail
      $Temp = $UPN -Split ('@')
      $Prefix = $Temp[0]
      $NewUPN = $Prefix + '@' + $UserDomain
      
      # Parameter hinzufügen
      $UserParams['NewUserPrincipalName'] = $NewUPN
      }
   $URL = 'https://graph.microsoft.com/v1.0/directory/deletedItems/' + $Selection.Id + '/restore'
   Write-Host "Stelle Benutzer $($Selection.DisplayName) wieder her..." -ForeGroundColor Yellow
   Invoke-MgGraphRequest -Method POST $URL -Body $params
   }    
PowerShell


Entra PowerShell

# Benötigte Module prüfen und bei Bedarf installieren
if (!(Get-InstalledModule Microsoft.Entra.DirectoryManagement -ErrorAction SilentlyContinue)){Install-Module Microsoft.Entra.DirectoryManagement -Scope CurrentUser}

# Zu Entra ID verbinden
Connect-Entra -Scopes User.ReadWrite.All

# Parameter für die Wiederherstellung definieren
$params = @{
   autoReconcileProxyConflict = $true   # Mit diesem Parameter werden Aliase ignoriert, die auf einer nicht mehr existierenden Domäne basieren
   }
   
# Wiederherstellungsmodus abfragen
$RestoreChoice = Read-Host 'Alle oder einzelnes Benutzerobjekt wiederherstellen? (1:Alle 2:Einzeln)'

# Wiederherstellungsmodus abfragen
$RestoreOptions = Read-Host 'Neuen Benutzerprinzipalnamen definieren? (1:Ja 2:Nein)'
if ($RestoreOptions -eq 1){$UserDomain = (Get-EntraDomain | Out-GridView -Title 'Bitte neue Domäne auswählen' -OutputMode:Single).Id

# Alle Benutzerobjekte wiederherstellen
if ($RestoreChoice -eq '1')
   {
   $DeletedObjects = Get-MgDirectoryDeletedItemAsUser -All 
   ForEach ($DeletedObject in $DeletedObjects)
      {
      if ($RestoreOptions -eq 1)
         {
         # Neuen Benutzerprinzipalnamen zusammenbauen
         $UPN = $DeletedObject.Mail
         $Temp = $UPN -Split ('@')
         $Prefix = $Temp[0]
         $NewUPN = $Prefix + '@' + $UserDomain
         
         # Parameter hinzufügen
         $UserParams['NewUserPrincipalName'] = $NewUPN
         }
    
      Write-Host "Stelle Benutzer $($Selection.DisplayName) wieder her..." -ForeGroundColor Blue
      if ($RestoreOptions -eq 1){Restore-EntraDeletedDirectoryObject -Id $Selection.Id -AutoReconcileProxyConflict -NewUserPrincipalName $NewUPN}
      if ($RestoreOptions -ne 1){Restore-EntraDeletedDirectoryObject -Id $Selection.Id -AutoReconcileProxyConflict}
      }
   }

# Einzelnes Benutzerobjekt wiederherstellen 
if ($RestoreChoice -eq '2')
   {
   # Benutzer auswählen lassen, welches Objekt wiederhergestellt werden soll
   $Selection = Get-MgDirectoryDeletedItemAsUser -All | Out-GridView -Title 'Please choose object to restore' -OutputMode:Single

   if ($RestoreOptions -eq 1)
      {
      # Neuen Benutzerprinzipalnamen zusammenbauen
      $UPN = $Selection.Mail
      $Temp = $UPN -Split ('@')
      $Prefix = $Temp[0]
      $NewUPN = $Prefix + '@' + $UserDomain
       
      # Parameter hinzufügen
      $UserParams['NewUserPrincipalName'] = $NewUPN
      }

   Write-Host "Stelle Benutzer $($Selection.DisplayName) wieder her..." -ForeGroundColor Blue
   if ($RestoreOptions -eq 1){Restore-EntraDeletedDirectoryObject -Id $Selection.Id -AutoReconcileProxyConflict -NewUserPrincipalName $NewUPN}
   if ($RestoreOptions -ne 1){Restore-EntraDeletedDirectoryObject -Id $Selection.Id -AutoReconcileProxyConflict}
   }
PowerShell


Hat Dir der Beitrag gefallen? Lass es andere wissen!