2010-04-22 21 views
5

Bây giờ nhóm của tôi làm việc trong một dự án mạng bằng cách sử dụng ứng dụng windows C#. Tôi không biết cách phát hiện loại mã hóa và mức mã hóa theo lập trình từ thiết bị mạng không dây từ máy chủ Windows 2003 .Cách lập trình phát hiện loại mã hóa và mức mã hóa từ thiết bị mạng không dây từ máy chủ Windows 2003

Sau khi tìm kiếm tôi đã nhận WMI (Windows Management Instrumentation) để giải quyết vấn đề. +

Xin gợi ý cho ví dụ/tài liệu tham khảo cho việc tìm kiếm loại Cipher và mức độ mã hóa từ một thiết bị mạng không dây từ Windows 2003 Server

Trả lời

3

hỗ trợ tài xế Mỗi NDIS chỉ tìm thấy bạn thắc mắc. Những thông tin mà bạn tìm kiếm nguồn gốc từ tài xế NDIS. WMI chỉ mang đến cho bạn một tập hợp con của thông tin đó. Một số yêu cầu tiêu chuẩn mà có thể Là một đầu vào (tham số lpInBuffer), bạn nên cung cấp một DWORD với mã OID, mã kiểm soát xác định yêu cầu, Là đầu ra bạn nhận được một cấu trúc có thông tin được đệ trình, hoặc trong trường hợp của bạn là DWORD (giá trị enum).Ví dụ, nếu bạn hỏi tài xế NDIS cho

#define OID_802_11_WEP_STATUS     0x0D01011B 

(như giá trị DWORD của tham số lpInBuffer) nó trở lại cũng trả về DWORD với thông tin như

// 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; 

yêu cầu

#define OID_802_11_AUTHENTICATION_MODE   0x0D010118 

lợi nhuận

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; 

yêu cầu

#define OID_802_11_INFRASTRUCTURE_MODE   0x0D010108 

lợi nhuận

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; 

và vân vân. Bạn có thể tìm thấy tất cả các hằng số khác nhau mà bạn cần trong ntddndis.h sau khi cài đặt Windows DDK.

Để mở thiết bị, bạn nên sử dụng chức năng CreateFile. Thay vì tên tệp, bạn nên cung cấp một chuỗi có tiền tố "\\.\" và tên bộ điều hợp (adapter guids). Tên bộ điều hợp bạn có thể liệt kê theo cách khác. Một trong những cách dễ nhất là các tên khóa con của khóa đăng ký HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters.

Tất cả những gì tôi đã giải thích ở trên hoạt động chính xác như http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx hoặc các ví dụ khác về cách sử dụng DeviceIoControl. Danh sách đầy đủ các yêu cầu IoControl mà phải hỗ trợ một số lớp thiết bị được mô tả trong DDK. Tôi lặp lại một lần nữa, để sử dụng cái đó chỉ cần sử dụng DeviceIoControl và không viết trình điều khiển thiết bị.

Cách đây hơn 10 năm, tôi chơi một chút với các yêu cầu như vậy mà tôi đã mô tả ở đây. Tôi đã thử nghiệm chương trình cũ của tôi hoạt động mà không gặp bất kỳ sự cố nào. Người ta chỉ cần sử dụng OID mà bạn cần và không nhiều hơn nữa.

CẬP NHẬT: Tôi tìm thấy liên kết tốt http://pages.infinit.net/codeguru/WiFiArticle.htm giải thích cách khác giống với những gì tôi vừa viết. Dường như với tôi rằng một trong những sử dụng ở đây sai thông số trong CreateFile. Người ta phải sử dụng FILE_SHARE_READ | FILE_SHARE_WRITE để làm cho tất cả làm việc. Ví dụ http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp (xem bool WindowsWiFiUtils:init(), bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode) vv) trông giống như tốt hơn nhiều và chứa rất nhiều phương pháp có thể cũng thú vị cho bạn. Nó là một ví dụ C++, nhưng nó rất dễ dàng để viết lại điều này trong C#.

CẬP NHẬT 2: Thêm một cách là sử dụng "Native Wifi API" http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx như WlanQueryInterface (ví dụ với wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs) hoặc WZCQueryInterface, nhưng có vẻ như không được hỗ trợ trên Windows Server 2003, những gì bạn cần. Nói chung "Native Wifi API" có lẽ là cách đáng tin cậy hơn để cung cấp thông tin tối đa (hoặc sửa đổi nó), nhưng WMI cũng có thể là một lựa chọn thực dụng tốt.

2

Theo như WMI, bạn bị giới hạn khá nhiều trong thông tin kết nối không dây mà bạn có thể truy xuất.

Chạy một truy vấn WMI cho "Select * from MSNdis_80211_WEPStatus where active=true" nên cung cấp cho bạn một kết quả số nơi:

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

Để chạy truy vấn này từ PowerShell bạn chỉ có thể làm:

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

Từ C#, thao tác sau sẽ hoạt động:

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; 
    } 
} 

Nếu bạn có nhiều kết nối không dây hoạt động, nó trở nên khó khăn hơn vì bạn phải lấy các giá trị SSID bằng cách truy vấn thuộc tính Ndis80211Ssid trong lớp MSNdis_80211_ServiceSetIdentifier.

Nếu bạn đang sử dụng Windows {Vista, 7, Server 2008}, bạn có thể chạy netsh wlan export từ trình bao lệnh và đưa nó ra tệp .xml đẹp với cài đặt mạng của bạn (không bao gồm khóa không dây) nhưng tôi không t nghĩ rằng có bất kỳ cách nào để có được điều này để làm việc trên Windows XP, Server 2003 hoặc hệ điều hành không công bố khác.

Một tùy chọn khác nếu bạn cần thông tin cấu hình chi tiết hơn đặc biệt trong môi trường Windows 2003 Server là để truy cập vào các thiết lập chính sách nhóm được nêu chi tiết trong bài viết này: http://technet.microsoft.com/en-us/library/bb878079.aspx

Tôi không có một Server 2003 máy tính Windows tiện dụng để kiểm tra nhưng bạn sẽ có thể truy cập vào các đối tượng và cài đặt chính sách nhóm này thông qua WMI theo root\RSoP namespace

Chạy wbemtest từ bảng điều khiển hoặc sử dụng công cụ Microsoft WMI Code Creator sẽ cho phép bạn xem xét các đối tượng và lớp WMI có sẵn để tìm chính xác vị trí của những Nhóm đó Đối tượng chính sách đang nói dối.

Querying for Group Policy WMI Objects trông kinda đau đớn dù :(

Các vấn đề liên quan