Wie man automatisierte Internet-Geschwindigkeitstests mit PowerShell ausführt

Die Aufrechterhaltung einer optimalen Netzwerkleistung ist in der IT-Welt von entscheidender Bedeutung. Ein wesentlicher Aspekt dabei ist, dass die Internet-Geschwindigkeiten ständig den erforderlichen Standards entsprechen. IT-Experten und Managed Service Provider (MSPs) benötigen zuverlässige Methoden zur Messung und Überprüfung dieser Geschwindigkeiten. Es bestehen zwar verschiedene Herangehensweisen, aber wir erklären Ihnen heute, wie sich Internet-Geschwindigkeitstests mit PowerShell automatisieren lassen.

Ein PowerShell-Skript, das diesen Prozess automatisiert, kann Zeit sparen und genaue, aktuelle Informationen gewährleisten. In diesem Blogbeitrag wird ein detailliertes Skript vorgestellt, mit dem ein Internet-Geschwindigkeitstest mit dem CLI von Ookla durchgeführt und die Ergebnisse in einem benutzerdefinierten Feld gespeichert werden können.

Kontext

Das mitgelieferte Skript nutzt die CLI von Ookla, um Internet-Geschwindigkeitstests auf Windows-Geräten auszuführen, was es für IT-Experten und MSPs sehr nützlich macht. Dieses Skript befasst sich mit einer häufigen Herausforderung: dem Testen und Überprüfen der Internetgeschwindigkeit über mehrere Geräte hinweg, ohne das Netzwerk zu überlasten. Durch die Randomisierung des Testbeginns innerhalb eines 60-Minuten-Fensters wird sichergestellt, dass die Tests auf verschiedene Zeitpunkte verteilt werden, wodurch die Wahrscheinlichkeit gleichzeitiger Tests verringert wird.

Das Skript:

#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 {
    
    
    
}

 

Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.

Zugang erhalten

Detailansicht

Das Skript führt mehrere wichtige Aufgaben aus:

  1. Initialisierung der Parameter: Richtet Standardparameter ein und prüft auf Umgebungsvariablen.
  2. TLS-Konfiguration: Stellt sicher, dass die entsprechenden Sicherheitsprotokolle für ältere PowerShell-Versionen festgelegt sind.
  3. Zufällige Verzögerung: Führt eine zufällige Verzögerung vor der Durchführung des Geschwindigkeitstests ein, um eine Überlastung des Netzwerkes zu vermeiden.
  4. Geschwindigkeitstest-CLI-Download: Lädt die neueste Version von Ooklas CLI herunter.
  5. Durchführung des Geschwindigkeitstests: Führt den Geschwindigkeitstest durch und speichert die Ergebnisse im JSON-Format.
  6. Parsen und Speicherung der Ergebnisse: Konvertiert die JSON-Ergebnisse in ein lesbares Format und speichert sie in einem benutzerdefinierten Feld.

Schrittweise Aufschlüsselung

  1. Initialisierung der Parameter: Das Skript beginnt mit der Definition von Parametern. $CustomField gibt an, wo die Ergebnisse gespeichert werden, und $SkipSleep ist ein Schalter zum Überspringen der zufälligen Verzögerung.
  2. TLS-Konfiguration: Dieser Abschnitt stellt sicher, dass die entsprechenden TLS-Protokolle aktiviert sind, die für sichere Webanfragen erforderlich sind.
  3. Zufällige Verzögerung: Um eine Überlastung des Netzwerkes zu vermeiden, wartet das Skript eine zufällige Zeit zwischen 0 und 60 Minuten, bevor es den Geschwindigkeitstest ausführt.
  4. Geschwindigkeitstest-CLI-Download: Dieser Teil lädt und extrahiert die neueste CLI von Ookla.
  5. Ausführung des Geschwindigkeitstests: Das Skript führt den Geschwindigkeitstest durch und gibt die Ergebnisse im JSON-Format aus.
  6. Parsen und Speicherung der Ergebnisse: Die Ergebnisse werden analysiert und in einem benutzerdefinierten Feld gespeichert.

Potenzielle Anwendungsfälle

Stellen Sie sich vor, ein MSP verwaltet mehrere Kundennetzwerke. Durch die Verteilung dieses Skripts auf die Rechner von Kunden kann der MSP Daten zur Internetgeschwindigkeit ohne manuelle Eingriffe erfassen. Meldet ein Kunde beispielsweise, dass die Internetgeschwindigkeit zeitweise langsam ist, kann der MSP die protokollierten Geschwindigkeitstest-Ergebnisse überprüfen, um Muster zu erkennen und das Problem effektiver anzugehen.

Vergleiche

Andere Methoden zum Testen der Internet-Geschwindigkeit können webbasierte Tools oder eigenständige Anwendungen sein. Diese können zwar effektiv sein, aber es fehlt ihnen an Automatisierung und zentraler Datenspeicherung. Dieses PowerShell-Skript bietet eine optimierte, automatisierte Lösung, die sich nahtlos in bestehende Systeme integrieren lässt und einen erheblichen Vorteil in Bezug auf Effizienz und Datenverwaltung bietet.

