gpt4 book ai didi

c# - 如何以编程方式从 Windows 2003 服务器的无线网络设备检测密码类型和加密级别

转载 作者:可可西里 更新时间:2023-11-01 13:33:14 24 4
gpt4 key购买 nike

现在我的团队正在使用 windows 应用程序 c# 进行网络项目。我不知道如何从 windows 2003 服务器

无线网络设备以编程方式检测密码类型和加密级别。

经过搜索,我得到了解决问题的 WMI (Windows Management Instrumentation)。+

请建议示例/引用以从 windows 2003 服务器

的无线网络设备中查找密码类型和加密级别

最佳答案

刚发现你的问题。您搜索的信息源自 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

(作为 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;

要求

#define OID_802_11_AUTHENTICATION_MODE          0x0D010118

返回

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;

要求

#define OID_802_11_INFRASTRUCTURE_MODE          0x0D010108

返回

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;

等等。安装 Windows DDK 后,您可以在 ntddndis.h 中找到您需要的所有不同常量。

要打开设备句柄,您应该使用 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: 另一种方法是使用“ native Wifi API”http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx像 WlanQueryInterface(例如使用 wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs)或 WZCQueryInterface,但 Windows Server 2003 似乎不支持您需要的东西。通常,“ native Wifi API”可能是提供最多信息(或对其进行修改)的更可靠方式,但 WMI 也是一个很好的实用替代方案。

关于c# - 如何以编程方式从 Windows 2003 服务器的无线网络设备检测密码类型和加密级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2688240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com