Script PowerShell per l’invio di un report con l’elenco dei computer inattivi

L’Active Directory è per sua natura un database dinamico dal momento che deve memorizzare tutti gli oggetti dell’infrastruttura, in particolare quelli che necessitano di autorizzazione per operare sui vari asset della rete informatica aziendale come ad esempio utenti e computer.

Il ciclo vitale di una rete informatica impone che i computer vengano sostituiti quando necessario e talvolta questo può comportare che nell’Active Directory rimangano memorizzati account computer relativi a computer non più attivi. 

Gli account computer relativi a computer inattivi sono anche denominati stale accounts come indicato in  Regularly check for and remove inactive user accounts in the Active Directory  Gli account obsoleti possono rappresentare un problema di sicurezza inoltre utilizzano anche spazio nel database di Active Direcory che potrebbe essere recuperato.

Per eseguire una manutenzione di tali account computer ho creato un script PowerShell che invia un report via mail con l’elenco dei computer che risultano inattivi da da un un numero di giorni impostabili (per default 180).

Lo script analizza gli account computer abilitati (ovvero con la proprietà Enable a True) che non hanno eseguito un logon da più di determinato numero di giorni (per default 180) analizzando la proprietà LastLogonDate che è un valore calcolato localmente (quindi disponibile solo su AD On premises e non ad esempio in Azure AD) sulla base dell’attributo LastLogonTimeStamp.

Di seguito alcune indicazioni sull’attributo LastLogonTimeStamp tratte dalla documetazione Microsoft:

“This is the time that the user last logged into the domain. This value is stored as a large integer that represents the number of 100-nanosecond intervals since January 1, 1601 (UTC). Whenever a user logs on, the value of this attribute is read from the DC. If the value is older [ current_time – msDS-LogonTimeSyncInterval ], the value is updated. The initial update after the raise of the domain functional level is calculated as 14 days minus random percentage of 5 days.”

Di seguito alcune indicazioni sulla proprietà LastLogonDate tratte dall’articolo Microsoft Understanding the AD Account attributes – LastLogon, LastLogonTimeStamp and LastLogonDate:

“PowerShell was nice enough to give us a third option to query by. LastLogonDate is a converted version of LastLogontimestamp. He was technically right. It’s not a replicated attribute. Instead, it’s a locally calculated value of the replicated value. Most importantly, it gives us the ability to query using human friendly date formats!!”

Nell’elenco di account computer resituiti nel corpo della mail e sotto forma di allegato in formato csv vengono inseriti anche quelli che la cui password risulta scaduta (proprietà PasswordExpired a True).

Inoltre lo script per default prevede la possibilità di escludere gli account computer su cui non è stata impostata la scadenza della password (proprietà PasswordNeverExpires a True) come ad esempio l’account computer AZUREADSSOACC che viene creato in ogni foresta della Active Directory on premises che viene sincronizzata con Azure Ad tramite l’Azure AD Connect, a riguardo si veda Azure Active Directory Seamless Single Sign-On: Technical deep dive.

Lo script è disponibile nel seguente repository di GitHub PowerShell/Send-ComputerInactiveReportMail.