Script per il log delle sessioni utente

Talvolta, soprattutto in infrastrutture informatiche di una certa dimensione, può essere utile avere la possibilità di reperire l’informazione di quali utenti si sono connessi ad uno specifico computer. Questo può tornare comodo sia per una gestione più puntuale dell’inventario del parco macchine sia nel caso si abbia la necessità di verificare la storia degli accessi su uno specifico computer.

Nel post Gestire le sessioni utente da riga di comando avevo descritto come ricavare e gestire le sessioni utente su un computer e al momento il metodo più comodo per ottenere le sessioni utente su un computer con sistema operativo Windows è utilizzare il comando QUERY USER.

Dal momento che l’output del comando QUERY USER è testuale ho preferito fare uno script DOS anziché uno script PowerShell in quando di fatto si va ad utilizzare un tool a riga di comando e le funzionalità messe a disposizione dal DOS sono sufficienti per creare uno log delle sessioni utente.

Lo script disponibile nel mio repository su GitHub al seguente link BatchScripts/LogUserSession.cmd genera per ogni sessione utente presente sul computer un file denominato NomeComputer.NomeUtente che contiene le seguenti informazioni:

  • Data e ora di esecuzione dello script
  • Tipologia della sessione (console o rdp)
  • Data del logon alla sessione
  • Indirizzi IP del computer

Di seguito un esempio del contenuto del log generato output:

2023-04-25 23:12 Session: rdp-tcp#37 – Logon: 17/04/2023 10:39 – IP: 192.168.0.100 10.0.0.208
2023-04-24 23:07 Session: console – Logon: 16/04/2023 23:06 – IP: 10.0.0.100

La scelta di denominare il file NomeComputer.NomeUtente permette un semplice ordinamento dei log generati su vari computer per nome computer o per nome utente, inoltre per semplicità di consultazione i vari log registrati nel file sono ornati per data di esecuzione decrescente.

Inoltre i log vengono generati sul computer in una subdirectory Log nella cartella in cui è memorizzato lo script.

Analisi dello script

Per ricavare le informazioni necessarie si utilizzerà come detto precedentemente il comando QUERY USER e IPCONFIG per ottenere gli indirizzi ip:

SETLOCAL ENABLEDELAYEDEXPANSION

REM Ricerca sessioni utente
FOR /F “SKIP=1 TOKENS=1,2,6,7 DELIMS=> ” %%a IN (‘QUERY USER’) DO (
  SET User=%%a
  SET Session=%%b
  SET LogonDay=%%c
  SET LogonHour=%%d

  REM Creazione testo Log – Data esecuzione
  SET LogText=%YEAR%-%MONTH%-%DAY% %HOUR%:%MINUTE%

  REM Creazione testo Log – Sessione
  SET LogText=!LOGTEXT! Session: !Session!

  REM Creazione testo Log – Data logon
  SET LogText=!LOGTEXT! – Logon: !LogonDay! !LogonHour!

  REM Creazione testo Log – Indirizzi IP
  SET LogText=!LOGTEXT! – IP:
  FOR /F “TOKENS=2 DELIMS=:” %%a IN (‘IPCONFIG ^| FINDSTR IPv4’) DO (SET LogText=!LOGTEXT!%%a)

)

Come indicato precedentemente i log nel file sono ordinati per data di esecuzione decrescente.

REM Creazione file Computer.Utente ordinato per data di log decrescente
SET ComputerUserLogFile=%LogsSubFolder%\%COMPUTERNAME%.!User!
ECHO !LogText!>>!ComputerUserLogFile!.tmp
TYPE !ComputerUserLogFile!>>!ComputerUserLogFile!.tmp
MOVE /Y !ComputerUserLogFile!.tmp !ComputerUserLogFile!

Per evitare la crescita indefinita del log è possibile impostare una variabile per definire il numero di byte massimo del log.

REM Impostazione dimensione massima file di log in bytes (0=Nessuna limitazione)
SET LOGMAXSIZE=76800

Il log verrà troncato tramite il comando fsutil:

REM Impostazione max size del file di log
IF %LOGMAXSIZE% NEQ 0 FSUTIL file seteof !ComputerUserLogFile! %LOGMAXSIZE%

Distribuzione dello script

Per distribuire lo script sui client è possibile utilizzare una Group Policy computer  che fa uso di alcune Group Policy Preference computer, una Group Policy Preference per creare sui client una cartella preferibilmente nascosta in cui copiare il file dello script sui client tramite una seconda Group Policy Preference, anche in questo caso è preferibile che lo script sui client abbia l’attributo nascosto. Per queste due Group Policy Preference conviene impostare l’Azione su Aggiorna, in quanto se l’Azione è impostata su Sostituisci ogni qualvolta che le gpo vengono aggiornate sul client l cartella e lo scrip verrebbero eliminati e ricopiati con l’effetto d eliminare i logs memorizzati (in quanto i logs sono creati in una sottocartella Logs della cartella in cui è memorizzato lo script) e lo script potrebbe non essere eseguito (si veda in seguito come viene gestita l’esecuzione automatica dello script). A riguardo si vedano le indicazioni riportate in Working with Windows Settings Preference Items Using the GPMC | Microsoft Learn:

