如何以编程方式禁用 Windows 10 中的 Wi-fi Sense?

How do I programmatically disable Wi-fi Sense in Windows 10?

Windows 10 有一个名为 Wifi Sense 的新功能。该功能将 WLAN 适配器连接到附近的任何开放热点。它还通过 Facebook 与朋友共享 WLAN 密码。根据我们的测试:

我找到了几个如何通过 Windows UI 禁用 Wifi Sense 的答案:例如here。但是,没有答案确实禁止为开放热点创建新配置文件。有没有办法完全禁用 Wifi Sense?最好以编程方式。

TL;DR:有未记录的注册表值可以禁用 Wifi Sense 的某些功能。这些值位于键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\features 中,并命名为 WiFiSenseCredSharedWiFiSenseOpen。首先控制是否共享 Wifi 凭证,其次控制 Wifi Sense 是否为打开的热点创建新的配置文件。两者的默认值(至少在我的机器上)都是 1。将它们更改为 0。WcmSvc 服务包含 Wifi Sense 的实现,需要在注册表更改后重新启动。我尝试通过 ControlService API 将 SERVICE_CONTROL_PARAMCHANGE 发送到 WcmSvc 但我得到了 ERROR_ACCESS_DENIED 因此在 MS 发布一些 public API。请注意,由于这些值未记录,MS 可能会更改它们的位置,甚至会在 Windows.

的下一版本中将其删除

编辑:上面推荐的值不再适用于 Windows10 的最新版本。但是我发现 Wifi Sense 配置状态存储在值中 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\features\S-1-5-21-774371734-2276234837-1234541976-1000\FeatureStates。请注意,密钥名称 S-1-5-21-774371734-2276234837-1234541976-1000 可能因不同的机器而异。该值本身是具有以下语义的位掩码:

enum EWifiManagerFeatureStates
{
  CONNECT_OPEN_HOTSPOTS = 0x0001,
  CONNECT_NETWORKS_FROM_CONTACTS = 0x0040,
  CONNECT_PAID_HOTSPOTS = 0x200,
}

必须将这些位设置为 0 才能完全禁用 Wifi Sense。我无法找到剩余位的含义,但其他人也可以尝试将它们设置为 0。

长话短说: 对于感兴趣的人,这里是一个简短的描述,我是如何找到未记录的注册表值的。它可能会帮助其他人找到更多未记录的注册表值。

首先我猜应该有一个未记录的注册表设置可以关闭 WifiSense。所以我安装了 Process Monitor 工具,它能够列出所有 运行 进程的所有注册表访问。我在 Network/Wifi/Advanced Wifi Settings 打开 Windows 设置 UI 并更改了与 Wifi Sense 相关的设置。然后我查看 Process Monitor 输出以查看访问了注册表的哪些部分。我将输出过滤到 RegSetValue 以仅查看写入并减少其他注册表操作的噪音。

我看到多次写入键的值 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\features\S-1-5-21-774371734-2276234837-1234541976-1000

在注册表编辑器中查看密钥时,我没有发现任何有趣的东西,但是 它的父键中有两个非常可疑的值 (...\wifinetworkmanager\features)。这些值是 DWORD(数字)并命名为 WiFiSenseCredShared 和 WiFiSenseOpen。两者都设置为 1。我将它们设置为 0 和 重新启动 WcmSvc 服务以便重新读取新值。关闭此 Wifi Sense 后。我能够删除由它创建的配置文件并且 没有创建新的打开配置文件。

在最近 Windows 10 个版本中使用 cmd.exe 中的此脚本禁用此功能 (the source):

for /f %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\features"^|find "S-1"') do (reg add %%A /v FeatureStates /t REG_DWORD /d 828 /f)

注意:这是在 CMD 文件语法中。如果您打算在命令解释器(而不是 cmd 文件)中使用它,请使用 %A 而不是 %%A。