FAQs

Q1: Warum soll man eine zufällige Verzögerung verwenden?

A1: Durch die zufällige Verzögerung wird verhindert, dass mehrere Geräte gleichzeitig den Geschwindigkeitstest durchführen, wodurch die Ergebnisse verfälscht und das Netzwerk überlastet werden könnte.

Q2: Kann dieses Skript auf jeder Version von PowerShell ausgeführt werden?

A2: Das Skript erfordert aufgrund bestimmter cmdlet-Abhängigkeiten und TLS-Konfigurationen mindestens PowerShell 3.0.

Q3: Was passiert, wenn der Download der Ookla-CLI fehlschlägt?

A3: Das Skript enthält eine Fehlerbehandlungslösung, um den Vorgang ordnungsgemäß zu beenden und eine Fehlermeldung auszugeben, wenn der Download fehlschlägt.

Folgen

Genaue Internet-Geschwindigkeitstests können helfen, potenzielle Netzwerkprobleme zu erkennen, einschließlich sicherheitsrelevanter Anomalien wie unerwarteter Geschwindigkeitseinbuße, die auf Netzwerkstörungen oder unbefugte Nutzung hinweisen könnten. Eine regelmäßige Überwachung mit diesem Skript kann Einblicke in die Netzwerkleistung geben und dazu beitragen, robuste Sicherheitsstandards aufrechtzuerhalten.

Empfehlungen

  1. Regelmäßige Ausführung: Planen Sie die Ausführung des Skripts in regelmäßigen Abständen für eine kontinuierliche Überwachung.
  2. Überprüfung der Ergebnisse: Überprüfen Sie regelmäßig die gesammelten Daten, um Trends zu erkennen und etwaige Probleme anzugehen.
  3. Sichere Speicherung: Stellen Sie sicher, dass die Ergebnisse sicher gespeichert werden, um unbefugten Zugriff zu verhindern.

Abschließende Überlegungen

Dieses PowerShell-Skripts zur Durchführung von Internet-Geschwindigkeitstests ist ein leistungsstarkes Tool für IT-Experten und MSPs. Durch die Automatisierung des Prozesses und die Speicherung der Ergebnisse in einem benutzerdefinierten Feld vereinfacht es die Überwachung der Netzwerkleistung. NinjaOne kann diese Fähigkeit weiter ausbauen, indem es das Skript in seine Tool-Suite integriert und so eine zentrale Plattform für die Verwaltung und Analyse von Netzwerkleistungsdaten bereitstellt.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool zur Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, alle Geräte zu überwachen, zu verwalten, zu sichern und zu unterstützen, unabhängig vom Standort, ohne dass eine komplexe Infrastruktur vor Ort erforderlich ist.

Erfahren Sie mehr über NinjaOne Remote Script Deployment, sehen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion unserer NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Allgemeine Geschäftsbedingungen für Skripte

Indem Sie unten auf die Schaltfläche “Ich akzeptiere” klicken, erklären Sie Ihr Einverständnis mit den folgenden rechtlichen Bedingungen sowie mit unseren Nutzungsbedingungen:

  • Eigentumsrechte: NinjaOne besitzt und wird weiterhin alle Rechte, Titel und Interessen an dem Skript (einschließlich des Urheberrechts) behalten. NinjaOne gewährt Ihnen eine eingeschränkte Lizenz zur Nutzung des Skripts in Übereinstimmung mit diesen rechtlichen Bedingungen.
  • Einschränkung der Nutzung: Sie dürfen das Skript nur für Ihre legitimen persönlichen oder internen Geschäftszwecke verwenden und es nicht an Dritte weitergeben.
  • Verbot der Wiederveröffentlichung: Sie sind unter keinen Umständen berechtigt, das Skript in einer Skriptbibliothek, die einem anderen Softwareanbieter gehört oder von diesem kontrolliert wird, erneut zu veröffentlichen.
  • Gewährleistungsausschluss: Das Skript wird “wie gesehen” und “wie verfügbar” bereitgestellt, ohne jegliche Garantie. NinjaOne gibt keine Versprechen oder Garantien, dass das Skript frei von Fehlern ist oder dass es Ihre speziellen Bedürfnisse oder Erwartungen erfüllt.
  • Risikoübernahme: Die Verwendung des Skripts erfolgt auf eigene Gefahr. Sie erkennen an, dass die Nutzung des Skripts mit bestimmten Risiken verbunden ist, und Sie verstehen und übernehmen jedes dieser Risiken.
  • Verzicht und Freigabe: Sie machen NinjaOne nicht für nachteilige oder unbeabsichtigte Folgen verantwortlich, die sich aus Ihrer Nutzung des Skripts ergeben, und Sie verzichten auf alle gesetzlichen oder billigkeitsrechtlichen Rechte oder Rechtsmittel, die Sie gegen NinjaOne im Zusammenhang mit Ihrer Nutzung des Skripts haben könnten.
  • EULA: Wenn Sie ein NinjaOne-Kunde sind, unterliegt Ihre Nutzung des Skripts dem für Sie geltenden Endbenutzer-Lizenzvertrag (EULA).