1
1
using System ;
2
2
using System . Collections . Generic ;
3
- using System . Collections . ObjectModel ;
3
+ using System . Diagnostics ;
4
4
using System . Linq ;
5
- using System . Management . Automation ;
6
5
using System . Threading . Tasks ;
7
6
using Windows . Devices . WiFi ;
8
7
using Windows . Networking . Connectivity ;
9
8
using Windows . Security . Credentials ;
9
+ using log4net ;
10
10
11
11
//https://docs.microsoft.com/en-us/uwp/api/windows.devices.wifi.wifiadapter.requestaccessasync
12
12
//var access = await WiFiAdapter.RequestAccessAsync() == WiFiAccessStatus.Allowed;
@@ -18,6 +18,8 @@ namespace NETworkManager.Models.Network;
18
18
/// </summary>
19
19
public static class WiFi
20
20
{
21
+ private static readonly ILog Log = LogManager . GetLogger ( typeof ( WiFi ) ) ;
22
+
21
23
/// <summary>
22
24
/// Get all WiFi adapters async with additional information from <see cref="NetworkInterface"/>.
23
25
/// </summary>
@@ -26,29 +28,39 @@ public static async Task<List<WiFiAdapterInfo>> GetAdapterAsync()
26
28
{
27
29
List < WiFiAdapterInfo > wifiAdapterInfos = new ( ) ;
28
30
29
- IReadOnlyList < WiFiAdapter > wifiAdapters = await WiFiAdapter . FindAllAdaptersAsync ( ) ;
31
+ var wifiAdapters = await WiFiAdapter . FindAllAdaptersAsync ( ) ;
30
32
31
- if ( wifiAdapters . Count > 0 )
33
+ if ( wifiAdapters . Count <= 0 )
34
+ return wifiAdapterInfos ;
35
+
36
+ var networkInterfaces = await NetworkInterface . GetNetworkInterfacesAsync ( ) ;
37
+
38
+ foreach ( var wiFiAdapter in wifiAdapters )
32
39
{
33
- List < NetworkInterfaceInfo > networkInterfaces = await NetworkInterface . GetNetworkInterfacesAsync ( ) ;
40
+ var wiFiAdapterId = wiFiAdapter . NetworkAdapter . NetworkAdapterId . ToString ( ) ;
41
+
42
+ var networkInterface = networkInterfaces . FirstOrDefault ( x => x . Id . TrimStart ( '{' ) . TrimEnd ( '}' )
43
+ . Equals ( wiFiAdapterId , StringComparison . OrdinalIgnoreCase ) ) ;
34
44
35
- foreach ( var wifiAdapter in wifiAdapters )
45
+ if ( networkInterface != null )
36
46
{
37
- var networkInteraceInfo = networkInterfaces . FirstOrDefault ( x => x . Id . TrimStart ( '{' ) . TrimEnd ( '}' ) . Equals ( wifiAdapter . NetworkAdapter . NetworkAdapterId . ToString ( ) , StringComparison . OrdinalIgnoreCase ) ) ;
38
-
39
47
wifiAdapterInfos . Add ( new WiFiAdapterInfo
40
48
{
41
- NetworkInterfaceInfo = networkInteraceInfo ,
42
- WiFiAdapter = wifiAdapter
49
+ NetworkInterfaceInfo = networkInterface ,
50
+ WiFiAdapter = wiFiAdapter
43
51
} ) ;
44
52
}
53
+ else
54
+ {
55
+ Log . Warn ( $ "Could not find network interface for WiFi adapter with id: { wiFiAdapterId } ") ;
56
+ }
45
57
}
46
58
47
59
return wifiAdapterInfos ;
48
60
}
49
61
50
62
/// <summary>
51
- /// Get all available WiFi networks for an adapter with additional informations .
63
+ /// Get all available WiFi networks for an adapter with additional information's .
52
64
/// </summary>
53
65
/// <param name="adapter">WiFi adapter as <see cref="WiFiAdapter"/>.</param>
54
66
/// <returns>A report as <see cref="WiFiNetworkScanInfo"/> including a list of <see cref="WiFiNetworkInfo"/>.</returns>
@@ -58,21 +70,16 @@ public static async Task<WiFiNetworkScanInfo> GetNetworksAsync(WiFiAdapter adapt
58
70
await adapter . ScanAsync ( ) ;
59
71
60
72
// Try to get the current connected wifi network of this network adapter
61
- var ( ssid , bssid ) = TryGetConnectedNetworkFromWiFiAdapter ( adapter . NetworkAdapter . NetworkAdapterId . ToString ( ) ) ;
73
+ var ( _ , bssid ) = TryGetConnectedNetworkFromWiFiAdapter ( adapter . NetworkAdapter . NetworkAdapterId . ToString ( ) ) ;
62
74
63
- List < WiFiNetworkInfo > wifiNetworkInfos = new ( ) ;
64
-
65
- foreach ( var availableNetwork in adapter . NetworkReport . AvailableNetworks )
75
+ var wifiNetworkInfos = adapter . NetworkReport . AvailableNetworks . Select ( availableNetwork => new WiFiNetworkInfo
66
76
{
67
- wifiNetworkInfos . Add ( new WiFiNetworkInfo ( )
68
- {
69
- AvailableNetwork = availableNetwork ,
70
- IsHidden = string . IsNullOrEmpty ( availableNetwork . Ssid ) ,
71
- IsConnected = availableNetwork . Bssid . Equals ( bssid , StringComparison . OrdinalIgnoreCase )
72
- } ) ;
73
- }
77
+ AvailableNetwork = availableNetwork ,
78
+ IsHidden = string . IsNullOrEmpty ( availableNetwork . Ssid ) ,
79
+ IsConnected = availableNetwork . Bssid . Equals ( bssid , StringComparison . OrdinalIgnoreCase )
80
+ } ) . ToList ( ) ;
74
81
75
- return new WiFiNetworkScanInfo ( )
82
+ return new WiFiNetworkScanInfo
76
83
{
77
84
NetworkAdapterId = adapter . NetworkAdapter . NetworkAdapterId ,
78
85
WiFiNetworkInfos = wifiNetworkInfos ,
@@ -90,16 +97,17 @@ public static async Task<WiFiNetworkScanInfo> GetNetworksAsync(WiFiAdapter adapt
90
97
/// </summary>
91
98
/// <param name="adapterId">GUID of the WiFi network adapter.</param>
92
99
/// <returns>SSID and BSSID of the connected wifi network. Values are null if not detected.</returns>
100
+ // ReSharper disable once UnusedTupleComponentInReturnValue
93
101
private static ( string SSID , string BSSID ) TryGetConnectedNetworkFromWiFiAdapter ( string adapterId )
94
102
{
95
103
string ssid = null ;
96
104
string bssid = null ;
97
105
98
- using ( System . Management . Automation . PowerShell powerShell = System . Management . Automation . PowerShell . Create ( ) )
106
+ using ( var powerShell = System . Management . Automation . PowerShell . Create ( ) )
99
107
{
100
108
powerShell . AddScript ( "netsh wlan show interfaces" ) ;
101
109
102
- Collection < PSObject > psOutputs = powerShell . Invoke ( ) ;
110
+ var psOutputs = powerShell . Invoke ( ) ;
103
111
104
112
/*
105
113
if (powerShell.Streams.Error.Count > 0) { // Handle error? }
@@ -115,29 +123,30 @@ private static (string SSID, string BSSID) TryGetConnectedNetworkFromWiFiAdapter
115
123
* BSSID : 6a:d7:...
116
124
*/
117
125
118
- bool foundAdapter = false ;
126
+ var foundAdapter = false ;
119
127
120
- foreach ( PSObject outputItem in psOutputs )
128
+ foreach ( var outputItem in psOutputs )
121
129
{
122
130
// Find line with the network adapter id...
123
131
if ( outputItem . ToString ( ) . Contains ( adapterId , StringComparison . OrdinalIgnoreCase ) )
124
132
foundAdapter = true ;
125
133
126
- if ( foundAdapter )
127
- {
128
- // Extract SSID from the line
129
- if ( outputItem . ToString ( ) . Contains ( " SSID " , StringComparison . OrdinalIgnoreCase ) )
130
- ssid = outputItem . ToString ( ) . Split ( ':' ) [ 1 ] . Trim ( ) ;
131
-
132
- // Extract BSSID from the line
133
- if ( outputItem . ToString ( ) . Contains ( " BSSID " , StringComparison . OrdinalIgnoreCase ) )
134
- bssid = outputItem . ToString ( ) . Split ( ':' , 2 ) [ 1 ] . Trim ( ) ;
135
-
136
- // Break if we got the values, otherwise we might overwrite them
137
- // with values from another adapter.
138
- if ( ! string . IsNullOrEmpty ( ssid ) && ! string . IsNullOrEmpty ( bssid ) )
139
- break ;
140
- }
134
+ // ...and skip all lines until we found it.
135
+ if ( ! foundAdapter )
136
+ continue ;
137
+
138
+ // Extract SSID from the line
139
+ if ( outputItem . ToString ( ) . Contains ( " SSID " , StringComparison . OrdinalIgnoreCase ) )
140
+ ssid = outputItem . ToString ( ) . Split ( ':' ) [ 1 ] . Trim ( ) ;
141
+
142
+ // Extract BSSID from the line
143
+ if ( outputItem . ToString ( ) . Contains ( " BSSID " , StringComparison . OrdinalIgnoreCase ) )
144
+ bssid = outputItem . ToString ( ) . Split ( ':' , 2 ) [ 1 ] . Trim ( ) ;
145
+
146
+ // Break if we got the values, otherwise we might overwrite them
147
+ // with values from another adapter.
148
+ if ( ! string . IsNullOrEmpty ( ssid ) && ! string . IsNullOrEmpty ( bssid ) )
149
+ break ;
141
150
}
142
151
}
143
152
@@ -240,7 +249,7 @@ public static async Task<bool> IsWpsAvailable(WiFiAdapter adapter, WiFiAvailable
240
249
/// <returns>WiFi channel like 3 or 48.</returns>
241
250
public static int GetChannelFromChannelFrequency ( int kilohertz )
242
251
{
243
- return ( double ) ConvertChannelFrequencyToGigahertz ( kilohertz ) switch
252
+ return ConvertChannelFrequencyToGigahertz ( kilohertz ) switch
244
253
{
245
254
// 2.4 GHz
246
255
2.412 => 1 ,
@@ -305,7 +314,7 @@ public static bool Is2dot4GHzNetwork(int kilohertz)
305
314
{
306
315
var x = ConvertChannelFrequencyToGigahertz ( kilohertz ) ;
307
316
308
- return x >= 2.412 && x <= 2.472 ;
317
+ return x is >= 2.412 and <= 2.472 ;
309
318
}
310
319
311
320
/// <summary>
@@ -317,14 +326,14 @@ public static bool Is5GHzNetwork(int kilohertz)
317
326
{
318
327
var x = ConvertChannelFrequencyToGigahertz ( kilohertz ) ;
319
328
320
- return x >= 5.180 && x <= 5.825 ;
329
+ return x is >= 5.180 and <= 5.825 ;
321
330
}
322
331
323
332
/// <summary>
324
333
/// Get the human readable network authentication type.
325
334
/// </summary>
326
335
/// <param name="networkAuthenticationType">WiFi network authentication type as <see cref="NetworkAuthenticationType"/>.</param>
327
- /// <returns>Human readable autentication type as string like "Open" or "WPA2 Enterprise".</returns>
336
+ /// <returns>Human readable authentication type as string like "Open" or "WPA2 Enterprise".</returns>
328
337
public static string GetHumanReadableNetworkAuthenticationType ( NetworkAuthenticationType networkAuthenticationType )
329
338
{
330
339
return networkAuthenticationType switch
@@ -337,7 +346,7 @@ public static string GetHumanReadableNetworkAuthenticationType(NetworkAuthentica
337
346
NetworkAuthenticationType . WpaPsk => "WPA PSK" ,
338
347
NetworkAuthenticationType . SharedKey80211 => "WEP" ,
339
348
NetworkAuthenticationType . Ihv => "IHV" ,
340
- NetworkAuthenticationType . Unknown => "Unkown " ,
349
+ NetworkAuthenticationType . Unknown => "Unknown " ,
341
350
NetworkAuthenticationType . None => "-/-" ,
342
351
_ => "-/-" ,
343
352
} ;
@@ -348,7 +357,7 @@ public static string GetHumanReadableNetworkAuthenticationType(NetworkAuthentica
348
357
/// </summary>
349
358
/// <param name="phyKind">WiFi network phy kind as <see cref="WiFiPhyKind"/>.</param>
350
359
/// <returns>Human readable phy kind as string like "802.11g" or "802.11ax".</returns>
351
- public static string GetHumandReadablePhyKind ( WiFiPhyKind phyKind )
360
+ public static string GetHumanReadablePhyKind ( WiFiPhyKind phyKind )
352
361
{
353
362
return phyKind switch
354
363
{
0 commit comments