Das Löschen einer großen Anzahl von Objekten aus dem FIM-Dienst kann auf verschiedene Weise erfolgen:
- Erstellen Sie eine benutzerdefinierte Workflow-Aktivität zum Löschen des Objekts, die bei einem festgelegten Übergang MPR ausgelöst wird.
- Konfigurieren Sie eine MA als maßgebend für das Löschen von Objekten, und heben Sie dann die Verbindung der Objekte mit der FIM MA auf.
- PowerShell-Skripte.
Das PowerShell-Skript schien uns der am wenigsten eingreifende Ansatz zu sein, da es keine Änderung der Konfiguration der Arbeitsabläufe oder der Synchronisierungs-Engine erforderte.
Bei der Aufzählung einer großen Anzahl von Objekten über PowerShell kann das Skript eine Zeitüberschreitung verursachen - oft erst nach einigen Stunden Laufzeit - und Sie können wieder an den Ausgangspunkt zurückkehren.
Um dies zu vermeiden, haben wir folgendes geschrieben, das mehrere unabhängige Fenster zur Ausführung des Skripts startet, die nach dem Anfangsbuchstaben des Nachnamens gefiltert werden.
cmd /c start powershell -NoExit -Command {$Host.UI.RawUI.WindowTitle = “Delete User – A”; .\DeleteUser.ps1 ‘A’}
cmd /c start powershell -NoExit -Command {$Host.UI.RawUI.WindowTitle = “Delete User – B”; .\DeleteUser.ps1 ‘B’}
cmd /c start powershell -NoExit -Command {$Host.UI.RawUI.WindowTitle = “Delete User – C”; .\DeleteUser.ps1 ‘C’}
cmd /c start powershell -NoExit -Command {$Host.UI.RawUI.WindowTitle = “Delete User – D”; .\DeleteUser.ps1 ‘D’}
Usw. zu Z.
Das Löschskript erzeugt für jedes gelöschte Objekt eine Anfrage an den FIM-Dienst, so dass eine große Warteschlange entsteht, wenn 26 Skripte gleichzeitig ausgeführt werden. Um die Auswirkungen auf die Leistung des FIM-Dienstes so gering wie möglich zu halten, haben wir etwa 5-8 Buchstaben gleichzeitig ausgeführt.
Hier ist der Code zum Löschen des Benutzers.
param (
[string]$Buchstabe = $(throw "Geben Sie den letzten Buchstaben an"))
#------------------------------------
Set-Variable -Name URI -Wert "https://localhost:5725/resourcemanagementservice" -Option Konstante
#------------------------------------
Funktion DeletePerson
{
Param($ObjectId)
Ende
{
$ImportObject = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportObject
$ImportObject.ObjectType = "Person"
$ImportObject.TargetObjectIdentifier = $ObjectId
$ImportObject.SourceObjectIdentifier = $ObjectId
$ImportObject.State = 2
$ImportObject | Import-FIMConfig -uri $URI -ErrorVariable Err -ErrorAction SilentlyContinue
If($Err){Werfen Sie $Err}
}
}
#------------------------------------
If(@(get-pssnapin | where-object {$_.Name -eq "FIMAutomation"} ).count -eq 0) {add-pssnapin FIMAutomation}
#clear-host
$ExportObject = Export-FIMConfig -uri $URI `
-onlyBaseResources `
-customconfig "(/Person[starts-with(LastName, '$Letter')])" `
-ErrorVariable Err `
-ErrorAction StummFortsetzen
If($Err){Werfen Sie $Err}
If($ExportObject -eq $null) {throw “L:There are no persons in your environment”}
$iMax = @($ExportObject).Count
$i = 1
$ExportObject | ForEach{
$pctComp = ([int]($i/$iMax * 100))
Write-Progress -activity "Löschen als" `
-status "Bitte warten" -percentcomplete $pctComp `
-currentoperation "$i von $iMax Personen verarbeitet"
$ObjectId = (($_.ResourceManagementObject.ObjectIdentifier).split(":"))[2]
DeletePerson -ObjectId $ObjectId
$i++
}
Write-Host "`nBefehl erfolgreich abgeschlossen`n"
#------------------------------------
Falle
{
$exMessage = $_.Exception.Message
If($exMessage.StartsWith("L:"))
{write-host "`n" $exMessage.substring(2) "`n" -foregroundcolor white -backgroundcolor darkblue}
Else {write-host “`nError: ” $exMessage “`n” -foregroundcolor white -backgroundcolor darkred}
Ausfahrt 1
}
#