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

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"

相關連結