Archives For ps1

Una raccolta di riferimenti, più che altro, forse utile per chi fuori da qui utilizza strumenti per il controllo remoto dei dispositivi aziendali come iPhone o iPad e necessita di aggiungere rapidamente configurazioni al dispositivo. Stavolta niente pappa pronta, più paio di collegamenti utili per costruire, come ho fatto io, un buono script PowerShell che ti permetta di creare un file di tipo MobileConfig da dare in pasto a iPhone o iPad (anche via console di terze parti come Cisco Meraki o AirWatch).

PowerShell: generare .Mobileconfig partendo dai PFX

Giusto per capirci un po’ meglio. Il file MobileConfig è in realtà un XML che puoi aprire con qualsiasi editor di testo (io utilizzo Notepad++ in ogni caso), e che propone una serie di informazioni in grado di istruire in un colpo solo il dispositivo di destinazione. Un collegamento a una particolare rete WiFi, un certificato utente che permette l’autenticazione su applicazioni web aziendali, ecc. Molte di queste informazioni possono rimanere identiche tra più utenti, altre invece no (come il certificato di sicurezza personale che permette l’autenticazione su una WiFi, per esempio).

Per questo motivo ho scritto un codice PowerShell che fonda insieme le informazioni e che, prendendo in pasto il file PFX generato da un server di dominio (esportazione del certificato utente e della chiave privata, protetto da password), generi autonomamente il XML con estensione MobileConfig da caricare successivamente sulle piattaforme di management dei dispositivi mobili.

Si tratta tutto sommato di comandi basilari, come un Add-Content "Utente.mobileconfig" -value $blocco -encoding UTF8 dove il $blocco è magari una parte di quelle informazioni precedentemente inserite nella variabile, che rimane sempre uguale, che può essere replicata per ciascun file MobileConfig da generare. Poi c’è il PFX, che va encodato e poi inserito in una variabile che utilizzerò in seguito, utilizzando un blocco simile a questo:

#Inietto contenuto PFX personale
certutil -encode ("$PFXDir\" + $($i.Name)) "Temp.enc"
$base64 = Get-Content "Temp.enc" 
$base64 = $base64[1..($base64.count - 1)]
Add-Content "Utente.mobileconfig" -value $base64 -encoding UTF8
#Rimuovo file ENC precedentemente creato
Remove-Item "Temp.enc"

Dove $PFXDir sarà la directory contenente i file PFX (ma va?) e Temp.enc viene generato esclusivamente per poterne catturare il contenuto (encodato in base64).

Da qui in poi si potranno aggiungere ulteriori blocchi già stabiliti e che rimarranno sempre uguali, se necessario (occhio agli UUID per certificati e impostazioni, ogni MobileConfig dovrà averne uno proprio, diverso dall’altro, basterà un’istruzione di tipo [guid]::NewGuid()), fino poi a chiudere il file, fino all’ultimo $blocco.

Ci ho messo un po’ a capire bene la logica che sta dietro la generazione automatica dei MobileConfig, ma una volta arrivato a far funzionare il tutto, è tutto diventato tutto più semplice. Partendo infatti da una cartella contenente i tuoi file PFX, potrai far svolgere il lavoro alla PowerShell semplicemente richiamando un blocco di questo tipo:

$ListPFX = Get-ChildItem $PFXDir | where { ! $_.PSIsContainer } | Select-Object Name
foreach ($i in $ListPFX) {
#Clono il nome PFX (senza estensione) per generare il MobileConfig
$dest = [System.IO.Path]::GetFileNameWithoutExtension($($i.Name))

Dove $ListPFX corrisponderà al contenuto della cartella contenente i PFX, che verrà quindi utilizzata per fare il lavoro sporco dal primo all’ultimo MobileConfig da generare. Vorrei poter pubblicare il codice sorgente del mio PS1 ma ci sono davvero troppi riferimenti aziendali, impiegherei un po’ di tempo a pulirlo e generalizzarlo, rischiando poi di confonderti maggiormente le idee ;-)

Con l’occasione ti lascio qualche collegamento alle fonti utilizzate:

Buon lavoro!

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato ai post "a bruciapelo"!

PowerShell: risultati delle query troncati? Come risolvere il problemaCi avevi mai pensato? In un prompt dei comandi, lanciare un findstr (con i giusti parametri) equivale a cercare un particolare che ti interessa, escludendo tutto il resto. Mi viene in mente un esempio lampo: di una lista di servizi che girano sul sistema (sc query) potrebbe interessarmi sapere se c’è o meno TeamViewer. Tradurlo in un comando di prompt vorrebbe significare qualcosa di molto simile a:

sc query | findstr /I teamviewer
NOME_SERVIZIO    : TeamViewer
NOME_VISUALIZZATO: TeamViewer 11

Ma su PowerShell? Lanciare un findstr mentre si lavora sulla propria sessione di Exchange in cloud non è proprio la stessa cosa, di certo non produce i risultati sperati. Fortunatamente esiste un’alternativa che puoi utilizzare in coda a qualsivoglia comando. Io ho riprodotto un caso specifico che mi ha permesso di individuare un utente in particolare all’interno di una lista più nutrita ottenuta esportando tutte le utenze che hanno un particolare dominio di posta come PrimarySMTPAddress.

Provo a semplificarla: di tutti quelli che hanno l’indirizzo “@dominio1.tld” io voglio sapere se tra di loro si nasconde qualcuno che abbia “Mario” all’interno del suo Alias di Exchange. Questo il risultato per step su PowerShell:

Get-Mailbox -ResultSize Unlimited | where {$_.PrimarySmtpAddress -like "*@dominio1.tld"}

Produce una lista riepilogativa di tutti coloro che hanno l’indirizzo di posta primario con il dominio da me specificato. A questo punto, per filtrare esclusivamente chi fa match con “Mario” all’interno del suo alias, ti basterà filtrare i risultati con il classico pipe in coda:

Get-Mailbox -ResultSize Unlimited | where {$_.PrimarySmtpAddress -like "*@dominio1.tld"} | ? {$_.Alias -match "mario"}

Quel | ? {$_.Alias -match "mario"} si traduce con qualsiasi cosa contenga “mario” all’interno dell’alias, serve quindi a individuare anche un utente che nell’alias potrebbe avere mario.pippo o mariopippo o qualsiasi altra combinazione. Se la query lanciata restituirà un risultato maggiore di zero (e troverà almeno un Mario tra gli alias) otterrai a video il risultato voluto.

Buon lavoro! :-)