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

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/297147c70694ec9b6172-72214568-be4ab400-353f-11ea-9ea6-2ed3fcc09c85.png)

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

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

```bash
netsh wlan show profile
```

其輸出內容範例如下：

```
介面 Wi-Fi 上的設定檔:

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

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

### 查詢特定 WiFi 連線的密碼

我們以 `Stockw` 為例，你可以輸入以下命令：

```bash
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 的話，也可以透過以下命令直接查出密碼：

```bash
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` 檔案：

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

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

```xml
<?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 連線的密碼！

```powershell
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 連線設定檔後，也可以透過以下命令加回去：

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

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

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

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

```bash
netsh wlan delete profile name="Stockw"
```

### 相關連結

-   [Import Wi-Fi settings for Windows devices in Microsoft Intune - Azure | Microsoft Docs](https://learn.microsoft.com/en-us/intune/intune-service/configuration/wi-fi-settings-import-windows-8-1)
-   [Export all Windows Wifi profiles (SSID, password) in XML](https://gist.github.com/dolmen/864551/6253489d7d7c823ba1ff027b83d47344ef3b42c8)
