Verificare lo stato di un servizio con Powershell

Buon ferragosto a tutti! Aspettando la partenza per la “Maremma Antibiotica” (cit. il Maestro M.C. :)) ne approfitto per condividere un semplice script Powershell per verificare lo stato di un servizio (inteso come Windows Service).

Il contesto mi è stato offerto dalle mie VM di test di SharePoint 2013, Server e Foundation, che ad ogni avvio mi si presentano con i servizi di SQL Server stoppati. Premesso che sarebbe stato più corretto ricercare la causa di questo comportamento, mi sono divertito ad imparare qualcosa che non avevo mai provato.

Cominciamo dando un occhiata allo script completo:

gsv | ?{$_.Name -match “SQL”} | foreach-object{
if ($_.Status -ne “Running”){
try {
Start-Service $_.Name -ErrorAction SilentlyContinue
} catch {
write-host “unable to start service”, $_.Name -nonewline
}
}
}

Per prima cosa ho utilizzato la cmdlet Get-Service nella sua forma ridotta (alias) gsv. Ho selezionato solo i servizi nel cui nome è presente la stringa utilizzando il filtro ? {$_.Name -match “SQL”}. Per ciascun elemento (servizio) ne verifico lo stato sfruttando la proprietà Status. Se diverso da “Running” provo ad avviarlo utilizzando la cmdlet Start-Service. Per evitare che lo script si blocchi in caso di errore ho inserito quest’ultimo comando in una “condizione” try – catch, stampando a video il nome del servizio che non ri riesce ad avviare.

Nel caso in cui non dovesse essere possibile selezionare con la stessa query più servizi, possiamo creare un array di servizi (in realtà nomi di servizi e “ciclare” su questi). Vediamo come.

$services = @(“THREADORDER”,”SPOOLER”,”WSEARCH”) ## In questo modo creiamo l’elenco dei servizi da verificare

## nelle successive righe eseguiamo il ciclo sui nomi, otteniamo il servizio corrispondente e proviamo ad avviarlo

foreach ($service in $services){
$svc = gsv $service
if ($svc.Status -ne “Running”){
try {
Start-Service $svc -ErrorAction Stop
} catch {
Write-Host “Unable to start service”, $svc.Name -nonewline
}
}
}

Una volta completato lo script l’ho salvato in un file .ps1 è ho schedulato la sua esecuzione all’avvio del server. Come? Sempre con Powershell ovviamente :)

Powershell a parte, avete avuto modo di vedere (e di votare!!!) il video di Green Team nella pagina del concorso SharePoint’s Got Talent? No? Il video è stupendo e ricco di attori sconosciuti ma di gran talento, votare (eh guardare) per credere :D

Ora vado a terminare le valigie, tra poche ore si parte!!
– Riccardo

 

Modifica e test del server SMTP con Powershell

Chissà perchè nel passaggio 2007 > 2010 Microsoft non abbia ritenuto di mettere a disposizione una cmdlet per la configurazione del server di posta in uscita (SMTP), corrispondente al vecchio comando stsadm -o email. Technet riporta infatti ancora lo stesso comando (http://technet.microsoft.com/en-us/library/cc263462.aspx) e anche nella pagina relativa ai mapping stsadm / Powershell (http://technet.microsoft.com/en-us/library/ff621084.aspx) non si trova corrispondenza.

Questo non signifca però che non si possa fare, bastano poche righe :)

Prima di tutto memorizzo i dati da configurare all’interno di quattro variabili.

$smtpServer = ‘mail.sharepoint.corp’
$smtpFrom = ‘admin@sharepoint.corp’
$smtpReplyTo = ‘admin@sharepoint.corp’
$smtpCharset = 65001

In una nuova variabile memorizzo l’oggetto “Web Application” corrispondente alla Central Administration*.

$caWebApp = Get-SPWebApplication -IncludeCentralAdministration | ?{ $_.IsAdministrationWebApplication }

e utilizzo infine il metodo UpdateMailSettings di questo oggetto per configurare il server di posta in uscita.

$caWebApp.UpdateMailSettings($smtpServer, $smtpFrom, $smtpReplyTo, $smtpCharset)

* Dato che la configurazione del server SMTP può essere personalizzata per Web Application basterà selezionare la web application desiderata al posto della Central Administration per modificarne la configurazione.

