SNMP через WMI
От: Fortnum  
Дата: 15.08.05 08:46
Оценка:
Добрый всем день!

Надо управлять работой бесперебойника через SNMP, при этом программку для управления надо написать на dot net. В Platform SDK были нормальные библиотеки SnmpAPI и WinSNMP. А вот в FCL ничего подобного нет. Если я правильно понял, надо либо самому реализовывать SNMP протокол, либо купить компонент, либо использовать WMI. С последним возникли трудности.

1. Взял mib`овский файл от APC`шной ИБП`шки — powernet361.mib. Чтоб ничего немешалось, сократил его до нескольких объектов-параметров, которые мне, собственно, нужны.

2. Далее, не знаю зачем, загрузил полученный mib-файл в SMIR (root\snmp\smir):

smi2smir /a powernet361.mib

3. Затем, на всякий случай, создал MOF-файл:

smi2smir /gc powernet361.mib > powernet361.mof

4. Затем создал свое пространство имен "root\test05" со всеми подобающими SNMP-провайдеру qualifier`ами. Зарегистрировал в этом своем пространстве имен провайдер классов и провайдер экземпляров. Вот MOF-овский файл, который я использовал для этого:

#pragma namespace("\\\\.\\root")

[
AgentAddress("127.0.0.1"),
AgentReadCommunityName("public"),
AgentWriteCommunityName("private"),
AgentRetryCount(1),
AgentRetryTimeout(500),
AgentVarBindsPerPdu(10),
AgentFlowControlWindowSize(3)
]
instance of __Namespace
{
   Name = "test05";
};

#pragma namespace("\\\\.\\root\\test05")

instance of __Win32Provider
{
  Name = "MS_SNMP_INSTANCE_PROVIDER";
  Clsid = "{1F517A23-B29C-11cf-8C8D-00AA00A4086C}";
};

instance of __Win32Provider
{
  Name = "MS_SNMP_CLASS_PROVIDER";
  Clsid = "{70426720-F78F-11CF-9151-00AA00A4086C}";
};


Указываю локальный адрес, т.к. чтобы бесперебойник не такскать с сбой, запустил на локальном компьютере симулятор SNMP-агента, который прекрасно работает через обычные программы-клиенты SNMP типа FreeSnmp и iSNMP от COI Software.

5. Залил в "root\test05" классы из MIB-овского файла:

mofcomp -N:root\test05 powernet361.mof

6. В CIM-Studio классы стали видны как наследуемые от SnmpMacro. Причем ни у одного из классов нет ключевого поля! Не знаю, плохо это или хорошо?..

7. В CIM-Object Browser для всех классов говорит: "The selected classes do not have instances".

8. Ладно, пишу программку на dot net:

ManagementNamedValueCollection mnvc = new ManagementNamedValueCollection();
  mnvc.Add("AgentAddress", "127.0.0.1");
  mnvc.Add("AgentReadComunityName", "public");
  mnvc.Add("AgentTransport", "IP");

ObjectGetOptions opt = new ObjectGetOptions (mnvc);
        
try
{
  ManagementPath mp =
    new ManagementPath("root\\test05:SNMP_PowerNet_MIB_upsAdvInput");

  ManagementObject mo = new ManagementObject(mp, opt);

  mo.Get();

  MessageBox.Show(mo["upsAdvInputLineVoltage"].ToString());
}
catch(Exception ex)
{
  MessageBox.Show(ex.ToString(), "My Damned Exception");
  return;
}


Программка валится на строчке mo.Get();: "Specified argument was out of the range of valid values. Parameter name: path".

То ли это из-за ключа, то ли из-за неправильной настройки SNMP-провайдера, не знаю...

9. Если "root\\test05:SNMP_PowerNet_MIB_upsAdvInput" заменить на "root\\test05:SNMP_PowerNet_MIB_upsAdvInput.", то выдает какое-то нерусское сообщение кракозябрами:

---------------------------
My Damned Exception
---------------------------
System.Management.ManagementException: Íåïðàâèëüíûé ïàðàìåòð
   at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
   at System.Management.ManagementPath.SetWbemPath(IWbemPath wbemPath, String path)
   at System.Management.ManagementPath.CreateWbemPath(String path)
   at System.Management.ManagementPath..ctor(String path)
   at SnmpOpc.frmMain.button1_Click(Object sender, EventArgs e) in d:\ponomarevcd\исходники\dotnet\snmpopc\frmmain.cs:line 404
---------------------------
OK   
---------------------------


10. Аналогичный код с "root\\cimv2:Win32_LogicalDisk.DeviceID=\"C:\" проходит на ура...

11. Что делать дальше, куда рыть? Помогите, а-а-а-а-а-а!

15.08.05 22:42: Перенесено модератором из '.NET' — TK
Re: SNMP через WMI
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.08.05 08:18
Оценка:
F>Добрый всем день!

F>Надо управлять работой бесперебойника через SNMP, при этом программку для управления надо написать на dot net. В Platform SDK были нормальные библиотеки SnmpAPI и WinSNMP. А вот в FCL ничего подобного нет. Если я правильно понял, надо либо самому реализовывать SNMP протокол, либо купить компонент, либо использовать WMI. С последним возникли трудности.


Для начала посмотрите
http://groups.google.ru/group/microsoft.public.wbem/browse_frm/thread/34fbd540686689df/bd10b8ce4f16438e?lnk=st&q=snmp+through+wmi&rnum=4&hl=ru#bd10b8ce4f16438e

Вообще, в группо-гугле много информации на запрос snmp through wmi

Сделайте все как там (в частности, неймспейс другой), ну а затем, если не заработает, посмотрим..
Удачи.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.