The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何查詢目前 Windows 電腦曾經連線過的 WiFi 密碼

有時候想在一個陌生環境透過 WiFi 連網,但是自己的電腦卻沒設定過,雖然隔壁的那台電腦已經設定好連線,但卻沒有人記得 WiFi 密碼是多少,這時該怎麼辦呢?原來 Windows 可以透過 netsh wlan 命令查詢出之前輸入過的密碼。

查詢目前電腦內有多少 WiFi 連線

你可以先透過以下命令找出所有 WiFi 連線,像我的筆電就曾經設定過兩百多條連線:

netsh wlan show profile

其輸出內容範例如下:

介面 Wi-Fi 上的設定檔:

群組原則設定檔 (唯讀)
---------------------------------
    <無>

使用者設定檔
-------------
    所有使用者設定檔 : Stockw
    所有使用者設定檔 : Eddies2
    所有使用者設定檔 : UPC5848620
    所有使用者設定檔 : 0505
    所有使用者設定檔 : 346128216197513
    ...
    ...

查詢特定 WiFi 連線的密碼

我們以 Stockw 為例,你可以輸入以下命令:

netsh wlan show profile name="Stockw" key=clear

你會得到以下結果,其中 金鑰內容 (Key Content) 這個欄位就是 WiFi 的明文密碼

介面 Wi-Fi 上的設定檔 Stockw:
=======================================================================

已套用: 所有使用者設定檔

設定檔資訊
-------------------
    版本                   : 1
    類型                   : 無線區域網路
    名稱                   : Stockw
    控制選項        :
        連線模式           : 自動連線
        網路廣播           : 只有此網路正在廣播時才連線
        AutoSwitch         :不切換到其他網路
        MAC 隨機化         :已停用

連線設定
---------------------
    SSID 數目              : 1
    SSID 名稱              : "Stockw"
    網路類型               : 基礎結構
    無線電波類型           : [ 任何無線電波類型 ]
    廠商擴充                  : 不存在

安全性設定
-----------------
    驗證                   : WPA2-Personal
    加密方式               : CCMP
    驗證                   : WPA2-Personal
    加密方式               : GCMP
    安全性金鑰             : 現在
    金鑰內容               : stck1234

成本設定
-------------
    成本                   : 不受限制
    壅塞                   : 否
    接近資料限制           : 否
    超過資料限制           : 否
    漫遊                   : 否
    成本來源               : 預設值

如果你用 WSL 的話,也可以透過以下命令直接查出密碼:

netsh wlan show profile name="Stockw" key=clear | wsl grep "Key Content" | wsl cut -d ':' -f 2 | wsl sed "s/^[ \t]*//"

這裡有個地方我覺得很神奇,就是我直接執行 netsh wlan 命令,輸出的訊息為中文,但我如果將其內容 pipe 給 wsl 之後,其訊息竟然會變成英文,我不太能理解背後的原理為何。

匯出 WiFi 連線設定檔

你可以先建立一個資料夾,並透過以下命令將所有密碼匯出,基本上一個 WiFi 連線資訊就會書出一個 *.xml 檔案:

mkdir g:\wifipw
cd /d g:\wifipw
netsh wlan export profile key=clear name="Stockw"

我們以 Wi-Fi-Stockw.xml 為例,其內容如下,密碼就在 <keyMaterial> 標籤內容中:

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
  <name>Stockw</name>
  <SSIDConfig>
    <SSID>
      <hex>53746F636B7765726B</hex>
      <name>Stockw</name>
    </SSID>
  </SSIDConfig>
  <connectionType>ESS</connectionType>
  <connectionMode>auto</connectionMode>
  <MSM>
    <security>
      <authEncryption>
        <authentication>WPA2PSK</authentication>
        <encryption>AES</encryption>
        <useOneX>false</useOneX>
      </authEncryption>
      <sharedKey>
        <keyType>passPhrase</keyType>
        <protected>false</protected>
        <keyMaterial>stck1234</keyMaterial>
      </sharedKey>
    </security>
  </MSM>
  <MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
    <enableRandomization>false</enableRandomization>
    <randomizationSeed>2263576210</randomizationSeed>
  </MacRandomization>
</WLANProfile>

你也可以透過 netsh wlan export profile key=clear 匯出所有 WiFi 連線設定檔,匯出成一堆 *.xml 檔案之後,可以透過以下 PowerShell 命令直接輸出所有 WiFi 連線的密碼!

dir *.xml |% {
  $xml=[xml] (get-content $_)
  if ($xml.WLANProfile.MSM.Security.sharedKey.keymaterial) {
    Echo "$($xml.WLANProfile.SSIDConfig.SSID.name)`t$($xml.WLANProfile.MSM.Security.sharedKey.keyMaterial)"
  }
}

匯入 WiFi 連線設定檔

當你透過 netsh wlan export profile key=clear 取得 WiFi 連線設定檔後,也可以透過以下命令加回去:

netsh wlan add profile filename="g:\wifipw\Wi-Fi-Stockw.xml"

由於之前匯出的 WiFi 連線設定檔已經內含明文的密碼,因此匯入之後馬上可以連線!👍

刪除用不到的 WiFi 連線設定檔

使用以下命令就可以刪除特定 WiFi 連線設定檔:

netsh wlan delete profile name="Stockw"

相關連結