Come eseguire test di velocità di Internet automatizzati con PowerShell

Il mantenimento di prestazioni di rete ottimali è fondamentale nel mondo IT. Un aspetto essenziale è quello di garantire che la velocità di Internet sia sempre conforme agli standard richiesti. I professionisti IT e i Managed Service Provider (MSP) hanno bisogno di metodi affidabili per misurare e verificare queste velocità.

Uno script PowerShell che automatizzi questo processo può far risparmiare tempo e garantire informazioni accurate e aggiornate. In questo articolo analizzeremo uno script progettato in modo specifico per eseguire un test di velocità di Internet utilizzando la CLI di Ookla e memorizzando i risultati in un campo personalizzato.

Background

Lo script fornito sfrutta la CLI di Ookla per eseguire test di velocità di Internet sui dispositivi Windows, ed è molto utile per i professionisti IT e gli MSP. Questo script affronta una sfida comune: testare e verificare la velocità di Internet su più dispositivi senza causare congestioni di rete. La randomizzazione dell’orario di inizio del test all’interno di una finestra di 60 minuti garantisce che i test siano distribuiti, riducendo la probabilità di test simultanei.

Lo script per eseguire test di velocità di Internet:

#Requires -Version 3.0

<#
.SYNOPSIS
    Runs an internet speed test using Ookla Cli on the target windows device and saves the results to a Multi-Line Custom Field.
.DESCRIPTION
    Runs an internet speed test using Ookla Cli on the target windows device and saves the results to a Multi-Line Custom Field.
    Script will pick a random time slot from 0 to 60 minutes to run the speed test.
    This lessens the likely hood that multiple devices are testing at the same time.

    The default custom field: speedtest
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 7, Windows Server 2012
    Minimum PowerShell Version: 3.0
    Release Notes: Renamed script and added Script Variable support
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).
.COMPONENT
    Utility
#>
[CmdletBinding()]
param (
    [Parameter()]
    [string]$CustomField = "speedtest",
    [Parameter()]
    [switch]$SkipSleep = [System.Convert]::ToBoolean($env:skipRandomSleepTime)
)
begin {
    if ($env:customFieldName -and $env:customFieldName -notlike "null") { $CustomField = $env:customFieldName }
    # add TLS 1.2 and SSL3 to allow Invoke-WebRequest to work under older PowerShell versions
    if ($PSVersionTable.PSVersion.Major -eq 2) {
        Write-Host "Requires at least PowerShell 3.0 to run."
        exit 1
    }
    else {
        try {
            $TLS12Protocol = [System.Net.SecurityProtocolType] 'Ssl3 , Tls12, Tls11'
            [System.Net.ServicePointManager]::SecurityProtocol = $TLS12Protocol
        }
        catch {
            Write-Host "Failed to set SecurityProtocol to Tls 1.2, Tls1.1, and Ssl3"
        }
    }
    $CurrentPath = Get-Item -Path ".\"
}
process {
    # Random delay from 0 to 60 minutes in 2 minute time slots
    $MaximumDelay = 60
    $TimeChunks = 2
    $Parts = ($MaximumDelay / $TimeChunks) + 1
    $RandomNumber = Get-Random -Minimum 0 -Maximum $Parts
    $Minutes = $RandomNumber * $TimeChunks
    if (-not $SkipSleep) {
        Start-Sleep -Seconds $($Minutes * 60)
    }

    # Get latest version of speedtest cli
    try {
        $Cli = Invoke-WebRequest -Uri "https://www.speedtest.net/apps/cli" -UseBasicParsing
    }
    catch {
        Write-Host "Failed to query https://www.speedtest.net/apps/cli for speed test cli zip."
        exit 1
    }
    
    # Get the download link
    $Url = $Cli.Links | Where-Object { $_.href -like "*win64*" } | Select-Object -ExpandProperty href
    # Build the URL and destination path
    $InvokeSplat = @{
        Uri     = $Url
        OutFile = Join-Path -Path $CurrentPath -ChildPath $($Url | Split-Path -Leaf)
    }
    # Download the speedtest cli zip
    try {
        Invoke-WebRequest @InvokeSplat -UseBasicParsing
    }
    catch {
        Write-Host "Failed to download speed test cli zip from $Url"
        exit 1
    }
    
    # Build the path to speedtest.exe
    $ExePath = Join-Path -Path $CurrentPath -ChildPath "speedtest.exe"
    $MdPath = Join-Path -Path $CurrentPath -ChildPath "speedtest.md"

    if ($(Get-Command -Name "Expand-Archive" -ErrorAction SilentlyContinue).Count) {
        Expand-Archive -Path $InvokeSplat["OutFile"] -DestinationPath $CurrentPath
    }
    else {
        # Unzip the speedtest cli zip
        Add-Type -AssemblyName System.IO.Compression.FileSystem
        if ((Test-Path -Path $ExePath)) {
            Remove-Item -Path $ExePath, $MdPath -Force -Confirm:$false -ErrorAction Stop
        }
        [System.IO.Compression.ZipFile]::ExtractToDirectory($InvokeSplat["OutFile"], $CurrentPath)
    }

    $JsonOutput = if ($(Test-Path -Path $ExePath -ErrorAction SilentlyContinue)) {
        # Run speed test and output in a json format
        try {
            Invoke-Command -ScriptBlock {
                & .\speedtest.exe --accept-license --accept-gdpr --format=json
                if (0 -ne $LASTEXITCODE) {
                    Write-Error -Message "Failed to run speedtest.exe."
                }
            }
        }
        catch {
            Remove-Item -Path $ExePath, $MdPath, $InvokeSplat["OutFile"] -Force -Confirm:$false
            Write-Error -Message "Failed to run speedtest.exe."
            exit 1
        }
    }

    if ($JsonOutput) {
        # Convert from Json to PSCustomObject
        $Output = $JsonOutput | ConvertFrom-Json
        # Output the results
        $Results = [PSCustomObject]@{
            Date       = $Output.timestamp | Get-Date
            ISP        = $Output.isp
            Down       = "$([System.Math]::Round($Output.download.bandwidth * 8 / 1MB,0)) Mbps"
            Up         = "$([System.Math]::Round($Output.upload.bandwidth * 8 / 1MB,0)) Mbps"
            ResultUrl  = $Output.result.url
            PacketLoss = $Output.packetLoss
            Jitter     = $Output.ping.jitter
            Latency    = $Output.ping.latency
            Low        = $Output.ping.low
            High       = $Output.ping.high
        } | Out-String
        $Results | Write-Host
        Ninja-Property-Set -Name $CustomField -Value $Results
    }
    Remove-Item -Path $ExePath, $MdPath, $InvokeSplat["OutFile"] -Force -Confirm:$false
    exit 0
}
end {
    
    
    
}

 

