Gestern hatte ich während der Migration einer SharedService-DB einige Male eine UserProfile-ServiceApplication angelegt und gelöscht. Dabei ist mir anscheinend mindestens ein Mal ein Fehler beim Löschen einer UserProfile-ServiceApplication unterlaufen. Das hatte zur Folge, dass diverse TimerJobs nicht sauber liefen. Sogar die Administrationsseite der TimerJobs brachte einen Fehler, der im ULS-Log dann so aussah:
System.InvalidOperationException: Operation is not valid due to the current state of the object. at Microsoft.Office.Server.Administration.UserProfileApplicationJob.get_UserProfileApplication()…
Nach kurzer Recherche hat sich bewahrheitet, dass wohl noch herrenlose TimerJobs in der Farm herumgeistern. Wie man diese löscht, erklärt Michael Schau ansehnlich in seinem Blog.
Da man die herrenlosen TimerJobs nicht über die Oberfläche entfernen kann (die Seite gab ja einen Fehler), muss man es über PowerShell realisieren.
- Alle TimerJobs für die UserProfile-ServiceApplication suchen. Get-SPTimerJob | where {$_.name -match “Mss_Srv_UserProfileServiceApplicationMigrated*”} | format-table name
- Den Filter im PowerShell-Skript so setzen, dass nur die “herrenlosen” TimerJobs gefunden werden. Get-SPTimerJob | where {$_.name -match “Mss_Srv_UserProfileServiceApplicationMigrated2*”} | format-table name (bei mir war es die zweite angelegte UserProfile-ServiceApplication, die nicht sauber gelöscht wurde)
- PowerShell zum Löschen der gefilterten TimerJobs ausführen Get-SPTimerJob | where {$_.name -match “Mss_Srv_UserProfileServiceApplicationMigrated2*”} | % { $_.Delete()}
- Nochmals prüfen, ob die benötigten TimerJobs noch existieren und die herrenlosen gelöscht wurden Get-SPTimerJob | where {$_.name -match “Mss_Srv_UserProfileServiceApplicationMigrated*”} | format-table name
Nach diesen vier Schritten konnte ich die TimerJob-Administrationsseite wieder öffnen.