sabato 10 giugno 2017

Creazione di un servizio Windows con Visual Studio

CREAZIONE DI UN SERVIZIO WINDOWS CON VISUAL STUDIO
In un sistema operativo Windows, un servizio è un’entità, a cui è associato un eseguibile, che effettua operazioni senza l’intervento di un utente specifico, perché il servizio “appartiene” al sistema operativo.
Solitamente è utilizzato per operazioni in cui non deve essere richiesto l’intervento dell’utente.
Ma vediamo come creare un servizio windows con Visual Studio.
Visual Studio solitamente ha tra i suoi Modelli di progetto anche il Servizio Windows, comunque è possibile creare direttamente una classe che implementa la classe base  System.ServiceProcess.ServiceBase. Questa classe contiene un metodo astratto OnStart(string[] args) , che verrà chiamato quando il servizio viene avviato.
Purtroppo però non è possibile eseguire il debug su Visual Studio come eseguiamo il debug con altri programmi che presentano il metodo main. Per provare il nostro programma dobbiamo compilare l’eseguibile exe che per funzionare dovrà essere installato sul sistema. Ecco che la sovrastruttura .NET ci agevola il tutto aggiungendo un installer al nostro progetto.
Un Installer per un servizio non è altro che una classe che eredita da una classe della piattaforma .NET i cui metodi verranno chiamati da un apposito tool (InstallUtil) per installare il servizio.
 Ecco i due modi possibili per aggiungere un installer alla nostra classe:
1.     Apriamo la nostra classe in Design Mode, e cliccando col tasto destro su uno spazio vuoto, scegliamo “Add Installer”
2.     Aggiungendo una classe che eredita da System.Configuration.Install.Installer
Seguendo il secondo metodo, aggiungiamo manualmente una classe e la facciamo ereditare da System.Configuration.Install.Installer.
A questa classe aggiungiamo due proprietà:
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
private System.ServiceProcess.ServiceInstaller serviceInstaller1;
La prima proprietà è l’installer relativo al processo che verrà lanciato dal nostro servizio, mentre la secondo è l’installer relativo al processo vero e proprio.
Impostiamo i campi dell’oggetto serviceProcessInstaller1:
·        Parent: è il nome della classe di tipo System.Configuration.Install.Installer che contiene il serviceInstaller
·        Account: il tipo di “privilegio” che avrà il nostro processo. Sono 4 i tipi:
o   LocalService: Utente con i più bassi privilegi
o   NetworkService: Medio privilegio
o   LocalSystem: Utente coi più alti privilegi
o   User: Avvio del servizio con un utente in particolare
Per il nostro esempio, scegliamo il secondo, quindi this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
Impostiamo invece quelli dell’oggetto  serviceInstaller1:
·        L’unico campo rilevante è il ServiceName, ovvero il nome del nostro servizio, quello che comparirà tra i servizi del tool mmc.exe
Adesso che il nostro servizio base è impostato, aggiungiamo un qualcosa che ci dice che il nostro servizio funziona, altrimenti lo vedremo con lo stato “in esecuzione” non trovando nessuna evidenza del fatto che stia funzionando
APPLICAZIONE: AGGIUNTA DI UN TIMER
Aggiungiamo una proprietà di tipo System.Timers.Timer alla nostra classe relativa al servizio.
Facendo un override del metodo OnStart(string[] args), che verrà eseguito non appena viene avviato il processo, aggiungiamo il codice dove inizializziamo il nostro timer:

protected override void OnStart(string[] args)
        {
            timer1 = new Timer(5000);
            timer1.Elapsed += Tick;
            timer1.Enabled = true;
            timer1.Start();
        }
Il nostro è quindi partito, eseguendo il metodo Tick ogni 5000 millisecondi.
Nel metodo Tick metteremo del codice che scrive un file di testo nella root del nostro hard disk. E’ importante che per fare questo, il tipo di servizio venga lanciato coi privilegi di LocalSystem, come detto sopra.
Di seguito il metodo Tick:

protected override void Tick(object sender, ElapsedEventArgs e)
        {
            StreamWriter t = new StreamWriter("C:\\DMTService_log.txt", true);
            t.WriteLine(DateTime.Now + "-evento tick");
            t.Close();
        }

Adesso che il nostro servizio è pronto, compiliamo il tutto e passiamo all’installazione del servizio.

INSTALLAZIONE DEL SERVIZIO
L’installazione del servizio verrà fatta col metodo installutil.exe, un tool della piattaforma che troviamo nella directory della nostra installazione .Net.
Per esempio, aprendo cmd.exe, scriviamo sulla console:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe C:\Users\Alberto\Documents\DMTDocumentService\DMTDocumentService\bin\Release\DMTDocumentService.exe
A questo punto il servizio è installato e quindi basta andare su Gestione Attività di Windows, tab Servizi, cercare il nostro servizio e attivarlo.

Basta andare sulla root “C:\” e vedremo il file DMTService_log.txt con il log che si aggiorna ogni 5 secondi. 

domenica 8 gennaio 2017

Wastats, app Android per le statistiche whatsapp

Avete mai avuto la "curiosità" di fare le statistiche dei vostri messaggi whatsapp? Fare una ricerca per periodi, mittente, testo, argomento ecc.? Ebbene, io si. Dopo varie soluzioni avallate per creare una app del genere, sono arrivato a una soluzione concreta per farlo.

Si sa, il database whatsapp è criptato, prima aveva una chiave di cifratura che si era conosciuta, ma con i nuovi aggiornamenti whatsapp era diventata obsoleta. Ho cercato più volte di decriptare quel database, ma non ci sono mai riuscito con una soluzione duratura nel tempo. Oltretutto, ultimamente le conversazioni sono criptate end-to-end, quindi è ancora più difficile.

La soluzione che ho adottato è quella di esportare una singola conversazione, gruppo o broadcast tramite testo (è possibile inviarlo tramite e-mail in formato testo).
La piccola app che ho scritto non fa altro che leggere questo file di testo, fare il parsing e caricarlo tutto su un database interno della app, in modo da fare query. La versione attuale permette di interrogare il database manualmente con le query, ma sto già lavorando a un'interfaccia più user-friendly con i filtri. 

Per ora Wastats è fortemente in BETA, l'interfaccia è molto spartana, perché finora mi sono dedicato principalmente alla part funzionale.
Attualmente ci sono essenzialmente due funzioni: quella per caricare il database con nuovi dati di una nuova conversazioni e quella per interrogare il database. 

Aggiorna database

Questa è la funzione per caricare nuovi dati. "Seletta" è un tasto che non fa nulla, l'ho messo all'inizio pensando mi dovesse servire invece no, stessa cosa per "Crea database". Basta premere il tasto aggiorna e il programma cercherà nella memoria esterna (o nella cartella download, non ricordo) i file di tipo testo che iniziano con il filtro "Chat Whatsapp". Dopo che vengono elencati, basta premere il file che si vuole caricare, e vi verrà chiesto un "argomento", ovvero una stringa che identifica la conversazione esempio "famiglia", oppure "gruppo amici", per facilitare l'estrazione dei dati. Dopo di che premere OK e una progress bar ci mostrerà l'avanzamento del processo. 









Interroga database

Da qui invece si fanno le query sqlite vere e proprie sul database, come da screenshot:
 

Qui c'è il link con lo zip che contiene l'apk:
https://drive.google.com/file/d/0B2K4nLFPcS-obTZBTzdMNU5RYUE/view?usp=sharing