29 giu 2009

Eliminare File Temporanei

Spesso applicazioni ed installer lasciano in giro per l'hard disk un sacco di spazzatura, dimenticandosi allegramente di cancellarla. Anche se è vero che i dischi sono sempre più capienti, e che un po' di file in eccesso non fanno poi così male come molti credono, ogni tanto vale la pena mettere un po' di ordine e di fare un poco di pulizia.

Posizioni dei file temporanei
Dove vengono creati generalmente i file temporanei? In genere vengono salvati nelle seguenti posizioni:
  • %WINDIR%\Temp (tipicamente C:\WINDOWS\Temp)
  • %TEMP% (tipicamente C:\Users\nomeutente\AppData\Local\TEMP, in Windows Vista)

(i file temporanei di Internet Explorer o di altri browser preferisco non toccarli: in questo articolo voglio solo eliminare soltanto i file che si trovano nelle cartelle temporanee utilizzate dagli altri programmi).


Per spazzare via un po' di file inutili dovrebbero quindi essere sufficienti i seguenti comandi:
DEL /F /S /Q "%WINDIR%\Temp"
DEL /F /S /Q "%TEMP%"

Giusto? Al di là del fatto che questi comandi sono particolarmente delicati (attenzione a non sbagliare il percorso!) è importante notare che questi comandi non sono sufficienti in un ambiente multiuser!

Si noti infatti che %TEMP% contiene soltanto il percorso dei file temporanei che appartengono all'utente corrente, ma ogni utente di sistema dispone della sua personale cartella temporanea!

Per svolgere bene il nostro compito, dobbiamo quindi scorrere tutte le variabili di ambiente di tutti gli utenti presenti nel sistema!


Come conoscere tutti gli utenti?
L'elenco degli identificativi degli utenti (detto SID) che dispongono di un profilo nel sistema lo si ottiene interrogando la chiave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList:

REG QUERY "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList


ed all'interno di ogni SID possiamo ottenere il percorso su disco del profilo interrogando la chiave ProfileImagePath.

Dove sono memorizzate le variabili d'ambiente?
Le variabili per l'utente corrente si trovano in HKEY_CURRENT_USER\Environment, mentre le vabili di tutti gli utenti attualmente attivi sul sistema le possiamo recuperare in HKEY_USERS\SID\Environment.

Se vogliamo fare le cose fatte bene dobbiamo scorrere le chiavi anche per tutti gli utenti che non sono attualmente attivi: in questo caso Windows non carica il profilo in memoria nella HKEY_USERS ma tutte le chiavi si trovano su disco nel file NTUSER.DAT che si trova all'interno di ogni ProfileImagePath.

Lo script
Nello script seguente ho mescolato un po' di tecniche diverse: WMI per scorrere il registro, WScript.Shell per leggere il registro in modalità non espansa (le variabili d'ambiente che contentono il percorso %USERPROFILE% escono tutte espanse con il profilo dell'utente che lancia lo script, e non va bene! Ovviamente non mi piace questo metodo, e spero di trovare una soluzione migliore), ed infine per caricare il file NTUSER.DAT in una chiave temporanea, non ho trovato nulla di meglio di lanciare dalla shell un buon REG LOAD...arh, brutto ma funzionale!
Fortuna che dopo qualche errore di codifica mi rifaccio, e per memorizzare l'elenco delle cartelle ho utilizzato un ArrayList, così come per le stringhe le espressioni regolari vanno sempre più che bene!

On Error Resume Next

Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS         = &H80000003

strComputer = "."

Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
Set ws = CreateObject("Wscript.Shell")
Set temporaryFolders = CreateObject("System.Collections.ArrayList")
Set re = new RegExp

