通过 XML 文件和 netsh wlan(或 Python)更改 wifi 配置文件的密码

Change a wifi profile's password through XML file and netsh wlan (or Python)

我试试win.10下netsh wlan的乐趣。所以基本上:

  1. 我有一个名为 virgin.xml 的 XML 文件,您可以猜猜它是“处女”。文件:
<?xml version='1.0' encoding='utf-8'?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1" 
                 xmlns:ns1="http://www.microsoft.com/networking/WLAN/profile/v3">
    <name>HERE THE NAME IS EMPTY, THIS IS WHY THE FILE IS CALLED "VIRGIN"</name>
    <SSIDConfig>
        <SSID>
            <name>ALSO HERE</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>THE PASSWORD IS ALSO EMPTY</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
    <ns1:MacRandomization>
        <ns1:enableRandomization>false</ns1:enableRandomization>
    </ns1:MacRandomization>
</WLANProfile>

然后使用脚本修改文件以输入我的 wifi 名称(此处为 antigon)和密码。所以现在我的“virgin.xml”不再是处女了,它是一个经典的 wifi 配置文件XML,里面有一个名字和一个密码。

  1. netsh wlan add profile filename = "C:\virgin.xml" 从 XML 文件中添加配置文件

  2. 我添加了一个配置文件,但是如果我添加了 netsh wlan show profiles,则没有“原始”配置文件。我推断它创建了一个配置文件,其中包含 XML 文件中指示的 wifi 名称,antigon。已经有一个叫做 antigon 的,基本的,因为它是我的 wifi,所以我已经连接上了,当我查看配置文件时,仍然只有一个 antigon。结论是因为我没有收到错误消息:它使用 XML 文件中给出的 those 修改了已经存在的 antigon 配置文件的信息,其中包括密码 (也许是这个有一点我错了)

  3. 我根据网站上给出的语法 netsh wlan connectnetsh wlan connect ssid = YOURSSID name = PROFILENAME 连接到提供名称和配置文件的 wifi 网络(以便它获取密码).所以对我来说:netsh wlan connect ssid = antigon name = antigon

  4. “连接请求成功”,连接我

  5. 我把XML文件里的密码改成一个假的,然后重复步骤2到4,“连接请求成功”,还是连接上了! (这就是为什么我说这可能是我在第 3 步错误的地方:也许它没有更改密码,所以仍然连接是很合乎逻辑的?)

有谁知道错误在哪里?这很烦人,我手头有所有的元素来做我想做的事,但我无法正确地适应它们!我想做的是,当我在 XML 文件和 运行 netsh wlan export 然后 netsh wlan connect 中输入正确的密码时,它会连接我,如果我输入错误则不起作用密码。

*我还可以做什么:我从 python 脚本调用批处理文件,这是我的主脚本。因此,如果您有使用 Python 连接到 wifi 的解决方案,例如,我知道有像 os 这样的库允许使用 cmd 命令,我接受它们!

答案如下:如何使用 Python 连接到无线网络并提供密码?

我们要做的是使用我们的 Python 脚本调用批处理 (.bat) 文件,这相当于 cmd 命令的文本文件。我使用的是 Python (3.8) 和 windows 10.

的最新版本

如果您从未连接到该 WIFI(忽略其他):

netsh wlan export profile name = A_WIFI_YOU_ALREADY_CONNECTED_INTO

所以你可以获得一个XML文件。然后打开,每次出现"name"修改为你要连接的wifi名称替换值:

<?xml version='1.0' encoding='utf-8'?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1" xmlns:ns1="http://www.microsoft.com/networking/WLAN/profile/v3">
    <name>HERE THE NAME</name>
    <SSIDConfig>
        <SSID>
            <name>HERE THE NAME</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>HERE IS YOUR PASSWORD, DON'T CHANGE IT, WE WILL DO IT LATER</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
    <ns1:MacRandomization>
        <ns1:enableRandomization>false</ns1:enableRandomization>
    </ns1:MacRandomization>
</WLANProfile>

然后:

netsh wlan add profile filename = PATH_TO_THE_XML

好的,现在你已经有了你的个人资料,让我们看看下一步是什么(如果你已经连接到 wifi 一次,请从这里开始):

netsh wlan set profileparameter name=YOUR_WIFI keyMaterial = YOUR_KEY
netsh wlan connect name=YOUR_PROFILE_NAME(usually same as wifi name) ssid=YOUR_WIFI

第一行将更改密码,第二行将连接您。

注意:即使密码错误,它也会说你已连接,但不会连接你。所以不要读取输出来检查您是否已连接...

最后一步:如何在 python 脚本中使用它? 2个选项:

  1. 使用OS库调用cmd命令:
import os
os.popen('your command here')

(别忘了先用pip安装os)

  1. 使用批处理文件:

创建一个新的 txt 文件,将所有命令逐行写入其中,并将其命名为 "connect.bat"。然后创建一个python脚本:

import subprocess
def connect():
    subprocess.call([r"path where the batch file is stored\name of the batch file.bat if it is in the same directory (don't need to specify the path)"])