Una volta apportata la modifica al server di posta è consigliabile effettuare un test per verificare che tutto funzioni a dovere. Anche per questo possiamo usare poche righe di Powershell. Tramite il metodo SendMail dell’oggetto SPUtility (http://msdn.microsoft.com/en-us/library/ms477270.aspx) invieremo un email sfruttando la configurazione SMTP di un sito SharePoint. Più facile a farsi che a dirsi.

$web = Get-SPWeb “http://intranet
$sent = [Microsoft.Sharepoint.Utilities.SpUtility]::SendEmail($web,$false,$false,”riccardo@sharepoint.corp”,”Oggetto del messaggio”,”Corpo del messaggio”)

La variabile $sent assumerà il valore di True o False a seconda che l’invio del messaggio riesca o meno. Semplice no?

– Riccardo

Elencare tutti gli utenti Site Collection Administrator (con Powershell)

Navigando tra i thread dei forum dedicati a SharePoint su Technet spesso incontro domande che stimolano la mia curiosità. E’ successo anche oggi quando un utente chiedeva come poter ottenere un elenco di tutti gli utenti site collection administrator per poter inviare loro un e-mail. Il punto non era tanto l’invio della mail quanto il poter ottenere una lista di utenti e indirizzi e-mail.

Utilizzando Powershell l’operazione risulta molto semplice:

Get-SPWebApplication | Get-SPSite -Limit All | ForEach-Object{
Get-SPUser -Web $_.URL | ?{$_.isSiteAdmin -eq “$true” -and $_.Email -ne “”} | select DisplayName, Email
}

Questo script cicla tutte le Site Collection di tutte le Web Application della farm selezionando gli utenti Site Collection Administrator con un indirizzo e-mail e ne mostra Display Name e E-mail. Volendo potremmo completare il tutto esportando i nostri dati utilizzando la cmdlet Export-Csv, ottenendo quindi:

Get-SPWebApplication | Get-SPSite -Limit All | ForEach-Object{
Get-SPUser -Web $_.URL | ?{$_.isSiteAdmin -eq “$true” -and $_.Email -ne “”} | select DisplayName, Email | Export-Csv C:tempSiteCollectionAdministrators.csv
}

Beat the Heat
– Riccardo

FAST Search e Powershell ISE

Anche durante l’installazione e la configurazione di FAST Search for SharePoint 2010 Powershell ha un ruolo molto importante. Al pari di SharePoint 2010 anche FAST Search ha la sua shell e proprio come sua “sorella” in alcuni casi è un pò limitativa. Perciò, lavorando su SharePoint uso molto spesso Powershell ISE aggiungendo come prima cosa il/lo/la snap-in Microsoft.SharePoint.Powershell con il comando seguente:

Add-PSSnapin Microsoft.SharePoint.Powershell

Anche per quanto riguarda FAST Search, bisogna fare lo stesso, ma aggiungendo ovviamente il/lo/la snap-in corrispondente, cioè:

Add-PSSnapin Microsoft.FASTSearch.Powershell

Beat the Heat
– Riccardo

Gestione dei solution package con PowerShell

Molto spesso mi è capitato di trovarmi da clienti e avere la necessità di configurare una nuova farm SharePoint con le stesse caratteristiche di una seconda farm esistente. Di solito procede tutto bene fino a quando si tratta di installare le solution custom. Nella migliore delle ipotesi i solution package (wsp) ci sono “ma non so se è la versione installata”, nella peggiore i wsp si sono dati alla macchia.

Per fortuna Super Windows PowerShell ci viene in aiuto. Grazie allo script seguente è possibile scaricare tutti i solution package installati in una farm SharePoint. Ovviamente, lavorando con i filtri è possibile restringere il campo a wsp specifici, come riportato nel secondo esempio.

(Get-SPFarm).Solutions | ForEach-Object{

$filepath = "C:WSP" + $_.Name;

## In alternativa è possibile salvare i wsp nel path da dove viene ## eseguito lo script PowerShell utilizzando la riga seguente

## $filepath = (Get-Location).Path + "" + $_.Name;

$_.SolutionFile.SaveAs($filepath)

}

Nel prossimo esempio utilizzeremo lo stesso script precedente, ma selezionando solo i wsp il cui nome contiene “GreenTeam”.

(Get-SPFarm).Solutions | ?{$_.Name –match "GreenTeam"} | ForEach-Object{

$filepath = "C:WSP" + $_.Name;

## In alternativa è possibile salvare i wsp nel path da dove viene ## eseguito lo script PowerShell utilizzando la riga seguente

## $filepath = (Get-Location).Path + "" + $_.Name;

$_.SolutionFile.SaveAs($filepath)

}

Allo stesso modo del download è possibile automatizzare l’upload nel solution store dei wsp leggendo il contenuto di una cartella locale.

$filepath = "C:WSP"

$Files = get-childitem $filepath -include *.wsp -recurse

ForEach ($File in $Files){

Add-SPSolution -LiteralPath $File.FullName

write-host "$File.Name added to the solution store"

}

Eventualmente è anche possibile definire il deploy delle solution presenti nel solution store, anche se a dire la verità viste le possibili differenze tra le diverse solution non so se sia possibile creare uno script adatto a tutti. In ogni caso, diciamo “per accademia”, ecco come fare.

$webapp = Get-SPWebApplication http://intranet

Get-SPSolution | ForEach-Object {

Write-Host $_.SolutionId

Install-SPSolution $_.SolutionId -Force -GACDeployment -WebApplication $webapp

}

Happy PoSH
– Riccardo Bourne

Campi Person or Group in SharePoint Designer 2010

Con questo post vorrei inaugurare una serie di post dove condividere brevi pillole sugli argomenti più vari, ovviamente sempre nell’orbita del mondo SharePoint.

Se ho capito bene come fare dovreste trovare anche un link dove verranno raggruppati tutti i post di questa categoria.

Lavorando con SharePoint Designer alla creazione di Data Form Web Part o alla personalizzazione di stili per la Content Query Web Part, capita spesso di imbattersi in campi di tipo Person or Group, pensate anche semplicemente ai campi Autore o Autore Ultima Modifica.

SharePoint Designer 2010 ci offre la possibilità di “consumare” il nostro dato in forma diversa. L’immagine seguente è un dettaglio dell’origine dati SharePoint, dove Nome è un campo di tipo Person or Group.

image

Se ne deduce facilmente che nei nostri template xsl potremo utilizzare tutti e quattro i formati:

A mio avviso l’aspetto più pratico è quello di poter utilizzare il nome nell’utente senza dover per forza di cose o applicare una normalizzazione del dato o “ereditare” tutta la struttura HTML a supporto di questo tipo di campo.

Happy SPD
– Riccardo