Function GetTemp(ProfilePath, K, Key)
On Error Resume Next
Temp = ws.RegRead(K & "\" & Key & "\Environment\TEMP")

If err.number = 0 Then
re.Pattern = "%USERPROFILE%"
Temp = re.Replace(Temp, ProfilePath)
Else
Temp = Null
End If

GetTemp = Temp
On Error Goto 0
End Function

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
objRegistry.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubkeys

For Each objSubkey In arrSubkeys
rem *** legge il percorso del profilo ***
strValueName = "ProfileImagePath"
strSubPath = strKeyPath & "\" & objSubkey
objRegistry.GetExpandedStringValue HKEY_LOCAL_MACHINE, strSubPath, strValueName, strProfile

rem *** legge il percorso della cartella TEMP ***
FolderTmp = GetTemp(strProfile, "HKEY_USERS", objSubkey)

if isNull(FolderTmp) Then
rem *** non ha letto la chiave, quindi prova a caricare il registro da NTUSER.DAT ***
ws.Run """%WINDIR%\System32\REG.EXE"" LOAD HKLM\TempHive """ & strProfile & "\NTUSER.DAT""", 7, true
msgbox "Leggo " & strProfile
FolderTmp = GetTemp(strProfile, "HKEY_LOCAL_MACHINE", "TempHive")
msgbox "Letto " & FolderTmp
ws.Run """%WINDIR%\System32\REG.EXE"" UNLOAD HKLM\TempHive", 7, true
End If
temporaryFolders.Add FolderTmp
Next

For Each folder In temporaryFolders
Wscript.Echo "Percorso temporaneo da svuotare: " & folder
Next


Come al solito il codice è brutto sporco e cattivo, inoltre in caso di errore.... be meglio verificare per bene prima di eliminare, non si sa mai! Ovviamente posso estendere questo codice, ed aggiungere i percorsi temporanei di Internet Explorer, Mozilla Firefox, oppure qualsiasi altro, basta solo conoscere la posizione di registro che indica il percorso dove sono salvati, oppure basta solo conoscere l'eventuale percorso del file di configurazione presente nel profilo.

Ah forse lo stesso risultato lo si poteva ottenere solamente con un file batch, qualche FOR e molte chiamate all'utility REG.EXE: sarebbe stato più coerente, ma sicuramente molto più illeggibile!

Attenzione
Nel caso in cui vengano utilizzati dei profili roaming, è sempre un rischio andare a toccare i profili salvati in locale, poiché si rischia di far perdere al sistema le informazioni di quale sia l'ultimo profilo utilizzato.

10 giu 2009

Paradossi della Statistica

Per confrontare la puntialità delle compagnie aeree, spesso vengono pubblicate delle statistiche che aiutano i viaggiatori a scegliere la compagnia migliore.
La percentuale di puntualità di una compagnia aerea è definita come numero di voli con ritardi inferiori ai 15 minuti / numero voli totali: sembra ragionevole!

Vediamo un esempio di due compagnie aeree (tratto da un giornale fine anni '80):
Nei totali, America West viene premiata (90% di aerei puntuali contro 87%), ma se ci soffermiamo sui dettagli, Alaska Airlines svogle un lavoro migliore presso ogni singolo aeroporto!

Perché questo paradosso? Alaska Airlines vola in proporzione molto di più verso aeroporti le cui condizioni atmosferiche sono spesso peggiori (come Seattle) mentre America West viaggia principalmente a Phoenix, dove il traffico è minore ed il tempo è molto più bello!

Tratto da "Introduction to Probability" lezione 10, dal sito http://ocw.mit.edu. E così ho provato anche ad includere un foglio di calcolo di google docs all'interno di un post (uhm non era difficile, comunque).

9 giu 2009

A Tutorial on Support Vector Machines for Pattern Recognition

Quando ero un povero studente in informatica, ho trovato il documento "A Tutorial on Support Vector Machines for Pattern Recognition" di Chris Burges molto chiaro e molto utile. Posto qui il link così, nell'improbabile ipotesi di voler approfondire qualche argomento, riesco subito a trovare la pagina! ;-)

Ottimizzazione per motori di ricerca

Ho dato una letta veloce alla Guida introduttiva di Google all'ottimizzazione per motori di ricerca (SEO). È sempre un piacere leggere della documentazione scritta in maniera semplice ma comunque precisa: gli argomenti trattati sono utili per i webmaster di ogni livello, molte informazioni sono semplici ma non per forza scontate. Inoltre, seguendo i link all'interno della guida, è possibile approfondire ogni tema con ulteriori dettagli.

Molto interessante anche il seguente post:
(però mi pareva di aver letto un documento molto più approfondito, solo che ora non riesco a trovarlo: forse si trova nel blog in inglese?)

26 mag 2009

Psexec: comandi multipli

Per effettuare un'installazione remota di un applicativo tramite psexec ho bisogno di connettere un'unità di rete, e quindi di lanciare un eseguibile. Come lanciare comandi multipli con un unico comando psexc? Ecco la sintassi:
psexec \\nomepc -u utente -p password cmd /c (net use r: /delete ^& net use r: \\remoto\installdir /utente:username /password:password ^& r:\install.bat ^& net use r: /delete)
Lanciando i comandi singoli non va, così invece funziona perfettamente!

22 apr 2009

Google App Engine


Lotus Notes Sucks!



Odio Lotus Notes: ogni tanto è necessario ribadirlo. Sembra un client di posta scritto in Access. E scritto decisamente male (visto che Access mi piace)!
Non c'è nulla al suo posto, nulla come ci si aspetta, i pulsanti e le voci dei menù sembrano sparati sullo schermo con il mitra, le operazioni basilari o non funzionano, oppure sono ultra complicate, utilizzarlo quotidianamente è un inferno. Insomma cara IBM, la gente con la posta ci lavora, non ci deve mica giocare!

Sono perfettamente al corrente che Lotus non è solo un client di posta ma un ambiente di esecuzione di applicativi distribuiti. L'idea era bella ed innovativa. L'implementazione, un disastro. Argh!

Gmail!



Le alternative ci sono - e sono numerose - ma se parliamo solamente di posta, secondo la mia semplice ma autorevole opinione mi sembra quasi che Google, con la sua Gmail, sia l'unica azienda ad aver capito per davvero a che cosa serve l'E-Mail!
Una webmail più comoda di un vero client? Sembra impossibile, ma pare proprio che quei furbacchioni ci siano riusciti: la grafica è spartana ma leggera e funzionale, e la comodità di utilizzo supera oltre ogni aspettativa.
Bello raggruppare i messaggi in conversazioni (inbox e outbox, bye bye!) e perchè organizzare i messaggi in strutture gerarchiche? Basta con cartelle e sottocartelle: il Web 2.0, così come il mondo, funziona ad etichette.


Privacy?
Una volta si diceva che le memorie di massa erano lo specchio dell'anima, e che per conoscere davvero una persona si doveva guardare il suo hard disk. Oggi ci siamo aggiornati e per conoscere a fondo una persona basterebbe sbirciare il profilo tracciato - e custodito con cura - da Google. Facciamo pure finta di ignorare ogni aspetto legato alla privacy, ma non dimentichiamoci che sarà necessario fare una bella riflessione anche su ciò: di questo ne parleremo in un prossimo disco.

Google Apps for Business
Un po' per provocazione, visto che non ne posso più di Lotus, ed un po'... perché mi sembra un'idea interessante, ho proposto di buttare via tutto e passare a Google Apps for Business. Se l'ha fatto la Regione Veneto, possiamo farlo anche noi: basta server mail in casa, basta hardware, software, firewall, sistemi di accesso remoto, licenze, rbl, antivirus che non si aggiorna, antispam che combina casino, dischi che si riempiono, basta consulenti esterni per ogni minimo problema! Basta anche con VMWare, anche se in fondo alla fine cominciava a piacermi!

Google fornisce numerosi servizi a pagamento per le aziende: si parte da dei semplici filtri da applicare ad una infrastruttura già esistente, fino alla completa casella di posta mantenuta remotamente presso i datacenter di Google.

I prezzi? Molto competitivi. Una protezione di base da applicare al proprio sistema esistente costa 3 $ annui a casella, e si arriva fino ai 40 $ annui per una casella completa, gestita ed amministrata dai migliori sistemisti della terra, e di ben 25GB tutti schiaffati nei sistemi segreti sparsi in giro per il pianeta.

Inoltre con Google Apps for Business vengono messe a disposizione delle API per gestire gli utenti via software: agganciarsi ad un sistema di Identity Management esistente non poteva essere più semplice!

Ovviamente la mia proposta non ha avuto successo (uhm non ancora): il Computer sulla Nuvola non è ben visto, viene inteso principalmente come una perdita di controllo sui propri sistemi informativi. Ed il fatto di non sapere con precisione a chi sono in mano i propri segreti non fa certo piacere.

Forse oggi è ancora troppo presto, si deve valutare meglio quali saranno gli impatti sulla privacy, ma la direzione che seguiremo tutti in un prossimo futuro sembra essere delineata!

Google App Engine
Causa brutto tempo - e, probabilmente, causa mix letale di Anima Nera e prosecco la sera prima - la scorsa domenica non me la sono sentito di spritzettare fino a tarda notte, come succede invece abitualmente. Ho pensato quindi di sfruttare questo insolito ritaglio di tempo per dare finalmente uno sguardo al Google App Engine SDK che avevo installato, e mai provato, tempo addietro.

Sul fronte programmazione, non ci trovo molto di nuovo: tutto quello che avevo imparato sullo sviluppo Web anni fa si applica ancora, e ciò mi rallegra molto. Il Web server deve essere un Apache personalizzato, configurato con grande cura, e configurabile con semplicità tramite file di configurazione caricabili dallo sviluppatore. Il linguaggio di programmazione predefinito è Python, anche se di recente è possibile sviluppare anche in Java. I framework supportati sono numerosi, tra cui mi è saltato all'occhio Pylons che avevo già indicato come possibile oggetto di studio qualche post fa.

Il database messo a disposizione non è relazionale, ma ad oggetti, ma si interroga comunque oltre che con i propri metodi nativi, anche con la normale sintassi SQL (mi ricorda tanto InterSystems Ensemble che funziona allo stesso modo. Beh magari tutti i database ad oggetti funzionano allo stesso modo, chissà!).

Spero di scrivere presto qualche applicativo funzionante!

Conclusione!
Cosa mi ha colpito di Google App Engine?

Le applicazioni scritte per l'engine di Google dispongono di una autenticazione integrata, e chi dispone di un account Gmail per aziende può limitare l'accesso agli applicativi agli utenti della propria azienda.

La conclusione è che quando saremo pronti per spostare le nostre caselle di posta sulla nuvola, saremo pronti per spostare anche tutti i nostri applicativi sulla nuvola.

Non è davvero una rivoluzione da poco!

Conclusione 2.
Lotus Notes è ancora al suo posto. And it still sucks!

19 apr 2009

Conficker

Mentre molte aziende sono state colpite in maniera massiccia dall'infezione del worm Conficker, nella mia realtà il problema è passato quasi del tutto inosservato: d'altra parte i requisiti di sicurezza per evitare il propagarsi di un'infezione di questo tipo sono decisamente di base, e dovrebbe far riflettere il fatto che molte aziende che trattano dati personali o sensibili non siano state adeguatamente preparate ad una tale evenienza.

In ogni caso, è bene non abbassare la guardia, visto che il Conficker è un worm che non perdona alcuna leggerezza!
Per tutte le informazioni relative al worm vedere questo articolo: "Considerazioni per un efficace contenimento dell'infezione Conficker.B".

Uno dei problemi principali consiste nell'individuare quali siano le macchine infette. Fortunatamente sono disponibili numerosi tool di scansione della rete in grado di rilevare eventuali sistemi infetti (vedere Conficker Remote Scanners), tra i quali è presente anche nmap.
La sintassi per controllare una macchina od una rete remota è la seguente:
nmap -PN -T4 -p139,445 -n -v --script smb-check-vulns,smb-os-discovery --script-args safe=1 [targetnetworks]
Bisogna comunque tenere in considerazione il fatto che molti pc potrebbero essere spenti od essere collegati alla rete solo saltuariamente, e purtroppo avere un inventario esatti di tutti i pc che "mancano all'appello" non è sempre facile. Ho pensato quindi di far girare saltuariamente il seguente script su di un domain controller:
@echo off
for /f "tokens=4 delims=: " %%a in ('netstat -na^|find "ESTABLISHED"') do (
nmap -PN -T4 -p139,445 etc. %%a >> scan_%%a
)
Questo script estrae tutti gli indirizzi IP che hanno una connessione correntemente aperta con il domain controller, ed effettua una scansione remota sugli indirizzi rilevati.

Certo il rischio è quello di effettuare numerose scansioni allo stesso indirizzo IP, ed il rischio è che alcune connessioni possano venire allegramente ignorate (meglio un windump piuttosto di un netstat, se non vogliamo farci sfuggire nulla). Naturalmente se sarà necessario, sono pronto a modificare lo script per renderlo più funzionale!

Ah un po' di informazioni sul comando for si trovano a questa pagina http://www.ss64.com/nt/for.html.