Wireless LAN reports are indispensable in the IT industry. The ability to quickly and efficiently understand the state, performance, and potential security vulnerabilities of wireless networks is vital for businesses, large or small. Through a well-structured PowerShell script, one can achieve this seamlessly, providing IT professionals and Managed Service Providers (MSPs) with a the ability to generate a comprehensive wireless LAN report
Background
In an era where network uptime and security are paramount, the ability to generate a Wireless LAN report becomes a necessity. These reports assist IT professionals in monitoring the health of their networks, understanding user behavior, and spotting potential anomalies that might indicate security breaches. For MSPs who manage multiple clients’ networks, these reports provide a tangible way to show work done and insights gained. The provided script is a tool that can be leveraged by IT professionals to automate and simplify this reporting process, harnessing the power of PowerShell scripting.
The Script
#Requires -Version 5.1 <# .SYNOPSIS Saves a Wireless LAN report to a Multi-Line Custom Field. .DESCRIPTION Saves a Wireless LAN report to a Multi-Line Custom Field. .EXAMPLE -CustomField "wlanreport" Saves a Wireless LAN report to a Multi-Line Custom Field. .OUTPUTS None .NOTES Minimum OS Architecture Supported: Windows 10, Windows Server 2016 Release Notes: Initial Release 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). #> [CmdletBinding()] param ( [Parameter()] [String] $CustomField = "wlanreport" ) process { if (-not (Test-IsElevated)) { Write-Error -Message "Access Denied. Please run with Administrator privileges." exit 1 } if ($env:CustomField) { # Use Script Variable and overwrite parameter $CustomField = $env:CustomField } $WLanReportXmlPath = "C:ProgramDataMicrosoftWindowsWlanReportwlan-report-latest.xml" # Generate the wlan report netsh.exe wlan show wlanreport | Out-Null # Check that the xml report exists if (-not $(Test-Path -Path $WLanReportXmlPath)) { Write-Host "[Error] $WLanReportXmlPath was not created by: netsh.exe wlan show wlanreport" exit 1 } # Convert the report from XML to a hash table $WLanReport = [xml[]]$(Get-Content -Raw -Path $WLanReportXmlPath) | ConvertFrom-Xml # Get the date that the report was generated $ReportDate = [DateTime]::ParseExact($WLanReport.WlanReport.ReportInformation.ReportDate -replace 'Z', "yyyy'-'MM'-'dd'T'HH':'mm':'ss", $null) # Collect data into one variable $Report = if ($WLanReport) { # Output the date of the report Write-Output "Report Date : $ReportDate" # Output the user information $WLanReport.WlanReport.UserInformation | Format-Table # Output the saved Access Points $WLanReport.WlanReport.Profiles.'Wi-Fi'.Keys | ForEach-Object { $AccessPointName = $_ $AccessPointData = [xml[]]$WLanReport.WlanReport.Profiles.'Wi-Fi'."$AccessPointName" if ($null -ne $AccessPointData) { $AccessPoint = $AccessPointData | ConvertFrom-Xml [PSCustomObject]@{ AccessPointName = $AccessPointName Authentication = $AccessPoint."$AccessPointName".MSM.security.authEncryption.authentication Encryption = $AccessPoint."$AccessPointName".MSM.security.authEncryption.encryption MacRandomization = $AccessPoint."$AccessPointName".MacRandomization.enableRandomization } } } | Format-Table # Output the system information $WLanReport.WlanReport.SystemInformation.Keys | ForEach-Object { $Data = $($WLanReport.WlanReport.SystemInformation."$($_)") if ($Data -is "String") { Write-Output "$_ : $Data" } } # Output network adapters Get-NetAdapter | Format-Table Name, InterfaceDescription, Status, MacAddress, LinkSpeed, MediaType } else { $null } if ($Report) { # Output report to Activity Feed $Report | Out-String | Write-Host # Save report to multi-line custom field Ninja-Property-Set -Name $CustomField -Value $($Report | Out-String) } else { Write-Host "Could not generate wlan report." exit 1 } } 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 ConvertFrom-Xml { param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node) process { if ($node.DocumentElement) { $node = $node.DocumentElement } $oht = [ordered] @{} $name = $node.Name if ($node.FirstChild -is [system.xml.xmltext]) { $oht.$name = $node.FirstChild.InnerText } else { $oht.$name = New-Object System.Collections.ArrayList foreach ($child in $node.ChildNodes) { $null = $oht.$name.Add((ConvertFrom-Xml $child)) } } $oht } } } end { $ScriptVariables = @( [PSCustomObject]@{ name = "CustomField" calculatedName = "customfield" required = $true defaultValue = [PSCustomObject]@{ type = "TEXT" value = "wlanreport" } valueType = "TEXT" # Must be uppercase! valueList = $null description = "A multi-line Custom Field that the report will be saved to." } ) }
Access 300+ scripts in the NinjaOne Dojo
Detailed Breakdown
The script begins by checking for the necessary version, which is 5.1, ensuring compatibility. Then, a synopsis, description, and examples are provided, offering a succinct explanation of the script’s purpose.
Parameters are then defined for the script, with the default being “wlanreport.” In the ‘process’ block, the script checks for elevated privileges. Without administrator rights, the script won’t run. It then checks for an environment variable named “CustomField.” If found, it will overwrite the script’s parameter.
The main meat of the script generates the WLAN report through the netsh.exe wlan show wlanreport command and then checks if the report was successfully created. After validation, it converts this XML report into a more readable hash table, extracts useful data like user information, access points, and system information, and then formats them nicely in a table format.
The end block of the script defines some custom functions like Test-IsElevated, which checks if the script is run with elevated rights, and ConvertFrom-Xml, a function to convert XML data.
Potential Use Cases
Imagine Sarah, an IT professional in a medium-sized business. Their office recently experienced some network fluctuations, and Sarah’s task is to diagnose any issues with the WLAN. Using this script, she can quickly generate a detailed WLAN report, uncovering data related to user connections, active access points, and system details, helping her pinpoint the root cause of the issue.
Comparisons
Traditionally, generating a WLAN report would involve manual interventions, using built-in OS tools, third-party software, or even hardware tools. While these methods are still valid, the provided PowerShell script offers automation, speed, and consistency, especially beneficial for MSPs who manage numerous networks and require a standardized approach.
FAQs
- Can this script be modified to run on older versions of PowerShell?
This script specifically requires version 5.1 due to some functionalities it leverages. Attempting to use it with older versions might lead to compatibility issues. - What if I want the report saved elsewhere?
The script can be modified. You would need to change the $WLanReportXmlPath variable to your desired location.
Implications
While the script helps in generating comprehensive WLAN reports, users must understand its outputs to make meaningful security decisions. Overlooking specific details or misinterpreting the data can lead to security vulnerabilities going unnoticed.
Recommendations
- Always run the script with the necessary permissions.
- Ensure your PowerShell version is compatible.
- Regularly review and interpret the reports generated for effective decision-making.
Final Thoughts
For IT professionals, NinjaOne offers a centralized platform to manage IT infrastructure. Coupling this script with NinjaOne’s capabilities can enhance monitoring, management, and reporting on wireless networks, providing a holistic approach to IT network management. By leveraging tools like the provided PowerShell script, IT professionals can work smarter, not harder, ensuring their networks are always at their best performance.