Last active
January 23, 2026 01:42
-
-
Save SweetAsNZ/195cb116076e38846f5635f3aad282f5 to your computer and use it in GitHub Desktop.
Multiple Functions to get various Windows system information. Get-DNSServers, Get-DNS, Get-Gateway, Get-GW, Get-IP, Get-SubnetMask, Get-MACAddress, Get-MAC, Get-UpTime, Get-DiskSpace, Get-MappedDrives, Test-Gateway, Test-GW, Get-FreeSpace, Get-Proxy, Show-Proxy, Get-Routes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Multiple Functions to get various Windows system information | |
| # Get-DNSServers, Get-DNS, Get-Gateway, Get-GW, Get-IP, Get-SubnetMask, Get-MACAddress, Get-MAC, Get-UpTime, Get-DiskSpace, Get-MappedDrives, Test-Gateway, Test-GW, Get-FreeSpace, Get-Proxy, Show-Proxy, Get-Routes | |
| # Version: 1.1.4 | |
| function Get-DNSServers { | |
| <# | |
| .SYNOPSIS | |
| Gets DNS server addresses configured on the system. | |
| .DESCRIPTION | |
| Returns DNS server addresses configured on the system, optionally filtered by interface alias, IPv4 only, and status. | |
| .PARAMETER All | |
| If specified, returns all DNS server addresses with their interface aliases and address families. | |
| .PARAMETER InterfaceAlias | |
| If specified, filters the results to only include DNS servers for the given interface alias. | |
| .PARAMETER IPv4Only | |
| If specified, filters the results to only include IPv4 DNS servers. | |
| .PARAMETER Status | |
| Specifies the status of network adapters to filter by (default is 'Up'). Other possible values | |
| include 'Down', 'Disabled', etc. | |
| .EXAMPLE | |
| Get-DNSServers | |
| .EXAMPLE | |
| Get-DNSServers -IPv4Only -Status Up | |
| .NOTES | |
| Author: Tim West | |
| Version: 1.0 | |
| Status: Production | |
| Created: 11/11/2025 | |
| Updated: 13/11/2025 | |
| .CHANGELOG | |
| - Initial creation of the function to retrieve DNS server addresses with filtering options. | |
| #> | |
| [cmdletBinding()] | |
| Param( | |
| [Parameter(Mandatory=$false)] | |
| [switch]$All, | |
| [Parameter(Mandatory=$false)] | |
| [string]$InterfaceAlias, | |
| [Parameter(Mandatory=$false)] | |
| [switch]$IPv4Only, | |
| [Parameter(Mandatory=$false)] | |
| [ValidateSet('Up', 'Down', 'Disabled', 'Disconnected', 'NotPresent', 'LowerLayerDown')] | |
| [string]$Status = 'Up' | |
| ) | |
| $dnsServers = Get-DnsClientServerAddress | Where-Object { | |
| $_.InterfaceAlias -notlike "Loopback*" -and | |
| $_.InterfaceAlias -notlike "Bluetooth*" | |
| } | |
| # Get enabled adapters only | |
| $enabledAdapters = Get-NetAdapter | Where-Object {$_.Status -eq $Status} | Select-Object -ExpandProperty Name | |
| # Filter to enabled adapters | |
| $dnsServers = $dnsServers | Where-Object {$enabledAdapters -contains $_.InterfaceAlias} | |
| # Apply IPv4 filter if requested | |
| if ($IPv4Only) { | |
| $dnsServers = $dnsServers | Where-Object {$_.AddressFamily -eq 2} | |
| } | |
| # Apply interface filter if specified | |
| if ($InterfaceAlias) { | |
| $dnsServers = $dnsServers | Where-Object {$_.InterfaceAlias -eq $InterfaceAlias} | |
| } | |
| if ($All) { | |
| return ($dnsServers | Select-Object InterfaceAlias, AddressFamily, ServerAddresses | Sort-Object InterfaceAlias) | |
| } | |
| else { | |
| return ($dnsServers | Select-Object -ExpandProperty ServerAddresses | Sort-Object -Unique) | |
| } | |
| } | |
| function Get-DNS{ | |
| # Alias Function Get-DNS to Get-DNSServers coz I'm/You're lazy ;-) | |
| Get-DNSServers @PSBoundParameters | |
| } | |
| function Get-Gateway { | |
| <# | |
| .SYNOPSIS | |
| Gets the default gateway address. | |
| .DESCRIPTION | |
| Returns the default gateway address used for routing traffic to external networks. | |
| .EXAMPLE | |
| Get-Gateway | |
| .NOTES | |
| Author: Tim West | |
| Version: 1.0 | |
| Status: Production | |
| Created: 11/11/2025 | |
| Updated: 13/11/2025 | |
| #> | |
| [CmdletBinding()] | |
| param() | |
| return (Get-NetRoute -DestinationPrefix "0.0.0.0/0").NextHop | |
| } | |
| function Get-GW { | |
| # Alias Function for the lazy/disallusioned among us ;-) | |
| Get-Gateway @PSBoundParameters | |
| } | |
| function Get-IP { | |
| <# | |
| .SYNOPSIS | |
| Gets IP addresses configured on the system. | |
| .DESCRIPTION | |
| Returns IP addresses configured on the system, optionally filtered by interface alias, IPv6 addresses, | |
| and address state. | |
| .PARAMETER InterfaceAlias | |
| If specified, filters the results to only include IP addresses for the given interface alias. | |
| .PARAMETER IpV6Too | |
| If specified, includes IPv6 addresses in the results. | |
| .PARAMETER All | |
| If specified, returns all IP addresses with their interface aliases and address families. | |
| .EXAMPLE | |
| Get-IP | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Updated: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| #> | |
| [CmdletBinding()] | |
| Param( | |
| [Parameter(Mandatory=$false)] | |
| [string]$InterfaceAlias, | |
| [Parameter(Mandatory=$false)] | |
| [switch]$IpV6Too, | |
| [Parameter(Mandatory=$false)] | |
| [switch]$All | |
| ) | |
| if($All){ | |
| return (Get-NetIPAddress | Select-Object InterfaceAlias,AddressFamily,IPAddress,PrefixOrigin,AddressState | Format-Table -AutoSize) | |
| } | |
| elseif($IpV6Too){ | |
| return (Get-NetIPAddress | Where-Object {$_.AddressFamily -eq 'IPv4' -or $_.AddressFamily -eq 'IPv6' -and $_.IPAddress -ne '127.0.0.1' -and $_.IPAddress -ne '::1' -and $_.AddressState -eq 'Preferred'} | | |
| Select-Object InterfaceAlias,IPAddress,PrefixOrigin,AddressState | Format-Table -AutoSize) | |
| } | |
| elseif($InterfaceAlias){ | |
| return (Get-NetIPAddress -InterfaceAlias $InterfaceAlias | Select-Object InterfaceAlias,IPAddress,PrefixOrigin,AddressState | Format-Table -AutoSize) | |
| } | |
| else{ | |
| return ((Get-NetIPAddress | Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.IPAddress -ne '127.0.0.1' -and $_.AddressState -eq 'Preferred'} | | |
| Select-Object InterfaceAlias,IPAddress,PrefixOrigin,AddressState).IPAddress) | |
| } | |
| } | |
| function Get-SubnetMask { | |
| <# | |
| .SYNOPSIS | |
| Gets subnet masks for network adapters. Displays as CIDR prefix length and dotted decimal | |
| .DESCRIPTION | |
| Returns subnet masks for network adapters on the system. By default, returns only subnet masks | |
| for adapters with 'Up' status. Use -All switch to return all adapters with their names and status. | |
| .PARAMETER All | |
| If specified, returns all network adapters with their names, subnet masks, and status. | |
| .PARAMETER Status | |
| Specifies the status of network adapters to filter by (default is 'Up'). Possible values include | |
| 'Up', 'Down', 'Disabled', 'Disconnected', 'NotPresent', or 'LowerLayerDown'. | |
| .EXAMPLE | |
| Get-SubnetMask | |
| .EXAMPLE | |
| Get-SubnetMask -All | |
| .EXAMPLE | |
| Get-SubnetMask -Status Down | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Updated: 22/01/2026 | |
| Status: Production | |
| Version: 1.1 | |
| .CHANGELOG | |
| 1.0 - Initial version | |
| 1.1 - Fixed to properly display both CIDR and dotted decimal notation | |
| #> | |
| [CmdletBinding()] | |
| Param( | |
| [Parameter(Mandatory=$false)] | |
| [switch]$All, | |
| [Parameter(Mandatory=$false)] | |
| [ValidateSet('Up', 'Down', 'Disabled', 'Disconnected', 'NotPresent', 'LowerLayerDown')] | |
| [string]$Status = "Up" | |
| ) | |
| # Convert PrefixLength to Subnet Mask | |
| function Convert-PrefixLengthToSubnetMask { | |
| param ( | |
| [int]$PrefixLength | |
| ) | |
| $mask = [uint32]0 | |
| for ($i = 0; $i -lt $PrefixLength; $i++) { | |
| $mask = $mask -bor (1 -shl (31 - $i)) | |
| } | |
| $byte1 = ($mask -shr 24) -band 0xFF | |
| $byte2 = ($mask -shr 16) -band 0xFF | |
| $byte3 = ($mask -shr 8) -band 0xFF | |
| $byte4 = $mask -band 0xFF | |
| return "$byte1.$byte2.$byte3.$byte4" | |
| } | |
| if($All){ | |
| $ipAddresses = Get-NetIPAddress | |
| } | |
| else{ | |
| $ipAddresses = Get-NetIPAddress | Where-Object {$_.AddressState -eq 'Preferred'} | |
| } | |
| $results = $ipAddresses | ForEach-Object { | |
| $subnetMask = Convert-PrefixLengthToSubnetMask -PrefixLength $_.PrefixLength | |
| [PSCustomObject]@{ | |
| InterfaceAlias = $_.InterfaceAlias | |
| IPAddress = $_.IPAddress | |
| CIDR = "/$($_.PrefixLength)" | |
| SubnetMask = $subnetMask | |
| AddressFamily = $_.AddressFamily | |
| AddressState = $_.AddressState | |
| } | |
| } | |
| return $results | Sort-Object InterfaceAlias| Format-Table -AutoSize | |
| } | |
| function Get-MACAddress { | |
| <# | |
| .SYNOPSIS | |
| Gets MAC addresses for network adapters. | |
| .DESCRIPTION | |
| Returns MAC addresses for network adapters on the system. By default, returns only MAC addresses | |
| for adapters with 'Up' status. Use -All switch to return all adapters with their names and status. | |
| .PARAMETER All | |
| If specified, returns all network adapters with their names, MAC addresses, and status. | |
| .PARAMETER Status | |
| Specifies the status of network adapters to filter by (default is 'Up'). Possible values include | |
| 'Up', 'Down', 'Disabled', 'Disconnected', 'NotPresent', or 'LowerLayerDown'. | |
| .EXAMPLE | |
| Get-MACAddress | |
| .EXAMPLE | |
| Get-MACAddress -All | |
| .EXAMPLE | |
| Get-MACAddress -Status Down | |
| .NOTES | |
| Author: Tim West | |
| Created: 11/11/2025 | |
| Updated: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| #> | |
| [CmdletBinding()] | |
| Param( | |
| [Parameter(Mandatory=$false)] | |
| [switch]$All, | |
| [Parameter(Mandatory=$false)] | |
| [ValidateSet('Up', 'Down', 'Disabled', 'Disconnected', 'NotPresent', 'LowerLayerDown')] | |
| [string]$Status = "Up" | |
| ) | |
| if($All){ | |
| return (Get-NetAdapter | Select-Object Name, MacAddress, Status) | |
| } | |
| else{ | |
| return (Get-NetAdapter | Where-Object {$_.Status -eq $Status} | Select-Object Name, MacAddress, Status).MacAddress | |
| } | |
| } | |
| function Get-MAC { | |
| # Alias Function Get-MAC to Get-MACAddress coz my/your fingers hurt from all the typing ;-) | |
| Get-MACAddress @PSBoundParameters | |
| } | |
| function Get-UpTime { | |
| <# | |
| .SYNOPSIS | |
| Gets system uptime in formatted string. | |
| .DESCRIPTION | |
| Returns the system uptime since last boot in days.hours:minutes:seconds format. | |
| .EXAMPLE | |
| Get-UpTime | |
| Returns something like "5.12:34:56" for 5 days, 12 hours, 34 minutes, 56 seconds uptime. | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Updated: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| #> | |
| $lastBootTime = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime ; $lastBootTime | |
| $uptimeSpan = New-TimeSpan -Start $lastBootTime -End (Get-Date) | |
| Write-Host -f Green "Days.Hours:Mins:Secs" | |
| return $uptimeSpan.ToString("d\.hh\:mm\:ss") | |
| } | |
| function Get-DiskSpace { | |
| <# | |
| .SYNOPSIS | |
| Gets disk space information for all drives, doesn't look at mount points though | |
| .DESCRIPTION | |
| Returns disk space information for all drives, including free space and total space in GB. | |
| .PARAMETER FreeSpace | |
| If specified, only returns free space for each drive. | |
| .EXAMPLE | |
| Get-DiskSpace | |
| .EXAMPLE | |
| Get-DiskSpace -FreeSpaceOnly -Drives C,X | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Updated: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| #> | |
| [CmdletBinding()] | |
| param( | |
| [Parameter(Mandatory=$false)] | |
| [switch]$FreeSpaceOnly, | |
| [Parameter(Mandatory=$false)] | |
| [ValidateSet('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z')] | |
| [string[]]$Drives | |
| ) | |
| if ($Drives) { | |
| $drivesToProcess = Get-PSDrive -PSProvider FileSystem | Where-Object { $Drives -contains $_.Name } | |
| } else { | |
| $drivesToProcess = Get-PSDrive -PSProvider FileSystem | |
| } | |
| if ($drivesToProcess.Count -eq 0) { | |
| Write-Host "No drives found." -ForegroundColor Yellow | |
| return | |
| } | |
| $drivesToProcess | ForEach-Object { | |
| $drive = $_ | |
| $freeSpaceGB = [math]::Round($drive.Free / 1GB, 2) | |
| $totalSpaceGB = [math]::Round(($drive.Used + $drive.Free) / 1GB, 2) | |
| if ($freeSpaceGB -lt 5) { | |
| if($FreeSpaceOnly){ | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB" -ForegroundColor Red | |
| } | |
| else{ | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB, Total Space: $totalSpaceGB GB" -ForegroundColor Red | |
| } | |
| } | |
| elseif ($freeSpaceGB -lt 10) { | |
| if($FreeSpaceOnly){ | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB" -ForegroundColor Yellow | |
| } | |
| else { | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB, Total Space: $totalSpaceGB GB" -ForegroundColor Yellow | |
| } | |
| } | |
| else { | |
| if($FreeSpaceOnly){ | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB" -ForegroundColor Green | |
| } | |
| else { | |
| Write-Host "Drive: $($drive.Name) - Free Space: $freeSpaceGB GB, Total Space: $totalSpaceGB GB" -ForegroundColor Green | |
| } | |
| } | |
| } | |
| } | |
| function Get-MappedDrives { | |
| <# | |
| .SYNOPSIS | |
| Gets mapped network drives. | |
| .DESCRIPTION | |
| Returns a list of mapped network drives with their names and paths. | |
| .PARAMETER UseWMI | |
| If specified, uses WMI to retrieve mapped drives instead of PowerShell drives. | |
| .EXAMPLE | |
| Get-MappedDrives | |
| .EXAMPLE | |
| Get-MappedDrives -UseWMI | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| #> | |
| [CmdletBinding()] | |
| param( | |
| [Parameter(Mandatory=$false)] | |
| [switch]$UseWMI | |
| ) | |
| if($UseWMI){ | |
| $mappedDrives = Get-WmiObject -Class Win32_NetworkConnection | Select-Object Name, RemoteName | |
| if ($mappedDrives) { | |
| $mappedDrives | ForEach-Object { | |
| return "Drive: $($_.Name) - Path: $($_.RemoteName)" | |
| } | |
| } else { | |
| Write-Host "No mapped drives found." | |
| } | |
| } else { | |
| $mappedDrives = Get-PSDrive -PSProvider FileSystem | Where-Object { | |
| $_.DisplayRoot -like "\\*" | |
| } | Select-Object Name, DisplayRoot | |
| if ($mappedDrives) { | |
| $mappedDrives | ForEach-Object { | |
| return "$($_.Name): $($_.DisplayRoot)" | |
| } | |
| } else { | |
| Write-Host "No mapped drives found." | |
| } | |
| } | |
| } | |
| function Test-Gateway { | |
| <# | |
| .SYNOPSIS | |
| Tests connectivity to the default gateway. | |
| .DESCRIPTION | |
| Pings the default gateway to check if it is reachable. | |
| .EXAMPLE | |
| Test-Gateway | |
| .NOTES | |
| Author: Tim West | |
| Created: 13/11/2025 | |
| Updated: 13/11/2025 | |
| Status: Production | |
| Version: 1.0 | |
| .CHANGELOG | |
| - Initial creation of the function to test connectivity to the default gateway. | |
| #> | |
| [CmdletBinding()] | |
| param() | |
| $gateway = Get-Gateway | |
| if ($gateway) { | |
| Write-Host "Pinging default gateway: $gateway" | |
| $pingResult = Test-Connection -ComputerName $gateway -Count 1 -ErrorAction SilentlyContinue | |
| if ($pingResult) { | |
| Write-Host "Gateway is reachable." -ForegroundColor Green | |
| } else { | |
| Write-Host "Gateway is not reachable." -ForegroundColor Red | |
| } | |
| } else { | |
| Write-Host "No default gateway found." -ForegroundColor Yellow | |
| } | |
| } | |
| function Test-GW { | |
| # Alias Function Test-GW to Test-Gateway coz my/your fingers hurt from all the typing plus one of us is lazy ;-) | |
| Test-Gateway @PSBoundParameters | |
| } | |
| function Get-FreeSpace { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true)] | |
| [string]$DriveLetter | |
| ) | |
| $ENV:COMPUTERNAME | |
| if($DriveLetter){ | |
| Get-PSDrive | Where-Object { $_.Provider -like "*FileSystem" -and $_.Name -eq $DriveLetter } | Select-Object Name, | |
| @{Name="Free(GB)"; Expression = { [math]::Round(($_.Free / 1GB), 1) }}, | |
| @{Name="Used(GB)"; Expression = { [math]::Round(($_.Used / 1GB), 1) }}, Root | |
| } | |
| else{ | |
| Get-PSDrive | Where-Object { $_.Provider -like "*FileSystem" } | Select-Object Name, | |
| @{Name="Free(GB)"; Expression = { [math]::Round(($_.Free / 1GB), 1) }}, | |
| @{Name="Used(GB)"; Expression = { [math]::Round(($_.Used / 1GB), 1) }}, Root | |
| } | |
| } | |
| function Get-Proxy { | |
| netsh winhttp show proxy | |
| } | |
| function Show-Proxy { | |
| Get-Proxy @PSBoundParameters | |
| } | |
| function Get-Routes { | |
| <# | |
| .SYNOPSIS | |
| Gets the system's routing table. | |
| .DESCRIPTION | |
| Returns the system's routing table, displaying destination prefixes, next hops, interface indices, and metrics. | |
| .PARAMETER ShowIPv6 | |
| Optionally includes IPv6 routes if specified. | |
| .EXAMPLE | |
| Get-Routes | |
| .NOTES | |
| Author: Tim West | |
| Created: 22/01/2026 | |
| Updated: 22/01/2026 | |
| Status: Production | |
| Version: 1.0.1 | |
| #> | |
| [CmdletBinding()] | |
| param( | |
| [switch]$ShowIPv6 = $false, | |
| [string]$FindString | |
| ) | |
| if(-not ($ShowIPv6)){ | |
| if($FindString){ | |
| return (Get-NetRoute | Select-Object DestinationPrefix, NextHop, InterfaceIndex, RouteMetric, ifMetric | Where-Object {$_.DestinationPrefix -notlike "*:*" -and $_.DestinationPrefix -like "*$FindString*"} | Sort RouteMetric | Format-Table -AutoSize) | |
| Write-Host -f Green "`nOr Old School Route Print:" | |
| cmd /c route print | Select-String -notmatch ":" | Select-String -pattern $FindString | |
| } | |
| else{ | |
| Write-Host -f Green "Not Showing IPv6. If required use -ShowIPv6" | |
| return (Get-NetRoute | Select-Object DestinationPrefix, NextHop, InterfaceIndex, RouteMetric, ifMetric | Where-Object {$_.DestinationPrefix -notlike "*:*"} | Sort RouteMetric | Format-Table -AutoSize) | |
| Write-Host -f Green "`nOr Old School Route Print:" | |
| cmd /c route print | Select-String -notmatch ":" | |
| } | |
| } | |
| else{ | |
| if($FindString){ | |
| return (Get-NetRoute | Select-Object DestinationPrefix, NextHop, InterfaceIndex, RouteMetric, ifMetric | Where-Object {$_.DestinationPrefix -like "*$FindString*"} | Sort RouteMetric | Format-Table -AutoSize) | |
| Write-Host -f Green "`nOr Old School Route Print:" | |
| cmd /c route print | Select-String -notmatch ":" | Select-String -pattern $FindString | |
| } | |
| else{ | |
| return (Get-NetRoute | Select-Object DestinationPrefix, NextHop, InterfaceIndex, RouteMetric, ifMetric | Sort RouteMetric | Format-Table -AutoSize) | |
| Write-Host -f Green "`nOr Old School Route Print:" | |
| cmd /c route print | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment