Un Semplice Scanner Software/Hardware per Windows


Home Page | Commenti | Articoli | Faq | Documenti | Ricerca | Archivio | Storie dalla Sala Macchine | Contribuire | Login/Register

Un po' di tempo fa ho avuto bisogno di fare un "inventario" dell'hardware e del software installato, cio' significa che sarei dovuto andarmene in giro per l'ufficio a prendere nota dei vari computer (processore, memoria, dischi e cosi' via) e del software installato sulle singole macchine.

Come si puo' ben capire, andarmene in giro a ficcanasare nei vari PC non e' esattamente la mia idea di 'divertimento', quindi mi sono messo a pensare ad un sistema per farlo da remoto, senza muovermi dal mio tavolo.

Windows e' in grado di fornire un sacco di informazioni attraverso SNMP, solo che questo richiede che l'SNMP sia installato sulla macchina e le informazioni fornite sono.. hummm... non proprio quello che mi serviva.

Ragion per cui, mi sono messo alla tastiera e mi sono scritto un semplice software in grado di passarsi il registry al setaccio e di infilarmi le informazioni che mi servivano in un database per una comoda lettura.

Per compilare il codice vi serve Visual C++ versione 5 o superiore, questo e' dovuto al fatto che MySQL ha deciso di distribuire le sue librerie solo per Visual C (grazie tante!), se non avete Visual C o non volete installarlo vi restano due strade: ricompilare le librerie per il vostro compilatore o usare un'altro database. Se volete mettervi a ricompilare le librerie informatemi, dato che dopo averci perso sopra 3 giorni ho lasciato perdere.

Addendum: Marco Nava ha aggirato il problema richiamando direttamente le funzioni, vedi in fondo alla pagina.

ATTENZIONE: quando ho cominciato a scrivere sto' coso erano quattro anni (circa) dal mio ultimo incontro con il linguaggio C, quindi non venitemi a rompere le scatole sul fatto che il codice fa' cagare o che ci sono 'modi migliori' di fare certe cose, lo so da me. Non me ne frega una mazza. Ok?

Se volete compilare il codice dovrete dire a Visual C di usare le librerie wsock32.lib e mysqlclient.lib in aggiunta al resto, vi servono anche gli include files di MySQL e le succitate librerire. Trovate le librerie in ogni distribuzione di MySQL e i file di inclusione nelle distribuzioni sorgenti di MySQL.

Il Registry non e' esattamente il posto migliore per memorizzare informazioni, e' grosso, complicato, si sfascia facilmente ed e' in generale difficile da usare, ma questo si puo' dire dell'intero Windows...

In ogni modo, le funzioni principali per leggere il registry stanno in un paio di API: RegOpenKey, RegEnumValue, RegEnumKeys e RegQueryInfoKey. Queste sono usate per accedere ad una chiave, leggerne i valori, leggere le sottochiavi ed avere informazioni sulla chiave e sui singoli valori.

L'intero processo di scansione puo' essere spiegato come segue:

  1. Aprire una chiave
  2. Leggere i valori
  3. Memorizzare i valori nel database
  4. Leggere le sottochiavi
  5. Per ogni sottochiave ripetere da (1)

Questo se siamo interessati al valore delle sottochiavi, in certi casi le sottochiavi sono ininfluenti, in tali casi mi limito a leggere i valori della chiave principale e basta.

Dopo un po' di prove e controlli nel registry ho deciso di concentrarmi sulle chiavi seguenti:

Le uniche cose che non sono riuscito a capire e' come tirare fuori le informazioni reltative alla RAM fisica installata ed alla dimensione dei dischi fissi. Cosi' ho deciso di barare e di richiamare GlobalMemoryStatus per la ram e DeviceIoControl per i dischi fissi.

Dopo un po' di smanettamenti ho deciso che non avevo voglia di cambiare il programma ogni volta che decidevo di aggiungere una chiave, quindi ho aggiunto al programma una funzione per leggere l'elenco delle chiavi da un file di configurazione.

I dati che escono direttamente dal registry non sono proprio 'puliti'. Una chiave o valore standard puo' contenere ogni tipo di schifezze ed apparire alquanto inutile. Vi sono quindi due possibilita': pulire i dati prima di infilarli nel database o pulirli dopo. Io ho deciso di fare entrambi.

I dati vengono ripuliti parzialmente prima di inserirli, rimuovendo caratteri 'spuri' (\ e ') e riducendo le chiavi a minimi termini, inoltre una seconda 'pulizia' viene fatta prima di visualizzare i dati nella cosiddetta 'interfaccia utente'. Questo mi consente di tenere il codice C estremamente pulito e rapido e nello stesso tempo di tenermi tutte le informazioni che potrebbero servirmi dopo.

Come gia' detto, per memorizzare i dati uso MySQL. A parte il fatto che le librerie sono distribuite solo in formato valido per Visual C (ancora: grazie tante!) le API di MySQL sono veramente efficienti e compatte.

Fondamentalmente per memorizzare i dati sono necessari solo pochi passi:

  1. Aprire una connessione al database
  2. Preparare la query per inserire i dati
  3. Eseguire la query
  4. Chiudere la connessione

Finito...

Ho deciso di tenere il database moooolto semplice, cosi' mi sono limitato ad una singola tabella che contiene tutti i dati con la struttura seguente:

campo tipo lunghezza descrizione
computer varchar 50 e' il nome della macchina, attualmente il nome della macchina e' troncato a 15 caratteri, ma non sono sicuro se e' un problmea di W2k o meno.
keyid varchar 200 e' la 'chiave'
valid varchar 150 e' il nome o descrizione del valore
value varchar 150 e' il valore effettivo

Potete scaricare l'intero sorgente qui.

Alcune spiegazioni...

readconfig e' usata per leggere il file di configurazione (un semplice esempio di configurazione e' nel file .zip) il file e' letto ed un array di 'chiavi' (stringhe) e' creato in memoria, l'array e' poi processato ed ogni chiave e' processata a sua volta per reperire le informazioni. Il file di configurazione contiene anche i parametri per l'accesso al database.

scansubkeys e' usata per leggere l'elenco di sottochiavi da una chiave.

scanvalues legge e ritorna tutti i valori di una specifica chiave.

scanallofthem questa funzione utilizza le due precedenti per leggere l'intero blocco di chiavi da processare.

scanakey questa funzione e' recursiva e legge tutte le sottochiavi ed i valori di una chiave.

getcomputername ritorna il nome del computer, e' l'unica funzione che usa una chiave hard-coded nel codice per il suo lavoro. Questo mi consente di leggere il nome del computer prima di iniziare il lavoro vero e proprio.

getthedisks La procedura richiama DeviceIoControl() per avere la dimensione dei dischi fissi installati sul computer. Inserisce una entry che somiglia ad una chiave del registry nel database per mantenere la stessa interfaccia.

getthefuckingmemory ...quando ho scritto questa ero un po' stressato...

storedata vabbe', lo scopo di questa funzione mi pare evidente dal nome...

strtran e' usata per ripulire i valori da caratteri non voluti.

Il programma richiede un parametro sulla linea di comando: il nome del file di configurazione, se il nome non e' fornito o ci sono problemi il programma semplicemente si interrompe.

Ho tenuto il controllo errori al minimo, quindi se ricevete qualche messaggio durante il lavoro non mi sorprenderei piu' di tanto.

L'idea e' di avere sto coso in un qualche script di login, cosi' che venga eseguito direttamente dalla macchina client al login, senza richiedere niente installato sul client stesso.

L'interfaccia utente dell'intero programma e'... be', io l'ho fatta in PHP perche' la volevo cosi', ma questo non vuole dire che vuoi siate obbligati ad averla cosi'. Pertanto non diro' niente al riguardo.

Marco Nava scrive:

Esattamente come te ho trovato qualche ehm... difficolta' a far collaborare le dll fornite da MySql con gcc, o almeno dopo 5/6 tentativi dlltool non aveva ancora partorito un file .a utilizzabile allo scopo. So tuttavia per certo che e' possibile ricondurlo a ragione mettendo mano al file .def perche' l'ho fatto un po' di tempo fa, ma vatti a ricordare come avevo fatto... ho quindi pensato di aggirare completamente il problema richiamando le funzioni di libmysql.dll tramite LoadLibrary e GetProcAddress.
Il risultato, se ti interessa, lo trovi in allegato. Compilato con MinGW gira come un orologio. Per usare questo approccio ho dovuto ridefinire a parte il prototipo di tutte le funzioni di MySql richiamate: per tutte le versioni dalla 3.23 alla 5.1 (quelle di cui si trova la documentazione) il prototipo identico, il che dovrebbe garantirne il funzionamento (sempre che nelle rispettive dll le funzioni si chiamino esattamente allo stesso modo...). Io i test li ho fatti con il 5.0 e il 4.1. Ho anche aggiunto al config due voci, una per specificare la tabella su cui memorizzare il tutto e una per inserire il percorso alla dll.

Ed ecco il suo sorgente: hwscan.zip.

Walter Lain e Fabio Pinton hanno modificato leggermente il codice per usare dei semplici file di testo invece che un database, rimuovendo tutto il problema delle librerie MySQL, e Walter ha anche scritto un 'client' in PHP per consultare i dati. Ecco il codice modificato del server e del client.

Scanner source
Codice PHP

Walter dice che Il codice PHP forse fa un po' schifo, ma sto imparando ad usarlo e questo il mio primo progetto pi complesso di "getdate()" o "phpinfo()".


I commenti sono aggiunti quando e soprattutto se ho il tempo di guardarli e dopo aver eliminato le cagate, spam, tentativi di phishing et similia. Quindi non trattenete il respiro.

6 messaggi this document does not accept new posts
Rickmetodo alternativo (WMI) Di Rick - postato il 09/09/2009 22:39
Ciao Big D! Passare al setaccio il registry sicuramente funziona, per fare la stessa cosa mi sono fatto uno script VBS (chiedo venia) che interroga il sistema tramite WMI (Windows Management Interface) e nella mia incarnazione prepara un file XML, nulla vieta di caricare i dati in un DB.
I valori recuperabili sono parecchi ed il metodo può funzionare anche via rete da una server centrale.
Se può essere utile a qualcuno lo condivido volentieri.

ciao a tutti


--
Rick


Davide Bianchi@ Rick Di Davide Bianchi - postato il 10/09/2009 08:43

> Ciao Big D! Passare al setaccio il registry sicuramente funziona, per fare la stessa cosa mi sono fatto uno script VBS

Sarebbe interessante sapere quanto tempo ci mette a fare lo scanning di una macchina completa il tuo script e su quali e quante macchine lo hai provato.

--
Davide Bianchi


Anonymous coward@ Davide Bianchi Di Anonymous coward - postato il 10/09/2009 09:15

> > Ciao Big D! Passare al setaccio il registry sicuramente funziona, per fare la stessa cosa mi sono fatto uno script VBS
>
> Sarebbe interessante sapere quanto tempo ci mette a fare lo scanning di una macchina completa il tuo script e su quali e quante macchine lo hai provato.
>
>
>
Fa parte dei miei script i login, ergo è velocissimo ed è stato testato su 50 e più macchine (w2k, w2k3 ed XP)

A disposizione...
Ric

--
Anonymous coward


Davide Bianchi@ Anonymous coward Di Davide Bianchi - postato il 10/09/2009 09:42

> Fa parte dei miei script i login, ergo è velocissimo

eehhh.. si'... "velocissimo" = pochi secondi o millesimi di secondo?
Comunque, se vuoi scrivere un articolo al riguardo, segui le istruzioni.

--
Davide Bianchi


Sandman Di Sandman - postato il 25/02/2011 14:42

Gran bella pensata, sul serio!

>L'idea e' di avere sto coso in un qualche script di login, cosi' che venga eseguito >direttamente dalla macchina client al login, senza richiedere niente installato sul client >stesso.

e usare smbclient per iniettare il software e winexe per eseguirlo dalla tua console

linux ?

--
Sandman


Shikky Di Shikky - postato il 09/07/2012 11:43

Ciao D.

 

OCS inventory invece ti sembra un'emerita stronzata oppure, semplicemente, non lo conoscevi?

--
Shikky


6 messaggi this document does not accept new posts

Precedente Successivo

Davide Bianchi, lavora come Unix/Linux System Administrator presso una societa' di "sicurezza informatica" (aka: $networkgestapo) di Haarlem. Contatti: mail: davide AT onlyforfun.net , Jabber: davideyeahsure AT gmail.com,

Volete contribuire? Leggete come!.
 
 

Il presente sito e' frutto del sudore della mia fronte (e delle mie dita), se siete interessati a ripubblicare uno degli articoli, documenti o qualunque altra cosa presente in questo sito per cortesia datemene comunicazione (o all'autore dell'articolo se non sono io), cosi' il giorno che faccio delle aggiunte potro' avvisarvi e magari mandarvi il testo aggiornato.


Questo sito era composto con VIM, ora e' composto con VIM ed il famosissimo CMS FdT.

Questo sito non e' ottimizzato per la visione con nessun browser particolare, ne' richiede l'uso di font particolari o risoluzioni speciali. Siete liberi di vederlo come vi pare e piace, o come disse qualcuno: "Finalmente uno dei POCHI siti che ancora funzionano con IE5 dentro Windows 3.1".

Web Interoperability Pleadge Support This Project
Powered By Gort