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.
Detailansicht
Das Skript führt mehrere wichtige Aufgaben aus:
- Initialisierung der Parameter: Richtet Standardparameter ein und prüft auf Umgebungsvariablen.
- TLS-Konfiguration: Stellt sicher, dass die entsprechenden Sicherheitsprotokolle für ältere PowerShell-Versionen festgelegt sind.
- 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.
- Geschwindigkeitstest-CLI-Download: Lädt die neueste Version von Ooklas CLI herunter.
- Durchführung des Geschwindigkeitstests: Führt den Geschwindigkeitstest durch und speichert die Ergebnisse im JSON-Format.
- Parsen und Speicherung der Ergebnisse: Konvertiert die JSON-Ergebnisse in ein lesbares Format und speichert sie in einem benutzerdefinierten Feld.
Schrittweise Aufschlüsselung
- 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.
- TLS-Konfiguration: Dieser Abschnitt stellt sicher, dass die entsprechenden TLS-Protokolle aktiviert sind, die für sichere Webanfragen erforderlich sind.
- 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.
- Geschwindigkeitstest-CLI-Download: Dieser Teil lädt und extrahiert die neueste CLI von Ookla.
- Ausführung des Geschwindigkeitstests: Das Skript führt den Geschwindigkeitstest durch und gibt die Ergebnisse im JSON-Format aus.
- 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
- Regelmäßige Ausführung: Planen Sie die Ausführung des Skripts in regelmäßigen Abständen für eine kontinuierliche Überwachung.
- Überprüfung der Ergebnisse: Überprüfen Sie regelmäßig die gesammelten Daten, um Trends zu erkennen und etwaige Probleme anzugehen.
- 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.