Wi-Fi 連線腳本

  • 16
  • 0

因為有在使用類似 Wox,所以想著寫個腳本自動連向指定的 Wi-Fi 應該會很方便吧?沒想到轉成指令的過程花了不少時間就來筆記一下。

先總結一下,打開 Wi-Fi 從底層算起會涉汲三個東西

  1. 啟用/關閉 Wi-Fi 網卡
  2. 打開/關閉 Wi-Fi 無線功能
  3. 連接/斷開 指定連線

每一層的前一底層未開啟,都會讓當前的功能失效。

網路很多舊文章在講如何停用 Wi-Fi 主要都透過關閉網卡(第一層),應該是比較早期的運作方式。現在一般操作已經不去開關網卡了,不用關閉也可以開關 Wi-Fi 無線功能(第二層),我主要是卡關在第二層的控制指令找不到。

打開 Wi-Fi 功能

 

因為在日常連線 Wi-Fi 是不會去更動網卡的,在假設 Wi-Fi 網卡已設定好的狀況下,只需要執行 1.打開 Wi-Fi 無線功能 2.連接指定連線 就可以完成我的需求了

powershell Set-NetAdapterAdvancedProperty -Name "Wi-Fi" -AllProperties -RegistryKeyword "SoftwareRadioOff" -RegistryValue "0"
netsh wlan connect name="my profile name(ssid)"

指令是寫在 .bat 檔的 cmd 語法,第一行是打開 Wi-Fi 無線功能,是透過 PowerShell 模組功能實現的,需要有 Administrator 權限。第二行指定 profile 進行連線(通常 profile name = SSID) 的 Wi-Fi,可以用一般權限來執行,用雙引號括住無可以輸入有空格的 profile name 了。

這裡沒有輸入 Wi-Fi 密碼,因為情境設定在這之前已經連過該 Wi-Fi 並記住密碼了。

順利沒踩坑的話,看到這裡就夠用了。

遇到的坑

關於 netsh wlan connect 指令在某些版本的 Windows 遇到含空白的 profile name 會跳錯 Function WlanGetProfile returns error 1168:Element not found.,很不巧被我遇到了,有兩個可以暫時繞過的方法

  1. 去改 Wi-Fi 的 SSID
  2. 建一個沒有空白的 profile

我選擇匯出 profile xml 檔,修改成沒有空白的 name 再匯入成另一個 profile。指令匯入 profile

netsh wlan export profile name="Coffee Wifi 5Ghz" folder="D:\MyWifi"

"Coffee Wifi 5Ghz" 可以換成任何 Windows Wi-Fi UI 打開來看到的可用連線名稱,會匯出成 Wi-Fi-Coffee Wifi 5Ghz.xml 在 MyWifi 資料夾內,如果已連線過並記憶密碼,這個 profile 也包含密碼(已加密)。

修改 xml,WLANProfile > name 改成沒有空白的 name,例如 Coffee_Wifi_5Ghz,再匯入 profile xml 檔

netsh wlan add profile filename="D:\MyWifi\Wi-Fi-Coffee Wifi 5Ghz.xml"

這時再看 Wi-Fi 可用連線名稱就會看到 Coffee_Wifi_5Ghz,它的連線內容和 Coffee Wifi 5Ghz 是一樣的,改用新的 profile name 來繞過 Windows Bug。

開關 Wi-Fi

開關 Wi-Fi 無線功能的指令很難搜尋,因為一開始不知道合適的關鍵字,搜尋結果大多是開關更底層的 Wi-Fi 網卡。而一旦關閉(disable) Wi-Fi 網卡,整個 Wi-Fi 無線功能就會從功能列快捷選單消失,再開啟網卡 Wi-Fi 無線功能也不會自動開啟,Wi-Fi 無線功能沒開啟,連線指令也無法運作。

後來在 Stack Overflow(連結) 找到一篇相關的討論,討論裡使用的則是 RadioEnable 看起來蠻像的,可惜實際跑起來沒作用,但也給了我找解的方向。用 PowerShell Get-NetAdapterAdvancedProperty 模組比對 Wi-Fi 無線功能開關前後的參數變化,找到了幾個可能可以用的參數

powershell Get-NetAdapterAdvancedProperty -Name "Wi-Fi" -AllProperties

其中 SoftwareRadioOff 實測確實可以順利開關 Wi-Fi 無線功能。而 RadioEnable 在其它地方(連結)看到有可能曾經在 .NET Core 的時代有作用,到 .NET 5 時移除 WinRT 支援就失效了(這段超出我的程度了,不清楚在說什麼)

以後關鍵字應該會下 Wi-Fi Radio turn on

參考資料

https://www.windowscentral.com/how-connect-wi-fi-network-windows-10

https://stackoverflow.com/questions/43486244/how-to-switch-wifi-state-on-off-with-powershell-windows-10