Ein neuer Tag, ein neuer Blog… oder irgendwie so xD

Heute über das Auslesen und Setzen der UserProfile Properties – in SharePoint On Premise und Cloud.

Der Hintergrund dieses Posts ist eine spezielle Anforderung, bei der wir zielgerichtete Newsbeiträge für die Mitarbeiter im Web ausspielen sollen. Hierfür aber zusätzliche Gruppen zu erzeugen und dies berechtigungsgesteuert durchzuführen, ist in diesem Fall keine Option.
Darum entschieden wir uns für einen anderen Ansatz über die UserProfile Properties. Diese greifen beispielsweise auf einen Standort und eine Organisation als Taxonomiewerte zu.

Dadurch wird der Mitarbeiter über seine Organisationseinheit im Profil identifiziert. Somit werden standort- oder organisationsspezifische Inhalte individuell für ihn angezeigt.

Dies läuft ähnlich dem Audience Targeting (zu Deutsch Zielgruppenadressierung). Jedoch hat dieses Feature eine Restriktion. Es wird wieder nur in der Cloud über eine Office 365 Berechtigungsgruppe bzw. beim Anlegen eines Teams über eine eben solche aufgelöst.
Eventuell ändert sich dies in Zukunft noch mit Erweiterungen, denn die Anforderungen an SharePoint Online mit der Tendenz alles in die Cloud zu verlagern, steigen stetig. Mit diesem Gedanken im Hinterkopf wählten wir diese Methode.

Wie liest man diese Properties aber nun aus oder setzt sie?

Serverseitig On Premise via SSOM:

$serviceContext = Get-SPServiceContext "http://contoso.com"
$userProfileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($serviceContext) 
$newProfile = $userProfileManager.GetUserProfile("contoso\user")

//Via Konstanten
$newProfile[[Microsoft.Office.Server.UserProfiles.PropertyConstants]::Office].Value = "Bad Erlach, Hochfeldgasse 5"
//oder direkt über das Label
$newProfile["SPS-Department"].Value =  "Smarterbusiness"
//und Taxonomiewerte
$newProfile["SBS-Standort"].Value = $valueStandort.Name
$newProfile["SBS-Standort"].AddTaxonomyTerm($valueStandort) | Out-Null
$newProfile.Commit()

Oder auch via CSOM (mit der Restriktion nur lesend auf SP2013):

$peopleManager = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($context)
$personProperties = $peopleManager.GetPropertiesFor($targetUser)
$context.Load($personProperties)
$context.ExecuteQuery()
$profileProperties = $personProperties.UserProfileProperties
foreach ($key in $profileProperties.Keys)
{
    Write-Host  $key "-->" $profileProperties[$key]
}

Lt. Aussage von Microsoft schreibend nur auf SP2016&19:
*clicky* Link zum Original Statement 🙂

We don’t really have a good status for this one, so using the most accurate one. CSOM based manipulation for user profile properties IS available in on-premises in SP2016 and in upcoming SP2019 versions. This is not, however, something which will be backported to the SP2013 platform, meaning that this capability will NOT be available from the SP2013 platform.

Wie können diese Properties aber nun Online in der Cloud bearbeitet werden?

Hierzu benötigt man die aktuelle SharePoint Online Client Components SDK.
Mit der letzten Version der *Microsoft.SharePoint.Client.UserProfiles.dll*

Damit erhält man schließlich auch zwei weitere Methoden am PeopleManager:

  • SetSingleValueProfileProperty()
  • SetMultiValuedProfileProperty()
$peopleManager.SetSingleValueProfileProperty(personProperties.AccountName,"AboutMe", "Ich bin der Beste!")  
$ctx.Load($peopleManager)  
$ctx.ExecuteQuery() 

$propertyValues = New-Object "System.Collections.Generic.List``1[System.string]"  
$propertyValues.Add("SharePoint")  
$propertyValues.Add("Blogbeiträge")                 
$peopleManager.SetMultiValuedProfileProperty(personProperties.AccountName, "SPS-Responsibility", $propertyValues)  
$ctx.Load($peopleManager)  
$ctx.ExecuteQuery()  

Na das war ja einfach \o/
…wenn man weiß wie 😮

Nächstes mal mehr zu den Profil Newsfeedeinstellungen und das Serverseitige Setzen dieser – stay tuned 😉