# AppUserList – Application User List

- Link: https://www.silviobalduzzi.com/2023/05/appuserlist/
- Published: 2023-05-24T09:47:21+02:00
- Author: balduz84

Torno dopo diversi mesi con un nuovo post del mio blog, presentandovi un tool che
ho sviluppato, in Powershell, nelle scorse settimane.

Presso un cliente Enterprise, abbiamo avuto la necessità di effettuare una analisi
approfondita di quali applicazioni vengono avviate dagli utenti durante le loro 
sessioni di lavoro all’interno di Desktop pubblicati tramite Citrix.

Se ci avessero richiesto quali applicazioni seamless venissero avviate dagli utenti,
sarebbe stato facile estrarre le informazioni dal Director; in questo caso al cliente
serviva il dettaglio di quali applicazioni, presenti nelle VDI e negli Hosted Shared
Desktop, venissero realmente utilizzare dagli utenti (per poter valutare ottimizzazioni
dei vari Catalog). Queste informazioni sono sì visibili durante l’analisi di una
singola sessione in Director (processi in uso) ma ci serviva tenerne uno storico
e poter effettuare analisi su dati di medio/lungo periodo.

Ho approcciato per cui la richiesta ricercando in rete quale potesse essere il metodo
migliore, in Windows, per intercettare gli eseguibili avviati dagli utenti; la soluzione
che si è dimostrata ideale è stata leggere la porzione di registro utente dove il
sistema operativo salva gli eseguibili avviati dall’utente stesso (e ne tiene traccia,
potenzialmente, per sempre).

La posizione del registro è la seguente:

    ```wp-block-code
    HKEY_USERS\$SID\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
    ```

Dove al posto di $SID va sostituito il codice SID relativo all’utente in Active 
Directory.

In alternativa, per leggere la stessa porzione di registro (se non in sessione remota)
è possibile utilizzare la posizione:

    ```wp-block-code
    HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
    ```

Grazie a questa chiave di registro, mi è stato possibile elaborare uno script powershell
che, a fronte dell’estrazione degli utenti connessi in quel momento sul Desktop 
Citrix, leggesse la chiave di cui sopra (per ogni utente) e ne riportasse il contenuto
in un database SQL Server. A seguito della lettura della chiave, ho provveduto alla
pulizia della stessa, così che alla successiva rilettura mi riportasse solo gli 
ultimi eseguibili avviati.

Ho per cui elaborato un tool composto da tre componenti:

 * AULService: Agent in esecuzione nelle macchine Worker Citrix, che intercetta 
   le applicazioni avviate dagli utenti e scrive le informazioni nel database;
 * AULMonitor: Database SQL Server centrale, in cui scrivo e da cui leggo per la
   generazione dei report;
 * AULReport: Client per la generazione dei report, che attinge le informazioni 
   dal database, le elabora e ne permette l’estrazione in Excel;

Il tool è stato sviluppato nell’ottica di restare semplice, leggero e funzionale(
per cui senza troppi “fronzoli”).

Di seguito vi riporto un esempio di schermate del client di reporting (AULReport):

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image.png?
resize=357%2C371&ssl=1)

In questa prima schermata dell’applicazione è possibile visionare l’elenco delle
applicazioni avviate nel periodo intercorso tra la data in “From” e la data in “
To”, con relativo conteggio delle esecuzioni avvenute. Si noti che il conteggio 
tiene conto di un avvio per ogni utente, per applicazione, per giorno; se un utente
avvia 100 volte Excel in un giorno (sulla stessa VM) verrà conteggiato un solo avvio(
non ci interessa sapere quante volte viene avviata l’applicazione, ma bensì quali
ed in che periodo temporale).

Cliccando su una applicazione in elenco, si aprirà una seconda schermata con dettagli
in più, relativamente alle esecuzioni di questa applicazione nel periodo selezionato:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-1.
png?resize=553%2C464&ssl=1)

Avremo un grafico che mostrerà l’andamento dell’utilizzo dell’applicazione stessa;
l’elenco dei path che sono stati indicati come referenti alla stessa applicazione
ed il dettaglio di quante volte questa applicazione è stata avviata all’interno 
dei vari Worker (con relativo Machine Catalog e Delivery Group).

Sempre nella prima schermata dell’applicazione, cliccando con il tasto destro del
mouse su una app, verrà mostrato l’elenco degli utenti che l’hanno avviata nel periodo:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-2.
png?resize=471%2C180&ssl=1)

Cliccando sull’utente selezionato, verrà aperto il dettaglio seguente:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-3.
png?resize=546%2C403&ssl=1)

Per poter rendere “parlante” il path di un eseguibile, è stata predisposta una schermata
specifica, dove è possibile associare un nome ad ogni eseguibile:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-4.
png?resize=543%2C435&ssl=1)

Effettuando questa azione, ad ogni nome potranno appunto corrispondere più eseguibili;
soluzione che permette di aggregare i report per applicazione, consolidando diversi
path in un unico report. Per esempio per quanto riguarda l’applicazione “Office 
2016 – Excel”, nel nostro caso abbiamo potuto aggregare eseguibili della versione
a 32bit e 64bit con l’unico nome “Office 2016 – Excel”. Se avessimo voluto suddividere
la release a 32bit da quella a 64bit, avremmo potuto assegnare due nomi differenti
ad eseguibili di versioni diverse.

Una tabella specifica riporta le referenze di Machine Catalog e Delivery Group, 
per ogni macchina analizzata:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-5.
png?resize=525%2C421&ssl=1)

L’ultima schermata che ho implementato, è basata su una vista TreeView:

![](https://i0.wp.com/www.silviobalduzzi.com/wp-content/uploads/2023/05/image-6.
png?resize=612%2C336&ssl=1)

A sinistra viene mostrato l’elenco degli utenti con il dettaglio delle applicazioni
eseguite nel periodo; cliccando su ogni applicazione verrà mostrato a destra l’elenco
delle esecuzioni e relative informazioni di dettaglio (path dell’eseguibile, Worker
Citrix e data di esecuzione).

Nei prossimi giorni aggiungerò qualche dettaglio in più sulla soluzione implementata
e, non appena sarà tutto pronto, lo renderò disponibile gratuitamente alla comunità!

Stay tuned!