Actions – Folder:

  • Replace
    Delete and recreate a folder for computers or users. The net result of the Replace action is to delete the contents of an existing folder and to overwrite all existing settings associated with the folder. If the folder does not exist, then the Replace action creates a new folder.
  • Update
    Modify an existing folder for computers or users. This action differs from Replace in that it only updates settings defined within the preference item. All other settings remain as configured on the folder. If the folder does not exist, then the Update action creates a new folder.

 

Actions -File:

  • Replace
    Delete a file (or multiple files in one folder), replace it with another file or files, and configure the attributes of those files for computers or users. The net result of the Replace action is to overwrite the files at the destination location. If the file does not exist at the destination, then the Replace action copies the file from the source location to the destination.
  • Update
    Modify settings of an existing file (or multiple files in one folder) for computers or users. This action differs from Replace in that it only updates file attributes defined within the preference item. All other file attributes remain as configured on the file. If the file does not exist, then the Update action copies the file from the source location to the destination.

Per l’esecuzione dello script è possibile utilizzare una terza Group Policy Preferences per creare un’operazione pianificata che eseguirà tramite l’utente NT AUTHORITY\SYSTEM (a riguardo si veda LocalSystem Account – Win32 apps | Microsoft Learn) e sarà attivata all’accesso e ripetuta ogni ora, allo sblocco della workstation e al blocco della workstation. In questo modo si avrà un log aggiornato che fornisce indicazioni su chi sta utilizzando il computer. Anche per questa Group Policy Preference si può impostare l’Azione su Aggiorna, a riguardo si vedano le indicazioni riportate in Working with Control Panel Settings Preference Items Using the GPMC | Microsoft Learn:

Action – Scheduled Task item

  • Replace
    Delete and re-create scheduled tasks for users or computers. The net result of the Replace action is to overwrite all existing settings associated with the task. If the task does not exist, then the Replace action creates a new scheduled task.
  • Update
    Modify the settings of an existing scheduled task for users or computers. This action differs from Replace because it only updates settings that are defined within the preference item. All other settings remain as configured in the task. If the task does not exist, then the Update action creates a new scheduled task.

Con una quarta Group Policy Preferences è possibile copiare tutti i file presenti nella subdirectory Logs su una share per far si che il personale IT che necessita delle informazioni generate dallo script le possa consultare su una posizione centralizzata. Come riportato in Working with Windows Settings Preference Items Using the GPMC | Microsoft Learn le Group Policy Preferences di tipo File ammettono l’uso dei wild chars per i source file:

Source file(s)

Type the location from which to copy the Source file(s). This location can be a fully qualified UNC path or a path on a local or mapped drive from the perspective of the client. This field can contain variables.

This field can also contain single character (?) and multiple character (*) wildcards, allowing you to copy or modify multiple files.

This option is available only if the action selected is Create, Replace, or Update.

Per le considerazioni fatte precedentemente per questa Group Policy Preferences occorre impostare l’Azione su Sostituisci in modo che i file nella share siano sempre aggiornati sovrascrivendo quelli eventualmente presenti che potrebbero non essere aggiornati. Utilizzando una Group Policy Preferences per copiare i logs su una share l’aggionamento dei filesulla share dei logs generati su ciascun computer verrà eseguito contemporaneamente all’aggiornamento delle group policy su computer che per default avviene ogni 90 minuti più un offset randomico di 30 minuti e ciò garantisce un accesso alla share “bilanciato”, a riguardo si veda Background Refresh of Group Policy | Microsoft Learn:

By default, a refresh occurs every 90 minutes. The system may add a random time of up to 30 minutes to the refresh interval. You can change these default values by using a Group Policy setting in the Administrative Templates extension to Group Policy. Setting the value to zero minutes causes the refresh rate to be set to seven seconds.

Not all Group Policy extensions are processed during a background refresh. Folder redirection processing occurs only when a user logs on, and the processing of software installation policy occurs only when a computer starts and when a user logs on.

Un ultima considerazione va fatta sulla share su cui verranno copiati i logs generati dai vari computer, occorrerà impostare la security della cartella e la condivisione affinché gli account computer possano modificare i file, ma non gli utenti, a tal scopo è possibile utilizzare il gruppo Domain Computers:

This group can include all computers and servers that have joined the domain, excluding domain controllers. By default, any computer account that’s created automatically becomes a member of this group.

Ovviamente poi alla occorrerà impostare la security della cartella e la condivisione affinché il gruppo, a cui apparterranno i membri del personale IT che necessitano di consultare i dati, sia concesso l’accesso in lettura.