宇宙仮面の
C# Programming

 
Image

SNMPを使う

開発環境: Visual Studio 2003 

1.目次

1.目次
2.目的
3.参考書
4.Windows での SNMP Agent の起動
5.SNMPについて
6.Snmpクラス概要
7.SNMP_Test_Tool

2.目的

Platform SDK から、SNMPで情報を取得する方法です。
SNMP とは、Simple Network Management Protocol の略で、ルータなどのネットワークデバイスの状態を取得するプロトコルです。
最初は、プラットフォームSDKの動作を確認するぐらいでやめるつもりだったのだけれど、いろいろうまくいかないで、次々に手を入れることになってしまいました 。とても厄介です。

と、四苦八苦していたところ、河端さんからの情報で、WMI から SNMP をアクセスできるそうです。試してませんが、マネージドコードで処理できるので、WMI→SNMP のほうがずっと楽にできると思います。プラットフォームSDK経由の SNMP ではなくて、WMI 経由のSNMP にしたほうがいいと思います。

ともあれ、Platform SDK のSNMPアクセスや、非同期コールなどせっかく調べたので、メモっておきます。

リスト画面
Image

Get(WALK)したところ
Image

Trap を受信したところ
Image

3.参考書

(1) MSDN Simple Network Management Protocol
(2) MSDN SNMP Functions
(3) 1.3.6.1.2.1 - SNMP MIB-2
(4) NET-SNMP 導入メモ
(5) Auto*Manage

4.Windows での SNMP Agent の起動

 
テストのために、自分自身のPCへSNMPでのアクセスを行います。
そこで、Windows の SNMP Agent を起動しておく必要があります。

次のように、Windows の SNMP Service を起動しておきます。

Image


次に、SNMP Service のプロパティで、コミュニティ名、トラップ送信先をアプリケーションを動かすホスト名を指定します。
Image

次に、SNMP Service のセキュリティで、受け付けるコミュニティ名と、権利を指定します。
ここでは、一般的な public と private という名前にしておきますが、これはセキュリティホールになりますから、気をつけてください。
何をいっているのかわからない人は、危険なのでまずSNMPを勉強してからにしましょう。
Image

5.SNMPについて

ここでは、詳しいことは解説しませんが、初めての人は SNMPで検索すると、いろいろなサイトがあるので、そこで概略を理解するといいでしょう。
また、OID, Asn.1 についてわからないと、コードが何をしているのかわからないので、Object Identifier (OID)、Abstract Syntax Notation One (ASN.1) あたりも勉強しないとだめです。ネット検索では、ほとんど英語の文献しかありません。

プラットフォームSDK には2種類あります。
特徴は次のとおりです。

Project機能
SnmpMgr("Mgmtapi.DLL")簡易 SNMP マネージャ用の インターフェース
トラップのコールバックに対応していない。
WinSNMP("WSNMP32.DLL")SnmpMgr よりは、さらに下位のインターフェース
トラップのコールバックにも対応している。

ここでは、Snmp のデータのGET/SET/WALK を SnmpMgr インターフェースで行いました。
しかし、SnmpMgr インターフェースでは、トラップのコールバックに対応していないので、トラップのコールバック処理のためだけに WinSNMP を使用しています。

でも、と〜〜〜〜〜〜〜〜〜〜〜っても使いにくいです。
WMI で SNMP の処理ができるなら、そちらがお勧めです。

6.Snmpクラス概要

  
今回、作成したクラスのメモです。
大きく分けて、3つのプロジェクトからなります。

Project機能
SnmpApplicationWindows Forms のメイン
SnmpLibrarySNMP のホストごとのGET/SET/WALK の処理、および各SNMP情報を管理するテーブル操作
SnmpTrapHandlerSNMP のトラップの処理
  
以下では、各プロジェクトの主要クラスの関連についてメモっておきます。

SnmpApplication
SnmpApplication のメインクラス。

ヘルプダイアログ(About)
設定を行うダイアログ(Configure)
ホストの追加を行うダイアログ(AddHostForm)
IPで指定した範囲のホストの追加を行うダイアログ(AddHostRangeForm)

複数のホストのSNMP データを管理するSnmpHostTableクラス。
受信したトラップを管理するための SnmpTrapHandler クラス。
WALKしたデータを管理するためのSnmpWalkData クラス(1つのホストだけ保持する)

Image

SnmpLibrary
Snmp のGET/SET を行うための関連クラスです。
SnmpSession が SnmpMgrプラットフォームSDK のラッパークラスです。
ホストごとのSnmp のデータは、SnmpBase から継承する SnmpMib2Systemか、SnmpWalkData が保持します。
各ホストのテーブルは、SnmpHostTable が管理します。

Snmp のデータは、C# のCAsnValue クラスから継承するクラスでラップしています。

Image
SnmpTrapHandler
トラップ関連のクラス図です。

トラップ処理を管理するのが SnmpTrapHandler クラスです。

WinSNMPクラスが WinSNMP プラットフォーム SDK へのラッパークラスです。
トラップがきたときのコールバックを処理します。
トラップを受けた場合、SnmpTrapListener がそのデータ(SnmpTrapData) を取得します。トラップデータは SnmpTrapTable に格納します。


Image

7.SNMP Test Tool

ここまで手を入れるつもりはなかったのだけど、どんどん肥大化する〜〜〜〜〜。インストーラを付けたものをこちらで公開しています。