+
Gestire le User profile properties con Windows PowerShell
Pubblicato il: 26/04/2011
Da: Riccardo Celesti
Lingua: Italiano
Livello: 300

Sulla User Profile Service Application si è scritto già molto, nonostante la tenera età del prodotto. Uno degli aspetti meno documentati è la gestione delle proprietà legate al profilo utente. O meglio, è molto ben documentato come procedere da interfaccia grafica, ma chiunque ci abbia provato si sarà sicuramente reso conto di quanto tempo si perda in attesa che una pagina venga caricata o semplicemente per l’aggiornamento di tutte le proprietà che si vogliono modificare.Per fortuna Windows PowerShell ci fornisce un validissimo aiuto, sia in termini di risparmio di tempo che in termini di riusabilità dello script che andreamo a comporre.

Inspiegabilmente (a mio avviso, chissà se verranno introdotte nella SP1), non esiste in SharePoint 2010 alcuna cmdlet per la gestione diretta delle proprietà di profilo utente; dovremo quindi sfruttare le capacità di PowerShell di interagire direttamente con il modello oggetti di SharePoint per creare (modificare o eliminare) questi elementi. Andremo inoltre a leggere da un file di testo CSV le caratteristiche delle proprietà da creare in modo da rendere il nostro script abbastanza generico da non dover essere modificato ogni volta che dovremo utilizzarlo.

Nota: Per la creazione di questo script consiglio di utilizzare un editor PowerShell (PowerShell ISE, PowerGUI Script Editor, etc...) in quanto ci sarà possibile salvare il file e riutilizzarlo in ambienti diversi.

Script PowerShell

Prima di poter procedere con la creazione dello script PowerShell è necessario dare un occhiata alla struttura del file di testo da cui andreamo a leggere le impostazioni delle proprietà utente.

La prima riga del nostro file conterrà le intestazioni di colonna, i cui nomi potranno essere utilizzati come nome delle variabili richiamate nello script (Name,DisplayName,Type,Length,isSearchable,isAlias,
PrivacyPolicy,UserOverridePolicy,DefaultPrivacy,
isColleagueEventLog,isReplicable,isVisibleonEditor,
isVisibleonViewer,MappingDirection,UPType,
ADAttribute) e a seguire, per ciascuna riga saranno riportati i dati di tutte le proprietà da creare.

La prima cosa da fare, se utilizziamo una Shell diversa da Microsoft SharePoint 2010 Management Shell, è caricare lo snap-in di PowerShell per SharePoint.

 

Add-PSSnapin Microsoft.SharePoint.Powershell

Andiamo ora a definire una serie di informazioni sul contensto in cui andremo ad operare.

$mys = Get-SPSite "http://sp-2010/my"
$context = Get-SPServiceContext $mys

A questo punto istanziamo due oggetti, UserProfileManager e UserProfileConfigManager. Il primo ci servirà per la creazione (modifica o cancellazione) dell’elemento user property, il secondo per gestirne  i mapping con la nostra origine (AD, Novell, Tivoli, etc).

$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$pcm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileConfigManager($context)

 

Nelle righe seguenti ci colleghiamo alla nostra origine dati (nell’esempio chiamata, con un enorme sforzo di fantasia “SharePoint”). Il passaggio seguente è necessario solo al fine di gestire i mapping con la nostra directory dei prorfili.

 

$cm = $pcm.ConnectionManager
$connName = "SharePoint"
$conn = $cm[$connName]
$pmc = $conn.PropertyMapping

Andiamo ora a leggere le informazioni dal nostro file di testo e, ciclando su queste, creeremo le nostre proprietà di profilo.


