Spring til indholdet

Ryd op i brugerprofilerne i SharePoint Server

Profiler for brugere, der er slettet i Active Directory, bliver liggende i SharePoint Server, når oprydningsjobbet ikke kører, eller importen ikke opdager, at de er væk. Hvad SharePoint selv gør, og mit script, der finder og fjerner dem.

Opdateret SharePointPowerShell 4 min. læsning

Brugerprofiltjenesten i SharePoint Server skal selv fjerne profilen for en bruger, der er slettet i Active Directory. Synkroniseringen markerer profilen til sletning, og timerjobbet My Site Cleanup Job sletter den, giver brugerens My Site til lederen og sender lederen en mail (Microsoft). Profilerne bliver liggende, når jobbet ikke er slået til, eller når importen aldrig opdager, at brugeren er væk. Så står de i personvælgeren og i søgningen på personer.

Først det, SharePoint selv kan#

  1. Kør en fuld import. Med Active Directory Import opdager en trinvis import ikke, at en bruger er slettet, slået fra eller flyttet til en OU, der ikke importeres, hvis selve brugerobjektet ikke er ændret. Det skriver en Microsoft-medarbejder i et svar på Microsoft Q&A (Q&A), ikke i en Microsoft-artikel.
  2. Slå My Site Cleanup Job til, men først når profilerne under Manage User Profiles → Profiles Missing from Import er tjekket i Active Directory. Microsoft siger, at jobbet kun må slås til, hvis alle de fundne konti er slået fra eller slettet (Microsoft).
  3. Vent 30 dage. Jobbet sletter en markeret profil efter 30 dage, og det kan ikke ændres (samme svar på Q&A).
  4. Objekter, der aldrig blev importeret, fx fra en opgradering, hvor kun nogle domæner blev synkroniseret, vises og slettes med Set-SPProfileServiceApplication $upa -GetNonImportedObjects $true og -PurgeNonImportedObjects $true. Sletningen kan ikke fortrydes (Microsoft).

Scriptet#

Når profilerne skal væk nu, eller jobbet ikke må slås til. Det går alle profiler igennem, slår kontonavnet op i Active Directory og fjerner profilen, hvis kontoen ikke findes. Køres i SharePoint Management Shell på en server i farmen, med Active Directory-modulet installeret. Første kørsel skriver kun listen.

 1Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
 2Import-Module ActiveDirectory
 3
 4$mySiteHostUrl = "http://<my-site-vaert>"
 5$logFile       = "D:\Temp\profiler-uden-konto.txt"
 6$includeDisabled = $false   # $true: også konti, der er slået fra
 7$remove          = $false   # $true, når listen er gennemset
 8
 9$site    = Get-SPSite $mySiteHostUrl
10$context = Get-SPServiceContext $site
11$upm     = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
12
13$missing = foreach ($up in $upm.GetEnumerator()) {
14    $account = $up.AccountName
15    $sam     = $account.Split('\')[-1]
16    $adUser  = Get-ADUser -Filter "SamAccountName -eq '$sam'"
17
18    if (-not $adUser -or ($includeDisabled -and -not $adUser.Enabled)) {
19        $account
20    }
21}
22
23$missing | Out-File $logFile
24Write-Host "$(@($missing).Count) profiler uden konto, se $logFile"
25
26if ($remove) {
27    foreach ($account in $missing) {
28        $upm.RemoveUserProfile($account)
29        Write-Host "$account fjernet"
30    }
31}

Get-ADUser -Filter giver intet tilbage, når kontoen ikke findes, i stedet for en fejl. Scriptet er ikke kørt i den form, det står i her.

Rettet i forhold til 2024-udgaven#

  • To kommentarer var blevet til links. Linjerne #MySite Host URL og #write-host … stod som [[MySite]] Host URL og [[write-host]] …, sandsynligvis fordi noten har været gennem Obsidian. PowerShell stopper ved den første med “Missing type name after ‘[’” (afprøvet i PowerShell 7.6). Kommentarerne er skrevet om.
  • Kommentaren lovede konti, der er slået fra. Scriptet sagde, at det sammenlignede med disabled users, men dsquery user -samid finder også en konto, der er slået fra. Det var kun slettede konti, der blev fundet. Nu er det et valg med $includeDisabled.
  • Import-Module ActiveDirectory blev ikke brugt. Opslaget gik gennem dsquery. Nu er det Get-ADUser, så modulet bruges.
  • Listen og sletningen i samme kørsel. Sletningen skulle kommenteres ud i hånden for at få en tør kørsel. Nu er det $remove.
  • ArrayList.Add() skrev et tal ud for hver profil. Listen bygges nu direkte af løkken.

Det der driller#

  • Profilen er ikke brugeren på webstederne. Brugeren står stadig i hvert websteds skjulte brugerliste, hvor vedkommende har været. Microsoft beskriver det samme for SharePoint Online (Microsoft).
  • My Site. Jobbet giver den slettede brugers My Site til lederen. Hvad der sker med My Site, når profilen i stedet fjernes af scriptet, har jeg ikke efterprøvet.
  • Flere domæner. Scriptet slår kun op i det domæne, serveren tilhører. Konti fra et andet domæne bliver fundet som manglende. Filtrér på domænedelen af AccountName først, eller brug -Server på Get-ADUser.
  • Ingen fortryd. En fjernet profil kommer ikke igen, før brugeren bliver importeret på ny, og så uden det, brugeren selv havde skrevet i profilen.

I SharePoint Online#

Der er intet at rydde op i selv. SharePoint-profilen bliver slettet permanent 30 dage efter, at brugeren er slettet i Entra ID (Microsoft). Brugerens OneDrive gemmes i 30 dage som standard og ligger derefter 93 dage i papirkurven. Det sker kun, når brugeren slettes. At spærre kontoen eller fjerne licensen sætter det ikke i gang (Microsoft).

Alle noter