get-wlans.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
function Get-WLANs {
    [CmdletBinding()]
    param([String]$Interface)

    $wlanapi = Get-Content -Path (Join-Path $PSScriptRoot "wlanapi.cs") -Raw
    Add-Type -TypeDefinition "$wlanapi"

    $phytypehash = @{
        0  = "UNKNOWN";
        1  = "FHSS";
        2  = "DSSS";
        3  = "IRBASEBAND";
        4  = "OFDM";
        5  = "HR-DSSS";
        6  = "ERP";
        7  = "HT";
        8  = "VHT";
        9  = "DMG";
        10 = "HE";
    }

    $freqchannelhash = @{
        2412 = "1";
        2417 = "2";
        2422 = "3";
        2427 = "4";
        2432 = "5";
        2437 = "6";
        2442 = "7";
        2447 = "8";
        2452 = "9";
        2457 = "10";
        2462 = "11";
        2467 = "12";
        2472 = "13";
        2484 = "14";
        5160 = "32";
        5170 = "34";
        5180 = "36";
        5190 = "38";
        5200 = "40";
        5210 = "42";
        5220 = "44";
        5230 = "46";
        5240 = "48";
        5250 = "50";
        5260 = "52";
        5270 = "54";
        5280 = "56";
        5290 = "58";
        5300 = "60";
        5310 = "62";
        5320 = "64";
        5340 = "68";
        5480 = "96";
        5500 = "100";
        5510 = "102";
        5520 = "104";
        5530 = "106";
        5540 = "108";
        5550 = "110";
        5560 = "112";
        5570 = "114";
        5580 = "116";
        5590 = "118";
        5600 = "120";
        5610 = "122";
        5620 = "124";
        5630 = "126";
        5640 = "128";
        5660 = "132";
        5670 = "134";
        5680 = "136";
        5700 = "140";
        5710 = "142";
        5720 = "144";
        5745 = "149";
        5755 = "151";
        5765 = "153";
        5775 = "155";
        5785 = "157";
        5795 = "159";
        5805 = "161";
        5825 = "165";
        5845 = "169";
        5865 = "173";
        4915 = "183";
        4920 = "184";
        4925 = "185";
        4935 = "187";
        4940 = "188";
        4945 = "189";
        4960 = "192";
        4980 = "196";
    }

    function Convert-dot11SSID {
        [CmdletBinding()] Param (
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)] $ssid
        )
        [System.Text.Encoding]::UTF8.GetString($ssid) -replace '\x00'
    }

    function Convert-dot11BSSID {
        [CmdletBinding()] Param (
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)] $bssid
        )
        $bssid = [System.BitConverter]::ToString($bssid).Replace("-", ":")
        if ($connectedbssid -eq $bssid) {
            $bssid = "$($bssid)(*)"
        }
        $bssid
    }

    $wlanClient = New-Object NativeWifi.WlanClient
  
    $connectedbssid = $wlanClient.Interfaces | 
    ForEach-Object {
        $_.CurrentConnection.wlanAssociationAttributes._dot11Bssid  
    }

    if ($connectedbssid) {
        $connectedbssid = [System.BitConverter]::ToString($connectedbssid).Replace("-", ":")
    }
    
    if ($Interface) {
        $iface = $WlanClient.Interfaces | Where-Object {$_.InterfaceName -eq $Interface}
        $ifaces = ($WlanClient.Interfaces | Select-Object -ExpandProperty 'InterfaceName') -join ', '
        if (-Not $iface) {
            Write-Host "$($Interface) not found. did you mean one of these? $($ifaces)"
            Break
        }
    } else {
        $iface = $WlanClient.Interfaces[0]
    }

    if ($PSBoundParameters['Verbose']) {
        Write-Host "Starting scan() on $($iface.InterfaceName) ($($iface.InterfaceGuid))"
    }

    $iface.Scan()
    
    Start-Sleep -s 4
    function ParseNetworkBssList {
        [CmdletBinding()] Param (
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)] $NetworkBssList
        )
        $NetworkBssList | Select-Object `
        @{Name = "SSID"; Expression = { (Convert-dot11SSID -ssid $_.dot11ssid.SSID) } }, `
        @{Name = "BSSID"; Expression = { (Convert-dot11BSSID -bssid $_.dot11bssid) } }, `
        @{Name = "RSSI"; Expression = { $_.rssi } }, `
        @{Name = "QUALITY"; Expression = { $_.linkQuality } }, `
        @{Name = "FREQ"; Expression = { $_.chCenterFrequency / 1000 } }, `
        @{Name = "CHANNEL"; Expression = { $freqchannelhash[[int]($_.chCenterFrequency / 1000)] } }, `
        @{Name = "PHY"; Expression = { $phytypehash[[int]$_.dot11BssPhyType] } }, `
        @{Name = "CAPABILITY"; Expression = { '0x{0:x4}' -f $_.capabilityInformation } }, `
        @{Name = "IESIZE"; Expression = { $_.ieSize } }
    }

    function GetNetworkBssList {
        ParseNetworkBssList($iface.GetNetworkBssList())
    }

    GetNetworkBssList
}