Comprendere la necessità di identificare i computer inattivi in Active Directory
Computer inattivi in AD (Active Directory) possono rappresentare un rischio per la sicurezza e l’efficienza dell’organizzazione. Queste macchine potrebbero non esistere più fisicamente ma rimanere inattive, creando disordine e potenziali punti di ingresso per gli attori delle minacce. La regolare identificazione e rimozione di tali voci contribuisce a garantire un ambiente Active Directory pulito e sicuro.
Questo script PowerShell automatizza l’attività di individuazione dei computer che sono rimasti inattivi per un determinato numero di giorni. Fornisce ai professionisti IT informazioni utili e si integra anche con i campi personalizzati di NinjaOne per una reportistica semplificata.
Lo script per trovare computer inattivi in AD:
#Requires -Version 5.1 <# .SYNOPSIS Gets computers that have been inactive for a specified number of days. .DESCRIPTION Gets computers that have been inactive for a specified number of days. The number of days to consider a computer inactive can be specified as a parameter or saved to a custom field. By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). PARAMETER: -InactiveDays 30 The number of days to consider a computer inactive. Computers that have been inactive for this number of days will be included in the report. .EXAMPLE -InactiveDays 30 ## EXAMPLE OUTPUT WITH InactiveDays ## [Info] Searching for computers that are inactive for 30 days or more. [Info] Found 11 inactive computers. PARAMETER: -InactiveDays 30 -WysiwygCustomField "ReplaceMeWithAnyWysiwygCustomField" The number of days to consider a computer inactive. Computers that have been inactive for this number of days will be included in the report. .EXAMPLE -InactiveDays 30 -WysiwygCustomField "ReplaceMeWithAnyWysiwygCustomField" ## EXAMPLE OUTPUT WITH WysiwygCustomField ## [Info] Searching for computers that are inactive for 30 days or more. [Info] Found 11 inactive computers. [Info] Attempting to set Custom Field 'Inactive Computers'. [Info] Successfully set Custom Field 'Inactive Computers'! .NOTES Minimum OS Architecture Supported: Windows Server 2016 Release Notes: Initial Release #> [CmdletBinding()] param ( [Parameter()] $InactiveDays, [Parameter()] [String]$WysiwygCustomField ) begin { function Test-IsElevated { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) } function Set-NinjaProperty { [CmdletBinding()] Param( [Parameter(Mandatory = $True)] [String]$Name, [Parameter()] [String]$Type, [Parameter(Mandatory = $True, ValueFromPipeline = $True)] $Value, [Parameter()] [String]$DocumentName ) $Characters = $Value | Measure-Object -Character | Select-Object -ExpandProperty Characters if ($Characters -ge 10000) { throw [System.ArgumentOutOfRangeException]::New("Character limit exceeded, value is greater than 10,000 characters.") } # If we're requested to set the field value for a Ninja document we'll specify it here. $DocumentationParams = @{} if ($DocumentName) { $DocumentationParams["DocumentName"] = $DocumentName } # This is a list of valid fields that can be set. If no type is given, it will be assumed that the input doesn't need to be changed. $ValidFields = "Attachment", "Checkbox", "Date", "Date or Date Time", "Decimal", "Dropdown", "Email", "Integer", "IP Address", "MultiLine", "MultiSelect", "Phone", "Secure", "Text", "Time", "URL", "WYSIWYG" if ($Type -and $ValidFields -notcontains $Type) { Write-Warning "$Type is an invalid type! Please check here for valid types. https://ninjarmm.zendesk.com/hc/en-us/articles/16973443979789-Command-Line-Interface-CLI-Supported-Fields-and-Functionality" } # The field below requires additional information to be set $NeedsOptions = "Dropdown" if ($DocumentName) { if ($NeedsOptions -contains $Type) { # We'll redirect the error output to the success stream to make it easier to error out if nothing was found or something else went wrong. $NinjaPropertyOptions = Ninja-Property-Docs-Options -AttributeName $Name @DocumentationParams 2>&1 } } else { if ($NeedsOptions -contains $Type) { $NinjaPropertyOptions = Ninja-Property-Options -Name $Name 2>&1 } } # If an error is received it will have an exception property, the function will exit with that error information. if ($NinjaPropertyOptions.Exception) { throw $NinjaPropertyOptions } # The below types require values not typically given in order to be set. The below code will convert whatever we're given into a format ninjarmm-cli supports. switch ($Type) { "Checkbox" { # While it's highly likely we were given a value like "True" or a boolean datatype it's better to be safe than sorry. $NinjaValue = [System.Convert]::ToBoolean($Value) } "Date or Date Time" { # Ninjarmm-cli expects the GUID of the option to be selected. Therefore, the given value will be matched with a GUID. $Date = (Get-Date $Value).ToUniversalTime() $TimeSpan = New-TimeSpan (Get-Date "1970-01-01 00:00:00") $Date $NinjaValue = $TimeSpan.TotalSeconds } "Dropdown" { # Ninjarmm-cli is expecting the guid of the option we're trying to select. So we'll match up the value we were given with a guid. $Options = $NinjaPropertyOptions -replace '=', ',' | ConvertFrom-Csv -Header "GUID", "Name" $Selection = $Options | Where-Object { $_.Name -eq $Value } | Select-Object -ExpandProperty GUID if (-not $Selection) { throw [System.ArgumentOutOfRangeException]::New("Value is not present in dropdown") } $NinjaValue = $Selection } default { # All the other types shouldn't require additional work on the input. $NinjaValue = $Value } } # We'll need to set the field differently depending on if its a field in a Ninja Document or not. if ($DocumentName) { $CustomField = Ninja-Property-Docs-Set -AttributeName $Name -AttributeValue $NinjaValue @DocumentationParams 2>&1 } else { $CustomField = Ninja-Property-Set -Name $Name -Value $NinjaValue 2>&1 } if ($CustomField.Exception) { throw $CustomField } } } process { if (-not (Test-IsElevated)) { Write-Host "[Error] Access Denied. Please run with Administrator privileges." exit 1 } # Get Script Variables and override parameters with them if ($env:inactiveDays -and $env:inactiveDays -notlike "null") { $InactiveDays = $env:inactiveDays } if ($env:wysiwygCustomField -and $env:wysiwygCustomField -notlike "null") { $WysiwygCustomField = $env:wysiwygCustomField } # Parameter Requirements if ([string]::IsNullOrWhiteSpace($InactiveDays)) { Write-Host "[Error] Inactive Days is required." exit 1 } elseif ([int]::TryParse($InactiveDays, [ref]$null) -eq $false) { Write-Host "[Error] Inactive Days must be a number." exit 1 } # Check that Active Directory module is available if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) { Write-Host "[Error] Active Directory module is not available. Please install it and try again." exit 1 } try { # Get the date in the past $InactiveDays days $InactiveDate = (Get-Date).AddDays(-$InactiveDays) # Get the SearchBase for the domain $Domain = "DC=$( $(Get-CimInstance Win32_ComputerSystem).Domain -split "\." -join ",DC=" )" Write-Host "[Info] Searching for computers that are inactive for $InactiveDays days or more." # For Splatting parameters into Get-ADComputer $GetComputerSplat = @{ Property = "Name", "LastLogonTimeStamp", "OperatingSystem" # LastLogonTimeStamp is converted to a DateTime object from the Get-ADComputer cmdlet Filter = { (Enabled -eq "true") -and (LastLogonTimeStamp -le $InactiveDate) } SearchBase = $Domain } # Get inactive computers that are not active in the past $InactiveDays days $InactiveComputers = Get-ADComputer @GetComputerSplat | Select-Object "Name", @{ # Format the LastLogonTimeStamp property to a human-readable date Name = "LastLogon" Expression = { if ($_.LastLogonTimeStamp -gt 0) { # Convert LastLogonTimeStamp to a datetime $lastLogon = [DateTime]::FromFileTime($_.LastLogonTimeStamp) # Format the datetime $lastLogonFormatted = $lastLogon.ToString("MM/dd/yyyy hh:mm:ss tt") return $lastLogonFormatted } else { return "01/01/1601 00:00:00 AM" } } }, "OperatingSystem" if ($InactiveComputers -and $InactiveComputers.Count -gt 0) { Write-Host "[Info] Found $($InactiveComputers.Count) inactive computers." } else { Write-Host "[Info] No inactive computers were found." } } catch { Write-Host "[Error] Failed to get inactive computers. Please try again." exit 1 } # Save the results to a custom field if ($WysiwygCustomField) { try { Write-Host "[Info] Attempting to set Custom Field '$WysiwygCustomField'." Set-NinjaProperty -Name $WysiwygCustomField -Value $($InactiveComputers | ConvertTo-Html -Fragment | Out-String) Write-Host "[Info] Successfully set Custom Field '$WysiwygCustomField'!" } catch { Write-Host "[Error] Failed to set Custom Field '$WysiwygCustomField'." $ExitCode = 1 } } $InactiveComputers | Format-Table -AutoSize | Out-String -Width 4000 | Write-Host exit $ExitCode } end { }
Risparmia tempo con gli oltre 300 script del Dojo NinjaOne.
Come funziona lo script PowerShell per trovare computer inattivi in AD
Questo script per trovare computer inattivi in AD è pensato per i professionisti IT che gestiscono ambienti AD e richiede PowerShell 5.1 o superiore. Ecco una descrizione dettagliata del suo funzionamento:
Prerequisiti
- Privilegi amministrativi: Lo script per trovare computer inattivi in AD controlla la presenza di privilegi elevati, garantendo un’esecuzione sicura ed efficace.
- Modulo Active Directory: Lo script per trovare computer inattivi in AD si basa sul modulo PowerShell di Active Directory per interagire con gli oggetti AD.
- Configurazione del campo personalizzato (opzionale): Se si utilizza NinjaOne, lo script per trovare computer inattivi in AD può scrivere i risultati in un campo personalizzato per facilitare il tracciamento.
Componenti chiave
- Gestione dei parametri:
Lo script per trovare computer inattivi in AD accetta due parametri: - -InactiveDays: Specifica la soglia (in giorni) per considerare un computer inattivo.
- -WysiwygCustomField: Parametro opzionale per salvare i risultati in un campo personalizzato di NinjaOne.
- Override tramite variabili d’ambiente:
Lo script per trovare computer inattivi in AD può estrarre i valori di configurazione dalle variabili d’ambiente, consentendo regolazioni dinamiche senza la codifica dei parametri. - Ricerca di computer inattivi:
Utilizzando Get-ADComputer, lo script interroga AD per i computer il cui LastLogonTimeStamp è più vecchio della soglia specificata. Converte il LastLogonTimeStamp in un formato leggibile dall’uomo per una migliore reportistica. - Integrazione dei campi personalizzati:
Se viene specificato il parametro -WysiwygCustomField, lo script per trovare computer inattivi in AD sfrutta una funzione Set-NinjaProperty per salvare i risultati formattati in HTML nei campi personalizzati di NinjaOne. - Gestione degli errori:
Lo script per trovare computer inattivi in AD include solidi controlli di errore per la disponibilità dei moduli, la convalida dei parametri e l’elaborazione dei risultati, garantendo un’esecuzione senza problemi.
Casi d’uso pratici
Scenario: Ripulire una rete inattiva
Un MSP che gestisce una rete aziendale di medie dimensioni nota un picco di accessi non riusciti e sospetta che gli account di computer inattivi in AD contribuiscano alle vulnerabilità di sicurezza. Utilizzando questo script per trovare computer inattivi in AD, il team IT identifica rapidamente i computer inattivi da oltre 60 giorni ed esporta i risultati per la revisione. Grazie a queste informazioni, ripulisce AD, migliorando l’efficienza e la sicurezza della rete.
Scenario: Manutenzione proattiva
Un’azienda implementa lo script per trovare computer inattivi in AD come parte della sua routine di manutenzione trimestrale, assicurando che la sua Active Directory rimanga ordinata e aggiornata. L’integrazione dello script per trovare computer inattivi in AD con NinjaOne consente al team IT di mantenere log cronologici dei computer inattivi a fini di verifica.
Come questo script si comporta rispetto ad altri metodi
Query manuali:
Gli amministratori IT possono anche interrogare manualmente AD utilizzando cmdlet PowerShell come Get-ADComputer, ma questo script automatizza il processo per trovare computer inattivi in AD, garantendo risultati coerenti e riducendo gli errori umani.
Strumenti di terze parti:
Gli strumenti commerciali per la pulizia dell’AD offrono funzionalità simili, ma hanno un costo. Questo script per trovare computer inattivi in AD offre un’alternativa gratuita e personalizzabile, con l’ulteriore vantaggio dell’integrazione con NinjaOne.
Strumenti GUI integrati:
L’uso degli strumenti amministrativi di AD per svolgere questa attività può essere noioso e richiedere molto tempo. Lo script semplifica il processo per trovare computer inattivi in AD, soprattutto per gli ambienti di grandi dimensioni.
Domande frequenti
Posso utilizzare questo script per trovare computer inattivi in AD senza NinjaOne?
Assolutamente. Lo script per trovare computer inattivi in AD funziona in modo indipendente per identificare i computer inattivi. L’integrazione con NinjaOne è opzionale.
Come fa lo script a determinare uno stato di inattività?
Controlla l’attributo LastLogonTimeStamp degli account dei computer e lo confronta con la soglia specificata.
Questo script per trovare computer inattivi in AD è sicuro?
Sì, ma assicurati che venga eseguito in un ambiente sicuro e con le autorizzazioni adeguate. Se hai dei dubbi, esegui il test in un ambiente non di produzione.
Posso modificare lo script per altri oggetti AD, come gli utenti?
Sì, con piccole modifiche al cmdlet Get-ADComputer, è possibile indirizzare lo script verso gli utenti o altri oggetti AD.
Implicazioni dell’uso di questo script
La pulizia dei computer inattivi riduce la superficie di attacco della rete, minimizza il disordine e migliora le prestazioni di Active Directory. Utilizzando regolarmente questo script per trovare computer inattivi in AD, le organizzazioni possono mantenere una sicurezza più rigorosa e garantire la conformità ai criteri di governance IT.
Raccomandazioni per l’utilizzo di questo script
- Eseguilo come amministratore: Assicurati di eseguire lo script per trovare computer inattivi in AD con privilegi elevati.
- Testa in ambiente di protetto: Prima di distribuirlo in produzione, testa lo script per confermare che si comporti come previsto.
- Automatizza il processo: Pianifica l’esecuzione periodica dello script per trovare computer inattivi in AD utilizzando Task Scheduler o uno strumento simile.
- Utilizzalo in combinazione con NinjaOne: Sfrutta l’integrazione per ottenere report completi all’interno della tua piattaforma RMM.
Considerazioni finali
La gestione dei computer inattivi in Active Directory è un’attività fondamentale per i professionisti IT. Questo script PowerShell offre una soluzione affidabile e flessibile per trovare computer inattivi in AD, automatizzando il processo di identificazione e integrandosi perfettamente con NinjaOne per una migliore reportistica. Incorporando questi strumenti nei loro flussi di lavoro, i team IT possono migliorare la sicurezza, semplificare le operazioni e mantenere un ambiente Active Directory pulito.
Per i professionisti IT che desiderano semplificare la gestione dell’AD, NinjaOne offre strumenti potenti che integrano script come questo, consentendo un monitoraggio ottimizzato e una manutenzione proattiva.