Import-Csv "F:\Script\user-properties.csv" | ForEach-Object {

    $prop = $profileManager.Properties.Create($false)

 

Ci troviamo all’interno del ciclo, nelle righe seguenti andremo ad configurare le singole impostazioni con le impostazioni lette dal file CSV.

    $prop.Name = $_.Name

    $prop.DisplayName = $_.DisplayName

    $prop.Type = $_.Type

    $prop.Length = $_.Length

    $prop.PrivacyPolicy = $_.PrivacyPolicy

 

Le opzioni di privacy policy sono Mandatory|OptIn|OptOut|Disabled

    $prop.DefaultPrivacy = $_.DefaultPrivacy ## "Public"

 

Le opzioni di DefaultPrivacy sono Public|Contacts|Organization|Manager|Private|NotSet

    $prop.IsSearchable = [bool]::Parse($_.isSearchable)

    $prop.IsAlias = [bool]::Parse($_.isAlias)

    $prop.UserOverridePrivacy = [bool]::Parse($_.UserOverridePolicy)

    $prop.IsColleagueEventLog = [bool]::Parse($_.isColleagueEventLog)

    $prop.IsReplicable = [bool]::Parse($_.isReplicable)

    $prop.IsVisibleOnEditor = [bool]::Parse($_.isVisibleonEditor)

    $prop.IsVisibleOnViewer = [bool]::Parse($_.isVisibleonViewer)

 

Nella riga seguente confermiamo la creazione della proprietà.

    $profileManager.Properties.Add($prop)

 

Se nel file CSV abbiamo impostato la colonna MappingDirection ad import andiamo a creare il nuovo mapping con una proprietà di AD, anche questa letta dal nostro file di testo.

 

    if ($_.MappingDirection = "import"){

        $pmc.AddNewMapping($_.UPType,$_.Name,$_.ADAttribute)

    }   

}

 

Siamo usciti dal ciclo, come ultima operazione liberiamo memoria “distruggendo” l’oggetto SPSite.

$mys.Dispose()

Modificare l’ordine delle user property

 

Un’altra applicazione a mio avviso molto utile della gestione via PowerShell delle User Profile Property è la possibilità di modificare rapidamente l’ordine di presentazione delle proprietà da visualizzare nella pagine editprofile.aspx. Anche questa è un operazione possibile da interfaccia utente, certo, ma in che tempi? J

Con PowerShell potrebbero[*] bastare 5 righe di script, vediamolo.

 

Per prima cosa consiglio di creare un file di testo che contiene l’elenco di tutte le proprietà e del loro ordine originale.

 

$profileManager.Properties | select Name, DisplayOrder > F:\Script\properties-order.txt

Notepad F:\Script\properties-order.txt

 

In questo modo possiamo ricavare con certezza i nuovi valori da impostare. Anche in questo caso utilizzeremo un file CSV per eseguire un operazione di modifica “bulk”. La struttura del file CSV è semplicissima: un intestazione (PropertyName,Order) ed una riga per ciascuna proprietà da modificare.

 

Import-Csv "F:\Script\user-properties-order.csv" | ForEach-Object {

$profileManager.Properties.SetDisplayOrderByPropertyName($_.PropertyName,$_.Order)

     $profileManager.Properties.CommitDisplayOrder() 

}

 

Ho notato che tra l’esecuzione dello script e la modifica dell’ordine delle proprietà nell’interfaccia passa qualche secondo, non è immediato come mi sarei aspettato.

Prima di chiudere riporto gli ultimi due esempi, l’aggiornamento di una proprietà esistente e la cancellazione di una proprietà. Anche in questo caso potremmo inserire nella logica dello script un file esterno da cui leggere i dati da aggiornare/cancellare. Direi però che il concetto dovrebbe essere ormai chiaro (giusto?? J), procederò quindi con indicare semplicemente quali sono le istruzioni necessarie per completare entrambi i task. Solo una nota prima di cominciare. Nelle righe di script seguenti ho omesso di riportare la definizione delle variabili che abbiamo impostato all’inizio di questo articolo, nelle vostre prove dovrete ricordarvi di includerle.

Modifica di una user property

Per modificare una proprietà esistente dovremo innanzi tutto selezionarla (Custom-TestPs9 è il nome della mia proprietà).

$myprop = $profileManager.Properties.GetPropertyByName("Custom-TestPs9")

 

Aggiorniamo quindi la user property (il display name in questo caso, ma possiamo andare ad interagire con tutte le impostazioni).

$myprop.DisplayName = "Custom Signature"

 

Confermiamo l’operazione di aggiornamento.

$myprop.Commit()

Cancellazione di una user property

 

Per cancellare una proprietà esistente dovremo ragionare in maniera differente. In primo luogo salviamo in una variabile l’intera collection di tutte le proprietà.

$pmp = $profileManager.Properties

 

A questo punto andiamo a rimuovere la proprietà indesiderata.

$pmp.RemovePropertyByName("Custom-TestPs9")



[*] Consiglio di prevedere sempre negli script che create la gestione di eccezioni e controlli di validità dei dati

Tags


Destinatari


Prodotti

Microsoft SharePoint Server 2010


Bookmark and Share