Come trovare computer inattivi in AD (Active Directory) usando PowerShell 

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.

Accedi oggi stesso.

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

  1. Gestione dei parametri:
    Lo script per trovare computer inattivi in AD accetta due parametri:
  2. -InactiveDays: Specifica la soglia (in giorni) per considerare un computer inattivo.
  3. -WysiwygCustomField: Parametro opzionale per salvare i risultati in un campo personalizzato di NinjaOne.
  4. 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.
  5. 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.
  6. 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.
  7. 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

  1. Eseguilo come amministratore: Assicurati di eseguire lo script per trovare computer inattivi in AD con privilegi elevati.
  2. Testa in ambiente di protetto: Prima di distribuirlo in produzione, testa lo script per confermare che si comporti come previsto.
  3. Automatizza il processo: Pianifica l’esecuzione periodica dello script per trovare computer inattivi in AD utilizzando Task Scheduler o uno strumento simile.
  4. 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.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più sulla distribuzione remota di script con NinjaOne, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.