Il pericolo è il mio mestiere
Il numero di Giugno della rivista Technet disponibile online dedica ampio spazio all’Application Compatibility Toolkit giunto da pochi giorni alla versione 5.5. La seguente figura è tratta dal primo articolo introduttivo in cui Chris Jackson parla di quali acrobazie un Data Collection Package (DCP) debba fare per poter essere eseguito sui PC da inventariare:
La parte tratteggiata in verde rappresenta il DCP così come era concepito nelle versioni precedenti alla 5.02 e tutto l’ambaradan a sinistra è stato introdotto per dare la possibilità agli amministratori di dominio di usare un pacchetto MSI anziché un EXE per distribuire il DCP sulle macchine target (gli MSI sono più semplici da distribuire per un sacco di ragioni che non ci stanno a margine di questo post).
I vincoli alla soluzione del problema erano tanti:
- chi ha scritto il codice tratteggiato non lavorava più al nostro progetto
- l’ambaradan deve girare anche su Windows 2000 (con qualche limitazione)
- testare l’ambaradan è complicatissimo
- i tempi di consegna come al solito rivolti con uno sguardo al passato
- gli MSI non sono disegnati per “eseguire codice” ma per installare
- si può eseguire un solo MSI per volta, almeno su alcune versioni di Windows
- cercare di lasciare quanto meno tracce possibili: non perché si tenta di nascondere chissà che ma in quanto per osservare correttamente lo stato del sistema bisogna modificarlo il meno possibile
Il primo tentativo è stato quello di riscrivere la logica all’interno di AFSetup in una custom action ma dopo 2 mesi di prove e riprove, con risultati di test davvero poco confortanti, abbiamo capito che era un’operazione impossibile. L’ideale sarebbe stato fare in modo di creare un MSI che lanciasse AFSetup.exe senza lasciar traccia, ma gli MSI non sono fatti per operazioni stealth. La prima cosa che fanno è aggiungere una voce alla lista di “Add/Remove Programs”.
La soluzione è balenata poco dopo: un MSI il cui unico scopo è di installare una finta voce di registro (!) e che per farlo lancia una custom action allo scopo di disinstallare l’MSI e proseguire…. tentativo naufragato perché la custom action viene “uccisa” non appena parte la disinstallazione.
Siamo giunti quindi alla soluzione definitiva: la custom action estrae un eseguibile (il secondo msi5.tmp in figura, prontamente battezzato “The Entity”) che si mette in attesa dell’avvenuta “disinstallazione”. Dopo di che la custom action invoca la disinstallazione e il primo MSI muore senza lasciare nessuna traccia. Questo segnala a “The Entity” di entrare in azione estraendo un altro eseguibile (il mitico afsetup.exe) e suicidandosi; a questo punto afsetup.exe è in esecuzione come se fosse stato lanciato direttamente (tranne per “The Entity” che verrà cancellato il prima possibile) riconducendoci allo stesso scenario ampiamente testato nella versione 5.01 (di cui sapevamo benissimo pro e contro).
L’idea di “The Entity” ce l’ho messa io, il mio collega ha velocemente buttato giù un prototipo ed ha funzionato quasi al primo colpo. In tutto questo ambaradan c’è da passare dei parametri ad AFSetup.exe in maniera “sicura”. Non tanto per paranoia ma per evitare ulteriori domande durante i meeting dell’SDL prima del rilascio. Il mio collega ha pensato dapprima a salvare i valori nel registry in modo tale che “The Entity” li recuperasse e li passasse ad AFSetup; poi abbiamo pensato al file system. C’è voluta una doccia, da sempre fonte ispiratrice di idee brillanti, per trovare la soluzione di Colombo: le variabili di ambiente! Si propagano “gratuitamente” di processo padre in processo figlio e sono più scarsamente accessibili all’esterno della genealogia dei processi.
Tutto questo me lo sarei dimenticato o tenuto in serbo per qualche racconto avventuroso ai nipoti se non fosse stato per Chris Jackson che si è preso la briga di ficcanasare nei dettagli implementativi e facendo per un breve attimo rivivere in me l’emozione di mettere al mondo “The Entity”. Chris è uno dei tuttologi dell’AppCompat e il suo ultimo blog post parla di un’altra storia basata stavolta su ACT 5.5; materiale per un altro post forse un po’ più divertente di questo.
-quack