Analisi dettagliata

Lo script per effettuare test di velocità di Internet esegue diversi compiti chiave:

  1. Inizializzazione dei parametri: Imposta i parametri predefiniti e controlla le variabili d’ambiente.
  2. Configurazione TLS: Assicura l’impostazione dei protocolli di sicurezza appropriati per le versioni precedenti di PowerShell.
  3. Ritardo casuale: Introduce un ritardo casuale prima di eseguire il test di velocità per evitare la congestione della rete.
  4. Download della CLI di Speedtest: Scarica l’ultima versione della CLI di Ookla.
  5. Esecuzione del test di velocità: Esegue il test di velocità e cattura i risultati in formato JSON.
  6. Parsing e memorizzazione dei risultati: Converte i risultati JSON in un formato leggibile e li memorizza in un campo personalizzato.

Analisi dettagliata delle fasi

  1. Inizializzazione dei parametri Lo script per effettuare test di velocità di Internet inizia con la definizione dei parametri. $CustomField specifica dove verranno memorizzati i risultati e $SkipSleep è uno switch per saltare il ritardo randomizzato.
  2. Configurazione TLS Questa sezione assicura che siano abilitati i protocolli TLS appropriati, necessari per le richieste web sicure.
  3. Ritardo casuale Per evitare la congestione della rete, lo script attende un tempo casuale compreso tra 0 e 60 minuti prima di eseguire il test di velocità di Internet.
  4. Download della CLI di Speedtest Questa parte scarica ed estrae l’ultima CLI di Ookla.
  5. Esecuzione del test di velocità Lo script esegue il test di velocità di Internet e fornisce i risultati in formato JSON.
  6. I risultati vengono analizzati e memorizzati in un campo personalizzato.

Casi d’uso potenziali

Immagina un MSP che gestisce più reti di clienti. Distribuendo questo script sui computer dei clienti, l’MSP può raccogliere dati sulla velocità di Internet senza interventi manuali. Per esempio, se un cliente segnala una lentezza intermittente della velocità di Internet, l’MSP può esaminare i risultati ordinati in ordine cronologico dei test di velocità di Internet per identificare gli schemi e affrontare il problema in modo più efficace.

Confronti

Altri metodi per effettuare test di velocità di Internet possono essere l’utilizzo di strumenti basati sul Web o di applicazioni autonome. Anche se possono essere efficaci, mancano di automazione e di archiviazione centralizzata dei dati. Questo script PowerShell offre una soluzione snella e automatizzata che si integra perfettamente con i sistemi esistenti, offrendo un vantaggio significativo in termini di efficienza e gestione dei dati.

Domande frequenti

D1: Perché usare un ritardo casuale?

R1: Il ritardo casuale aiuta a evitare che più dispositivi eseguano il test di velocità contemporaneamente, il che potrebbe falsare i risultati e creare una congestione della rete.

D2: Questo script per effettuare test di velocità di Internet può essere eseguito su qualsiasi versione di PowerShell?

R2: Lo script per effettuare test di velocità di Internet richiede almeno PowerShell 3.0 a causa di alcune dipendenze dei cmdlet e delle configurazioni TLS.

D3: Cosa succede se il download di Ookla CLI non riesce?

R3: Lo script per effettuare test di velocità di Internet include la gestione degli errori per uscire e fornire un messaggio di errore se il download non riesce.

Implicazioni

Un test di velocità di Internet accurato può aiutare a identificare potenziali problemi di rete, comprese le anomalie legate alla sicurezza, come cali di velocità inaspettati che potrebbero indicare interferenze di rete o usi non autorizzati. Il monitoraggio regolare effettuato con questo script può fornire informazioni sulle prestazioni della rete e contribuire a mantenere solidi standard di sicurezza.

Raccomandazioni

  1. Programmazione regolare: Pianifica l’esecuzione dello script per effettuare test di velocità di Internet a intervalli regolari per un monitoraggio continuo.
  2. Esame dei risultati: Esamina periodicamente i dati raccolti per identificare le tendenze e affrontare eventuali problemi.
  3. Archiviazione sicura: Assicurati che i risultati siano conservati in modo sicuro per evitare accessi non autorizzati.

Considerazioni finali

L’utilizzo di questo script PowerShell per eseguire test di velocità di Internet offre un potente strumento ai professionisti IT e agli MSP. Automatizzando il processo e memorizzando i risultati in un campo personalizzato, lo script semplifica il monitoraggio delle prestazioni di rete. NinjaOne può migliorare ulteriormente questa capacità integrando lo script nella sua suite di strumenti, fornendo una piattaforma centralizzata per la gestione e l’analisi dei dati sulle prestazioni della rete.

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ù su NinjaOne Endpoint Management, 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.