C# 在XP中禁用WiFi网络结构访问

C# 在XP中禁用WiFi网络结构访问,c#,windows,pinvoke,wifi,C#,Windows,Pinvoke,Wifi,我有一个应用程序,需要禁用基础设施访问,然后重新启用它(请不要问为什么。我在保密协议下,很难解释为什么不违反这一点)。我是用C#中的p/Invoke来实现的 要禁用它,我将创建INTF_条目结构,设置适配器guid,然后将dwCtlFlags设置为0并调用 uint outFlags; WZCSAPI.INTF_ENTRY intf = new WZCSAPI.INTF_ENTRY(); intf.wszGuid = adapterGuid; intf.dwCtlFlags = 0; WZCSe

我有一个应用程序,需要禁用基础设施访问,然后重新启用它(请不要问为什么。我在保密协议下,很难解释为什么不违反这一点)。我是用C#中的p/Invoke来实现的

要禁用它,我将创建INTF_条目结构,设置适配器guid,然后将dwCtlFlags设置为0并调用

uint outFlags;
WZCSAPI.INTF_ENTRY intf = new WZCSAPI.INTF_ENTRY();
intf.wszGuid = adapterGuid;
intf.dwCtlFlags = 0;
WZCSetInterface(null, (uint)INTF_FLAGS.INTF_CM_MASK, ref intf, out outFlags)
这工作得很好,完全符合我的期望。“无线网络连接属性/无线网络/高级”下的“我的XP设置”从“任何可用网络(首选接入点)”切换到“仅限计算机到计算机(临时)网络”。这正是我需要它做的

在执行此操作之前,我检索CM_掩码的原始设置

因此,稍后,我尝试用同样的方法来恢复它(在本例中,origCMMask=2):

但“设置”对话框中的“任何可用网络”选项不会恢复,HKLM\SOFTWARE\Microsoft\WZCSVC\Parameters\Interface{guid}\ControlFlags一致认为CM掩码未设置回2,但仍设置为0(实际值为0x07918000,而不是正常的0x07818002)

是否有我遗漏的步骤?

如果您有带SP3的Windows XP,您可以尝试将
wlan\u intf\u操作码\u bss\u type作为操作码

或者,您也可以手动尝试其中一种方法,至少可以验证该方法

  • 禁用无线网卡(可以使用devcon.exe)
  • regedit HKLM\SOFTWARE\Microsoft\WZCSVC\Parameters\Interface{guid}\ControlFlags值
  • 启用无线网卡(可以使用devcon.exe)

  • 嗨,皮特。手动设置注册表值可以解决这个问题吗?有时,这是p/invoke的可行替代方案。此外,您可能需要重新设置网卡。我已经有好几年没有玩弄过这些东西了。我正在考虑这种可能性,但这是针对商业应用程序的,对该密钥的写访问需要管理员访问,我不确定客户端是否可以接受。如果可能的话,我更愿意通过API来完成。你提到过重置卡。如何以编程方式实现这一点?@jp2code:No,手动设置注册表值永远不是P/Invoke的可行替代方案。始终调用文档化的API。手动更新注册表不仅构思糟糕,而且不太可能正常工作。不是每次都读取注册表;Windows缓存了大量数据。皮特,请给我一分钟时间重置无线设备。我想我以前为我们的Windows Mobile设备做过,但我已经有一段时间没有打开该代码了。我不知道该说什么。西蒙,你真是个好男人!这已经困扰我好几个星期了。非常感谢你。享受赏金吧!
    uint outFlags;
    WZCSAPI.INTF_ENTRY intf = new WZCSAPI.INTF_ENTRY();
    intf.wszGuid = adapterGuid;
    intf.dwCtlFlags = origCMMask;
    WZCSetInterface(null, (uint)INTF_FLAGS.INTF_CM_MASK, ref intf, out outFlags)