Как использовать функции Windows API «Native Wifi API» с ruby

Моя установка: Windows 7, Ruby 1.9.3

Я хочу управлять беспроводным сетевым адаптером для доступа к различным беспроводным маршрутизаторам, вот что я пробовал:

Способ 1: netsh wlan

Управление адаптером WLAN с помощью командных инструментов netsh.

Поэтому я настроил свою беспроводную сеть в Windows и экспортировал ее, используя

netsh wlan export profile name="wuhongliang" folder = "d:\" interface="Wireless" key=clear

Что сработало, я могу добавить профиль и подключиться, выполнив:

> netsh wlan add profile ^
filename="d:\wireless-wuhongliang.xml" ^
interface="wireless" Profile

wuhongliang is added on interface Wireless.

> netsh wlan connect name="wuhongliang" ^
ssid="wuhongliang"
Connection request was completed successfully.

Который работает и подключает меня к WLAN, используя экспортированный профиль.

Итак, глядя на профиль XML:

<?xml version="1.0" ?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
  <name>wuhongliang</name>
  <SSIDConfig>
    <SSID>
      <hex>7775686F6E676C69616E67</hex>
      <name>wuhongliang</name>
    </SSID>
  </SSIDConfig>
  <connectionType>ESS</connectionType>
  <connectionMode>auto</connectionMode>
  <MSM>
    <security>
      <authEncryption>
        <authentication>WPA2PSK</authentication>
        <encryption>AES</encryption>
        <useOneX>false</useOneX>
      </authEncryption>
      <sharedKey>
        <keyType>passPhrase</keyType>
        <protected>true</protected>
        <keyMaterial>[Long Encrypted Key]</keyMaterial>
      </sharedKey>
    </security>
  </MSM>
</WLANProfile>

keyMaterial, очевидно, является зашифрованным сетевым паролем. Поэтому, если я изменю пароль маршрутизатора, профиль сломается, потому что у меня нет нового зашифрованного keyMaterial.

Поскольку я не знаю, как сгенерировать keyMaterial, у меня это не сработает.

Способ 2: использование wlanapi.dll

Я нашел эту статью. на codeproject.com, и это выглядело многообещающе. Но у меня нет опыта в C#, C, C++.

Я пытался использовать dll с Ruby DL и Win32API, но я не знаю, как установить параметры или использовать эти библиотеки в целом.

Это код Ruby, который я использовал для вызова WlanEnumInterfaces API (но я почти уверен, что он неверен):

c_handle = 1
c_reserved = 0
c_interfacelist=" "*10000 
dllname = "wlanapi.dll" 
pro=Win32API.new(dllname, "WlanEnumInterfaces", ['p', 'l', 'p'], "v") 
p pro.call(handle, c_reserved, c_interfacelist) 
p c_interfacelist.unpack("l*")

person wuhlcom    schedule 19.06.2015    source источник
comment
Пожалуйста, отредактируйте вопрос, чтобы он был читабелен. У вас нет Javascript, который мы можем запустить.   -  person David Heffernan    schedule 19.06.2015
comment
Прошу прощения за формат вопроса, я потратил около 3 часов, чтобы отредактировать текст вопроса, мне трудно это сделать, но я буду изменять его медленно, пожалуйста, не удаляйте мой вопрос, ТКС   -  person wuhlcom    schedule 19.06.2015
comment
Большое спасибо за редактирование вопроса для меня, хотя я не знаю, кто вы   -  person wuhlcom    schedule 23.06.2015


Ответы (1)


В теге sharedKey измените значение protected на false, а значение keyMaterial можно импортировать в plaintext.

<sharedKey>
    <keyType>passPhrase</keyType>
    <protected>false</protected>
    <keyMaterial>[The Password]</keyMaterial>
  </sharedKey>

Параметр key=clear должен был сделать это за вас, но, очевидно, это было не так.

person Azolo    schedule 19.06.2015
comment
Большое спасибо за ваш ответ! Это работает‹br› Я действительно хочу научиться вызывать wlanapi.dll с помощью ruby‹br› Мне придется вызывать некоторые другие win32api, такие как user32, kernel32, поэтому, если я освою использование wlanapi, я буду знать, как сделай это. Не могли бы вы мне помочь? - person wuhlcom; 23.06.2015
comment
Это совсем другой вопрос. Тот, который должен иметь дело с тем, как использовать dlls из Ruby. - person Azolo; 23.06.2015