刚刚发现你提问。您搜索的信息来自 NDIS 驱动程序。WMI 只为您提供此类信息的一个子集。每个 NDIS 驱动程序都支持一些可以根据DeviceIoControl功能发送的标准请求(请参阅http://msdn.microsoft.com/en-us/library/aa363216%28v=VS.85%29.aspx)。作为输入(lpInBuffer 参数),您应该给出一个带有 OID 代码的 DWORD,一个识别请求的控制代码,作为输出,您收到一个带有信息字段的结构,或者在您的情况下是一个 DWORD(枚举值)。例如,如果您向 NDIS 驱动程序询问
#define OID_802_11_WEP_STATUS 0x0D01011B
Run Code Online (Sandbox Code Playgroud)
(作为 lpInBuffer 参数的 DWORD 值)它也返回 DWORD 以及类似信息
// Also aliased typedef to new name
typedef enum _NDIS_802_11_WEP_STATUS
{
Ndis802_11WEPEnabled,
Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
Ndis802_11WEPDisabled,
Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
Ndis802_11WEPKeyAbsent,
Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
Ndis802_11WEPNotSupported,
Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
Ndis802_11Encryption2Enabled,
Ndis802_11Encryption2KeyAbsent,
Ndis802_11Encryption3Enabled,
Ndis802_11Encryption3KeyAbsent
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
Run Code Online (Sandbox Code Playgroud)
要求
#define OID_802_11_AUTHENTICATION_MODE 0x0D010118
Run Code Online (Sandbox Code Playgroud)
回报
typedef enum _NDIS_802_11_AUTHENTICATION_MODE
{
Ndis802_11AuthModeOpen,
Ndis802_11AuthModeShared,
Ndis802_11AuthModeAutoSwitch,
Ndis802_11AuthModeWPA,
Ndis802_11AuthModeWPAPSK,
Ndis802_11AuthModeWPANone,
Ndis802_11AuthModeWPA2,
Ndis802_11AuthModeWPA2PSK,
Ndis802_11AuthModeMax // Not a real mode, defined as upper bound
} NDIS_802_11_AUTHENTICATION_MODE;
Run Code Online (Sandbox Code Playgroud)
要求
#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
Run Code Online (Sandbox Code Playgroud)
回报
typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
{
Ndis802_11IBSS,
Ndis802_11Infrastructure,
Ndis802_11AutoUnknown,
Ndis802_11InfrastructureMax // Not a real value, defined as upper bound
} NDIS_802_11_NETWORK_INFRASTRUCTURE;
Run Code Online (Sandbox Code Playgroud)
等等。ntddndis.h安装Windows DDK后,您可以在其中找到您需要的所有不同常量。
要打开设备句柄,您应该使用CreateFile函数。"\\.\"您应该提供带有前缀和适配器名称(适配器 GUID)的字符串,而不是文件名。您可以用不同的方式枚举适配器名称。最简单的方法之一是注册表项的子项名称HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters。
我上面解释的所有内容都与http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx或其他用法示例完全相同DeviceIoControl。DDK 中描述了必须支持某些设备类的 IoControl 请求的完整列表。我再说一遍,使用该设备时只需使用DeviceIoControl设备驱动程序,而不需要编写设备驱动程序。
大约 10 年前,我曾尝试过一些我在这里描述的此类请求。我测试了我的旧程序现在没有任何问题。只需使用您需要的 OID,仅此而已。
更新:我找到了一个很好的链接http://pages.infinit.net/codeguru/WiFiArticle.htm,换句话说,它解释了我刚刚写的内容。在我看来,这里使用了错误的参数CreateFile。必须使用FILE_SHARE_READ | FILE_SHARE_WRITE才能使所有工作正常进行。示例http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp(请参阅 参考资料bool WindowsWiFiUtils:init()等bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode))看起来好多了,并且包含许多您可能也会感兴趣的方法。这是一个 C++ 示例,但用 C# 重写它非常容易。
更新2:另一种方法是使用“本机Wifi API” http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx,例如WlanQueryInterface(例如使用wlan_intf_opcode_supported_infrastruct_auth_cipher_pairs)或WZCQueryInterface,但Windows Server 2003似乎不支持,你需要什么。一般来说,“本机 Wifi API”可能是提供最大信息(或修改信息)的更可靠方法,但 WMI 也可以是一个很好的实用替代方案。
| 归档时间: |
|
| 查看次数: |
1773 次 |
| 最近记录: |