Report dimensioni site collection con Powershell

E’ passato un po’ di tempo dall’ultimo post e mi accingo ad “inaugurare” il nuovo anno esattamente da dove l’avevo lasciato, cioè da Windows PowerShell.

Ne approfitto già che ci sono per ricordarvi che alla prossima SharePoint & Office Conference io e Claudio terremo una sessione su PowerShell 3 e SharePoint 2013, se siete da quelle parti fatevi riconoscere :).

Ma torniamo a noi. Di recente un cliente mi ha chiesto un report giornaliero sulle dimensioni di una serie di site collection (SharePoint 2010). Un possibilità era quella di suggerire al cliente di aprire la site collection con SharePoint Designer tutte le volte che ne aveva voglia e controllare da se. Ottima idea per interrompere subito i rapporti con la maggior parte dei clienti :). Affidarsi alle dimensioni del content database non fornisce sufficienti informazioni sul reale livello di utilizzo del sito in quanto lo stesso database può contenere più site collection. Inoltre penso sia applicabile la stessa considerazione fatta in precedenza.

La strada che ho intrapreso è stata, inutile ribadirlo, quella di utilizzare uno script PowerShell. Concettualmente è molto semplice. Faccio un ciclo su tutte le site collection, memorizzo sia lo spazio utilizzato dalla site collection che dal content database ed invio i risultati via email ad uno o più destinatari . Lo script è pensato per essere eseguito tramite Task Scheduler.

Ecco lo script:

if ((Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue) -eq $null){
Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue
}

<## Nelle righe seguenti vado a ricavare l’indirizzo del server SMTP configurato nella Central Administration e imposto qualche variabile di servizio ##>

$nl = [environment]::NewLine
$message = “”
$storage = 0
$ca = Get-SPWebApplication -IncludeCentralAdministration | ?{$_.IsAdministrationWebApplication -eq “True”}
$smtpServer = $ca.OutboundMailServiceInstance.Server.Address

<## A questo punto ciclo su web application e site collection, ordinando i risultati per spazio occupato. Nel ciclo formatto i valori in modo che siano numeri leggibili e creo il messaggio da inviare ##>

Get-SPWebApplication | Get-SPSIte -Limit All | Sort-Object -Descending -Property $_.usage.storage | %{
$db = Get-SPContentDatabase $_.ContentDatabase ;
$dbsize = “{0:N2}” -f ($db.DiskSizeRequired/1GB) ;
$size = “{0:N2}” -f ($_.usage.storage/1GB);
$message += $nl + $nl + $_.Url + “; ” + $size + ” GB; ” + ($_.ContentDatabase -replace “SPContentDatabase Name=”,””) + “; ” + $dbsize + ” GB;”
$storage += $_.usage.storage
}

<## Aggiungo al messaggio la somma dello spazio occupato da tutte le site collection. Alle righe successive imposto il messaggio di posta e lo invio. ##>

$message += $nl + $nl + “Totale storage {0:N2}” -f ($storage/1GB) + ”  GB”

$date = Get-Date
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = “me@mioserver.it
$msg.ReplyTo = “me@mioserver.it
$msg.To.Add(“te@tuoserver.com“)
$msg.subject = “Report storage site collections ” + $date.ToShortDateString()
$msg.body = $message
$smtp.Send($msg)

Puoi scaricare lo script dal mio SkyDrive, a tuo rischio e pericolo, si intende 🙂

Se invece questo tipo di informazioni servono una tantum e nel più breve tempo possibile devo convenire con Igor che il comando stsadm -o enumsites -url http://miosito è probabilmente la soluzione più veloce. Anche se io continuo a preferire the Powershell way 🙂

Happy PoSH
– Riccardo

SharePoint & Office Conference 2013

Annunci

Ripristinare timer job definition

Recentemente mi è capitato di seguire un attività di troublshooting su una farm MOSS “gambizzata”. Per errore erano state eliminate tutte le timer job definitions. Per alcune di queste una soluzione, forse poco elengante, è quella di (ri)creare la web application ed effettuare quindi il restore dei dati. Di fatto il solo restore non è sufficiente affinchè vengano ricreate le timer job definitions.

Ma questo non vale per tutti i timer job. Ad esempio non vale per l’Application Server Timer Job e l’Application Server Administration Service Timer Job, dettagli no?? Dopo un po di ricerche ho scoperto che questi timer job vengono creati dalla feature Shared Services, quindi per ripristinari “basta” reinstallare la feature via stsadm. Il comando completo è il seguente:

stsadm -o installfeature -name SharedServices -force

I timer job che vengono ricreati sono: Application Server Timer Job, Application Server Administration Service Timer Job, Licensing Synchronizer Job.

<Edit>
Prima di arrendermi all’evidenza ho provato anche la strada Powershell, ho letto più di un post che parlava di come creare timer job definition con ps. Purtroppo mi blocco alla lettura delle timer job definition presenti per la mia web application. Condivido con voi lo script, se qualcuno avesse voglia e tempo di completarlo mi faccia sapere, sono curioso 🙂

[void][reflection.assembly]::LoadWithPartialName(“Microsoft.SharePoint”)
[void][reflection.assembly]::LoadwithPartialName(“Microsoft.Office.Server”)

$SPSite = New-Object Microsoft.SharePoint.SPSite(“http://moss“)

$webApp = $SPSite.WebApplication

foreach ($timerjob in $webApp.JobDefinitions){
    Write-Host $timerjob.TypeName, $timerjob.Name, $timerjob.ID, $timerjob.Parent;
}

Qui potete trovare maggiori dettagli sulle informazioni disponibili in JobDefinitions. Ai fini pratici questo script non mi è servito proprio a niente, in compenso mi sono divertito a fare un po’ di pratica su Powershell 😉

</Edit>

– Riccardo