Freitag, 25. Oktober 2019

SharePoint Benutzer-Spracheinstellungen mit PowerShell setzen.

Ich falle immer mal wieder darüber: Wie kann man für alle Benutzer die Spracheinstellungen per PowerShell setzen?

Die Frage ist schnell beantwortet und eine kurze Suche führt meistens etwas wie das folgende zutage:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles")

$ctx =  [Microsoft.Office.Server.ServerContext]::GetContext((Get-SPWebApplication | Select -First 1))
$upm = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager -ArgumentList @($ctx)
$lang = "de-DE,en-US"

$enum = $upm.GetEnumerator()
while ($enum.MoveNext()) {
  $up = $enum.Current
  write-host "$($up.DisplayName) ($($up.AccountName))"

  $up["SPS-MUILanguages"].Value = $lang
  $up["SPS-ContentLanguages"].Value= $lang
  $up.Commit()
}

Meistens sieht dann in der Zentraladministration alles gut aus:


Aber für "einige" (oder auch alle...) Benutzer erscheinen die Werte dann nicht in den MySites:


Das "Geheimnis" ist ein TimerJob ("User Profile Service Application_LanguageAndRegionSync") der allerdings nur richtig arbeitet, wenn die eigenschaft 'SPS-RegionalSettings-Initialized' auf true gesetzt ist. Im Standard läuft dieser Job jede Minute - ein Start, direkt nach der Anpassung kann aber auch nicht schaden.
Das Finale Skript muss also so aussehen:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles") | out-null

$ctx =  [Microsoft.Office.Server.ServerContext]::GetContext((Get-SPWebApplication | Select -First 1))
$upm = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager -ArgumentList @($ctx)
$lang = "de-DE,en-US"

$enum = $upm.GetEnumerator()
while ($enum.MoveNext()) {
  $up = $enum.Current
  write-host "$($up.DisplayName) ($($up.AccountName))"

  $up["SPS-MUILanguages"].Value = $lang
  $up["SPS-ContentLanguages"].Value= $lang
  $up["SPS-RegionalSettings-Initialized"].Value = $true
  $up.Commit()
}

Get-SPTimerJob | ?{ $_.Name -like "*user*profile*languageandregion*" } | %{ $_.RunNow() }

Danach erscheinen auch die Anpassungen in der MySite:


Was gibt es noch dazu zu sagen?

  • Die Sprach-codes müssen "korrekt" sein - also "de-DE" nicht "de-de".
  • Der Text darf keine leerzeichen enthalten - also "de-DE,en-US", nicht "de-DE, en-US"

Keine Kommentare:

Kommentar veröffentlichen