Vintage Weekend Part II: Ottenere tutti gli utenti del sito con Powershell

Seconda parte della serie Vintage Weekend. Se vi siete persi la prima parte si tratta di esempi di script Powershell pensati per essere utilizzati con SharePoint 2007.

In questo caso il pretesto mi è stato dato da un cliente che aveva bisogno di conoscere tutti gli utenti e gruppi di una site collection. Come nell’esempio precedente trattandosi si SharePoint 2007 è necessario referenziare le librerie che interrogheremo prima di procedere. Successivamente, una volta memorizzato l’oggetto “site collection” effettueremo un ciclo su tutti i gruppi del sito e per ognuno di questi stamperemo a video tutti i nomi utente.

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)
$site = New-Object Microsoft.SharePoint.SPSite(“http://yourservername/sites/yoursitecollection “)
$groups = $site.RootWeb.sitegroups
foreach ($grp in $groups) {
“Group: ” + $grp.name;
foreach ($user in $grp.users) {
”  User: ” + $user.name
}
}
$site.Dispose()

Happy PoSH
– Riccardo


Prossimi eventi SharePoint

Ok, sicuramente non vincerò il premio per essere il primo che ne parla, ma è ormai da tempo che mi riprometto di parlare degli eventi legati a SharePoint ai quali parteciperò in prima persona.

SharePoint Governance – 30 Ottobre 2012, Microsoft Innovation Campus, Milano.

Evento gratuito (previa registrazione) organizzato da Green Team, AvePoint e Nintex sul tema della governance di SharePoint. Non sono sicuramente né il primo né l’unico a ritenere questo uno dei temi caldi e tra i più importanti legati al mondo SharePoint. Al termine dell’evento, per tutti i partecipanti che lo vorranno, SharePint! Per saperne di più http://www.greenteam.it/spgovernance.

SharePoint Future 2012 – 27 Novembre 2012, Microsoft Innovation Campus, Milano.

Il primo evento Italiano interamente dedicato a SharePoint 2013. Durante l’arco dell’intera giornata verranno presentate tutte le novità principali della nuova versione di SharePoint, in un evento ricco di contenuti tecnici esclusivi nati dall’esperienza sviluppata in questi lunghi mesi di studio sulla beta 2. Per saperne di più http://www.sharepointconference.it/events/Future2012.

SharePoint and Office Conference 2013 – 5, 6, 7 Marzo 2013, Centro Congressi MilanoFiori, Assago (MI)

L’evento di punta della stagione 2012/2013. Tre giorni interamente dedicati a SharePoint in cui alcuni tra i maggiori esperti italiani ed internazionali parleranno delle loro esperienze sul campo presentando contenuti unici. Personalmente non vedo l’ora di ascoltare professionisti del calibro di Luca Bandinelli, Spencer Harbar, Mirijam van Olst e molti altri ancora da confermare. Per saperne di più http://www.sharepointconference.it/events/2013.

Infine segnalo un altro evento non direttamente legato a SharePoint, ma supportato da SharePointCommunity.it. Si tratta della Windows Server Conference 2012. L’evento si terrà il 25 e 26 Ottobre 2012 presso l’Enterprise Hotel in Corso Sempione, 91 a Milano. Per saperne di più http://www.serverconference.it/events/2012.

Ci vediamo li?
– Riccardo


Office 365 & Project Collaboration

Che YouTube fosse una risorsa, e non un semplice sito, mi era chiaro già da un po’. Ciò nonostante sono sempre positivamente sorpreso quando mi imbatto in canali come MSFTProject. Non saprei dire se si tratti o meno di una risorsa “ufficiale” Microsoft, non sembra, ma la cosa interessante è il suo contenuto interamente dedicato a Microsoft Project.

Segnalo questi due video (in inglese), il primo più generico, presenta una panoramica sulle funzionalità di SharePoint Online in Office 365, mentre il secondo è specifico sull’integrazione di Microsoft Project 2010 con SharePoint Online.

Buona visione
-Riccardo


Modificare List View con PowerShell

Qualche giorno fa Barbara (collega, amica e sp-musa in Green Team) mi ha posto una domanda a cui, li per li, non ho saputo rispondere. La domanda era (più o meno) questa: devo effettuare una modifica alla vista di default di un totale di circa 120 document library suddivise in una dozzina di site collection, posso farlo con PowerShell, vero?

La mia risposta è stata abbastanza inutile. Si, si può fare, ma non avendolo mai fatto prima dovrei documentarmi un pò prima di esserti utile.

In realtà le operazioni necessarie sono molto semplici. Come prima cosa dobbiamo memorizzare in una variabile il web che contiene la lista.

$web = Get-SPWeb http://intranet

In altre due variabili, $list e $view, memorizziamo quindi gli oggetti lista e vista. In entrambi i casi utilizzeremo due metodi dell’oggetto web: GetList e GetViewFromUrl.

$list = $web.GetList(“/Shared Documents”)

$view = $web.GetViewFromUrl(“/Shared Documents/Forms/AllItems.aspx”)

Arrivati a questo punto dovremo richiamare l’istanza del campo da aggiungere nella visualizzazione, memorizzando anche in questo caso in una variabile. Nell’esempio seguente Amount è il nome del mio campo.

$amount = $list.Fields[“Amount”]

Se volessi aggiungere più di un campo mi basterebbe duplicare quest’ultima riga per tutti i campi da aggiungere alla vista, prestando attenzione a modificare il nome della variabile.

Fatto questo dovremo utilizzare il metodo Add della proprietà ViewFields riferita all’oggetto vista che abbiamo memorizzato nella variabile $view. (Perdonatemi quest’ultima frase, mi sembra una strofa della canzone “Alla fiera dell’est”…).

$view.ViewFields.Add($amount)

Anche in questo caso vale la considerazione fatta in precedenza. Se avete la necessità di aggiungere più campi potrete ripetere quest’ultima operazione, modificando adeguatamente il nome della variabile.

Nel caso doveste sbagliarvi eseguendo due volte lo stesso comando identico, il campo in questione verrà aggiunto alla visualizzazione tante volte quante volte è stato eseguito il comando. In questo caso basterà utilizzare il metodo Delete per rimuovere le istanze di campo in eccesso.

$view.ViewFields.Delete($amount)

In entrambi i casi, Add o Delete, per confermare l’operazione dovremo semplicemente aggiornare la configurazione della vista utilizzando il metodo Update.

$view.Update()

Tornando all’esigenza di Barbara queste poche righe non avrebbero aiutato molto, ma immaginatele combinate alla possibilità di creare un ciclo su una serie di dati letti da un file CSV, in pochi minuti avremmo potuto aggiornare tutti i siti.

Supponendo di avere già predisposto un file CSV le cui intestazioni di colonna si chiamano csvWeb, csvList, csvView e csvField, lo script completo potrebbe somigliare a questo.

Import-Csv “C:\Script\allitems-fields.csv” | ForEach-Object {

$web = Get-SPWeb $_.csvWeb

$list = $web.GetList($_.csvList)

$view = $web.GetViewFromUrl($_.csvView)

$field = $list.Fields[$_.csvField]

$view.ViewFields.Add($field)

$view.Update()

}

Vi ricordo che qualsiasi script troviate sul web, e a maggior ragione i miei, sarebbe doveroso testarli in ambienti di test prima di utilizzarli in produzione.

Un ultima segnalazione prima di salutarvi. Al link seguente (in inglese) trovate tanti altri esempi su come lavorare sulle liste con PowerShell, ve lo consiglio.

Happy PoSH
– Riccardo


Cambiare la pagina di Access Denied con Powershell

Tra i feed RSS letti negli ultimi giorni, uno ha colpito particolarmente la mia attenzione (tralasciando le notizie in arrivo dalla #SPC11). In questo post viene mostrato come cambiare la pagina di accesso negato di SharePoint 2010 programmaticamente, sostituendola con una personalizzata.

Essendo interessato all’argomento, ma NON essendo decisamente uno sviluppatore, mi sono chiesto come potere girare a mio vantaggio queste poche righe di codice. Da qui a pensare a Powershell il passo è breve.

Non ci vuole un genio per capire capire che l’oggetto a cui si riferisce il codice è la web application. Di conseguenza ho memorizzato in una variabile la mia web application di prova e in una seconda variabile il path della mia pagina di accesso negato personalizzata. Inutile dire che questa pagina deve esistere su file system.

$webapp = Get-SPWebApplication http://sp-2010
$adpage = “/_layouts/MyCustomLayout/AccessDenied.aspx”

Per capire se l’oggetto web application memorizzato nella variabile $webapp disponesse o meno di un metodo più o meno simile a quello visto nell’esempio, ho utilizzato la cmdlet get-member in pipeline con l’oggetto web application.

$webapp | Get-Member

Bingo! Abbiamo proprio lo stesso metodo, UpdateMappedPage. A questo punto ho commesso un errore che mi è stato d’aiuto per arrivare alla soluzione. Ho cioè pensato che per il passo successivo fosse necessario passare un oggetto e ho quindi scritto quanto segue:

$webapp.UpdateMappedPage(‘SPWebapplication.SPCustomPage.AccessDenied’,”/_layouts/MyCustomLayout/AccessDenied.aspx”)

L’errore che ne è derivato è stato significativo.

Access Denied

Risulta infatti chiaro che UpdateMappedPage accetta un set predefinito di valori testuali, tra i quali quello che ci interessa direttamente: AccessDenied. E’ interessante notare anche le altre opzioni, dovrebbero farvi venire in mente un po’ di prove interessanti da fare. Almeno per me è stato così 🙂 Ho quindi corretto lo script in questo modo.

$webapp.UpdateMappedPage(“AccessDenied”,$adpage)

Per confermare l’impostazione è necessario eseguire l’update dell’oggetto web application ed infine il riavvio di IIS. Sinceramente non ho provato con il semplice recycle dell’application pool della web application. Se qualcuno dovesse provarlo me lo faccia sapere 🙂

$webapp.Update()
iisreset

Il gioco è fatto. Si, ma non ho ancora finito. Dovendo ripristinare la configurazione originale basterebbe passare un valore null al posto della pagina (ripeterò solo le ultime tre righe).

$webapp.UpdateMappedPage(“AccessDenied”,$null)
$webapp.Update()
iisreset

E se volessimo leggere la configurazione corrente? Ancora una volta la cmdlet Get-Member è stata fondamentale. Dall’elenco prodotto in precedenza ho infatti notato la presenza del metodo GetMappedPage. Nonostante MSDN parli anche della possibilità di  utilizzare questo metodo passando come valore il tipo della pagina, cioè AccessDenied, io non so riuscito. Ho ottenuto il risultato sperato passando il path della pagina standard di accesso negato.

$webapp.GetMappedPage(“/_layouts/AccessDenied.aspx”)

Se poi volessimo…. No, scherzo, ho finito. E poi è appena resuscitato Optimus Prime, devo proprio andare 🙂

– Riccardo

UpdateMappedPage: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebapplication.updatemappedpage.aspx
GetMappedPage: http://msdn.microsoft.com/en-us/library/ee551363.aspx
Il post originale: http://www.anmolrehan-sharepointconsultant.com/2011/08/how-to-use-custom-access-denied-page-in.html


SharePointCommunity.it nuovo articolo

Vi segnalo un mio nuovo articolo pubblicato sul sito di SharePointCommunity.it: Come leggere proprietà del profilo utente in moduli InfoPath 2010.

Molto spesso lavorando su progetti che prevedono l’utilizzo di form InfoPath mi viene chiesto di poter accedere ad alcune proprietà dello User Profile  dell’utente che sta compilando il modulo. In questo articolo vedremo come fare, come sempre senza scrivere codice.

Nelle prossime settimane seguirà una seconda parte, dove vedremo come poter leggere proprietà, sempre dagli User Profiles, ma di un un utente differente da quello correntemente loggato al sito SharePoint. Stay tuned ;).

– Riccardo


Learning SharePoint 2010

A volte mi sembra di essere un simpatico vecchietto quando faccio dei pensieri che cominciano con “ma vi ricordate quando…”, me lo dice persino mia moglie 🙂

Ad ogni modo: vi ricordate quando uscì SharePoint Portal Server 2003 e, successivamente MOSS 2007? I blog scarseggiavano e trovare materiale utile sul web era quasi un impresa epica.

Per SharePoint 2010 è decisamente tutta un’altra storia. Più volte Igor, Giuseppe, Romeo e molti altri hanno segnalato di corsi on-line o materiale formativo rilasciato direttamente da Microsoft. I formati sono dei più disparati, ho provato a raccoglierli in questa pagina. L’idea è quella di continuare ad aggiornare questa pagina, magari anche grazie alle vostre segnalazioni e commenti.

Sicuramente l’elenco non è completo, chissà quante altre cose mi saranno sfuggite, ma spero possa aiutare anche solo uno di voi a sviluppare la conoscenza di questo prodotto.

Video demos and training for SharePoint Server 2010

http://technet.microsoft.com/en-us/library/cc262880.aspx

Learn SharePoint Server 2010

http://technet.microsoft.com/en-us/sharepoint/ee410529

TechNet & MSDN Virtual Labs: SharePoint Products and Technologies

http://technet.microsoft.com/en-US/virtuallabs/bb512933.aspx

http://www.microsoft.com/events/series/sharepointserver.aspx?tab=virtuallabs

I Use SharePoint

http://sharepoint.microsoft.com/iusesharepoint/landing.aspx

SharePoint 2010 Productivity Hub (pre-SP1)

http://www.microsoft.com/download/en/details.aspx?id=7122

PerformancePoint Services SuperFlows

http://technet.microsoft.com/en-us/library/hh407292.aspx

SharePoint 2010 and Windows Azure Training Course

http://msdn.microsoft.com/en-us/SPAzureTrainingCourse

Learn SharePoint Development

http://msdn.microsoft.com/en-us/sharepoint/aa905692

TechNet Script Center Repository #SharePoint

http://gallery.technet.microsoft.com/ScriptCenter/site/search/?f%5B0%5D.Type=RootCategory&f%5B0%5D.Value=sharepoint&f%5B0%5D.Text=SharePoint

Office 365 for the IT Pro – Platform

http://www.microsoftvirtualacademy.com/tracks/office-365-for-the-it-Pro-Platform

Video demos and training for Duet Enterprise

http://technet.microsoft.com/en-us/library/gg185652.aspx

Buona lettura 🙂

-Riccardo