繁体   English   中英

如何以编程方式从Windows 2003 Server从无线网络设备检测密码类型和加密级别

[英]How to programmatically detect Cipher type and Encryption level from a wireless network device from windows 2003 server

现在,我的团队正在使用Windows应用程序c#在网络项目中工作。 我不知道如何以编程方式从Windows 2003 Server无线网络设备中检测密码类型和加密级别

搜索后,我得到了WMI(Windows管理规范)来解决问题。+

请提出示例/参考,以从Windows 2003 Server中从无线网络设备中查找密码类型和加密级别

刚刚发现您的问题。 您搜索的信息源自NDIS驱动程序。 WMI仅为您提供此类信息的子集。 每个NDIS驱动程序都支持一些可以根据DeviceIoControl函数发送的标准请求(请参阅http://msdn.microsoft.com/zh-cn/library/aa363216%28v=VS.85%29.aspx )。 作为输入(lpInBuffer参数),您应该给DWORD加上OID代码,识别请求的控制代码。作为输出,您收到包含已归档信息的结构,或者在您的情况下输入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函数。 而不是文件名,您应该给字符串加上前缀"\\\\.\\"和适配器名称(适配器向导)。 您可以使用不同的方式枚举适配器名称。 最简单的一种是注册表项HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Adapters的子项名称。

我上面解释的所有内容都与http://msdn.microsoft.com/zh-cn/library/aa964902%28v=VS.85%29.aspx或使用DeviceIoControl其他示例完全一样。 DDK中描述了必须支持某些设备类的IoControl请求的完整列表。 我再重复一遍,那一次只需要使用DeviceIoControl而不编写设备驱动程序即可。

大约十年前,我在这里描述了一些这样的要求。 我测试了我的旧程序现在可以正常工作了。 一个只需要使用您需要的OID,而无需更多。

更新:我找到了一个很好的链接http://pages.infinit.net/codeguru/WiFiArticle.htm ,换句话说,我的书面解释也是如此。 在我看来,这里在CreateFile使用了错误的参数。 一个必须使用FILE_SHARE_READ | FILE_SHARE_WRITE 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_infrastructure_auth_cipher_pairs)或WZCQueryInterface,但是您所需的Windows Server 2003似乎不支持它。 通常,“本机Wifi API”可能是提供最大信息(或对其进行修改)的更可靠方法,但是WMI也是一种实用的替代方法。

就WMI而言,您可以检索的无线连接信息非常有限。

运行WMI查询"Select * from MSNdis_80211_WEPStatus where active=true"将为您提供一个数值结果,其中:

0=WEP is in use
2=Connection is unsecured
4=WPA-PSK is in use
6=WPA is in use
7=Disconnected

要从powershell运行此查询,您只需执行以下操作:

PS C:\\ WINDOWS> gwmi -query "Select * from MSNdis_80211_WEPStatus where active=true" -namespace root\\wmi

在C#中,以下方法应该起作用:

using System;
using System.Management;
class Query_SelectQuery
{
    public static int Main(string[] args) 
    {
        SelectQuery selectQuery = new 
            SelectQuery("Select * from MSNdis_80211_WEPStatus where active=true");
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\wmi", selectQuery);

        foreach (ManagementObject resultVal in searcher.Get()) 
        {
            Console.WriteLine(resultVal.ToString());
        }

        Console.ReadLine();
        return 0;
    }
}

如果您有多个活动的无线连接,则将变得更加困难,因为必须通过查询MSNdis_80211_ServiceSetIdentifier类中的Ndis80211Ssid属性来获取SSID值。

如果您使用的是Windows {Vista,7,Server 2008},则可以从命令外壳运行netsh wlan export ,并使其通过网络设置(不包括无线密钥)输出一个不错的.xml文件,但是我不认为有任何方法可以使它在Windows XP,Server 2003或其他未列出的操作系统上运行。

如果您需要更详细的配置信息(特别是在Windows 2003 Server下),则另一个选择是访问本文中详细介绍的组策略设置: http : //technet.microsoft.com/zh-cn/library/bb878079.aspx

我没有方便进行测试的Windows Server 2003计算机,但是您应该能够通过root \\ RSoP命名空间下的WMI访问这些组策略对象和设置。

从控制台运行wbemtest或使用Microsoft WMI Code Creator工具将使您查看可用的WMI对象和类,以准确找出那些组策略对象的位置。

虽然查询组策略WMI对象看起来有些痛苦:(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM