SNMP拡張エージェントの作成

こんにちは SNMPプロトコルの使用についてですが、誰もが慣れているのと同じ方法ではありません。 ウィキペディアによると、この「プロトコルは、ネットワーク管理システムで管理者の注意を必要とする状態についてネットワークに接続されたデバイスを監視するために一般的に使用されています」 そのようなデバイスは、多くの場合、ルーター、ハブ、スイッチ、ブリッジ、プリンター、そしてもちろんコンピューター自体です。 監視機能を実装するために、そのような各デバイスにはSNMPエージェントがあり、その緊急の責任は情報の収集と要求に応じてマネージャーに送信することです。



画像



当初、この機能はSNMPサービスとして実装され、プロトコルの詳細に関する大まかな作業をすべて処理します。 エージェントが利用できるすべての情報は制御情報ベース(MIB)にあり、各デバイスパラメーターにはOIDと呼ばれる一意の識別子が割り当てられています。 したがって、ネットワークデバイスパラメーターの必要な値を読み取るために、マネージャーはこのパラメーターのOIDを示す要求を行う必要があります。 要求を受信すると、エージェントはMIBでこのパラメーターを見つけ、その値をマネージャーに返します。 すべてが非常に簡単です。



エージェントの基本機能を拡張する必要がある場合は、必要な機能を備えた拡張エージェントを作成する必要があります。 物理的には、拡張エージェントは少なくとも3つの機能をエクスポートするdllです。





拡張エージェントの動作を図で説明します。



画像



拡張エージェントが通常のコンピューターにインストールされているとします。 OSが起動すると、SnmpExtensionInitが呼び出され、その結果、エージェントが作業の準備をします。 まず、彼は「彼の責任のゾーン」を示します。 要求に応じて、このエージェントが呼び出されるOIDの範囲。 さらに、他の準備措置を実行できます。たとえば、管理者が監視するパラメータの値をメモリにロードするなどです。



マネージャーがリクエストを送信した後、SNMPサービスは、このリクエストがエージェントの責任下にあると判断し、対応するdllを「プル」します。 そして、エージェントは、リクエストに応じて、パラメーターを読み取るか、新しい値を書き込みます。



システムにエージェントを登録するには、HKLM-> System-> CurrentControlSet-> services-> SNMP-> Parameters-> ExtensionAgentsセクションで、次の番号の文字列パラメーターを順番に作成する必要があります。



画像



このパラメーターの値は、レジストリー内の文字列パラメーターPathnameへのパスになります。これは、Softwareセクションにある必要があります。 たとえば、「ソフトウェア\テスト\ SnmpExtAgent \ CurrentVersion」。 つまり ソフトウェア3セクションにテスト、SnmpExtAgent、およびCurrentVersionのセクションを作成する必要があります。 次に、文字列パラメーターPathnameを作成します。この値は、dllへのパスになります。



画像



当然、SNMPサービスはコンピューターにインストールする必要があります。 そこにない場合は、「プログラムの追加と削除」->「Windowsコンポーネントのインストール」に進みます。「コントロールと監視ツール」にチェックマークを付けてインストールします。WindowsXPではインストールディスクが必要です。



次に、[マイコンピュータ]-> [管理]-> [サービス]に移動します。 大切な行「SNMPサービス」を見つけ、プロパティの「セキュリティ」タブで、読み取り/書き込み権限を持つパブリックコミュニティを作成します。 サービスを再起動すると、エージェントは動作可能になります。



今、少しのコード。



SnmpExtensionInit関数:



BOOL SNMP_FUNC_TYPE SnmpExtensionInit( DWORD dwUptimeReference, HANDLE *phSubagentTrapEvent, AsnObjectIdentifier *pFirstSupportedRegion) { *pFirstSupportedRegion = MIB_OidPrefix; //     " " *phSubagentTrapEvent = g_hSimulateTrap;//      //        g_szAbout = (char*)malloc(sizeof(char)*64); strcpy(g_szAbout,"Author : Ramanan.T"); g_szName = (char*)malloc(sizeof(char)*64); strcpy(g_szName,"Your Name"); g_asnIntAge = 0; g_dwStartTime = GetTickCount(); return SNMPAPI_NOERROR; }
      
      







SnmpExtensionQuery関数:



 BOOL SNMP_FUNC_TYPE SnmpExtensionQuery( BYTE bPduType, SnmpVarBindList *pVarBindList, AsnInteger32 *pErrorStatus, AsnInteger32 *pErrorIndex) { int nRet = 0; AsnObjectName; *pErrorStatus = SNMP_ERRORSTATUS_NOERROR; *pErrorIndex = 0; for(UINT i=0;i<pVarBindList->len;i++) { *pErrorStatus = SNMP_ERRORSTATUS_NOERROR; //    switch(bPduType) { case SNMP_PDU_GET: // GET *pErrorStatus = GetRequest(&pVarBindList->list[i]); if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR) *pErrorIndex++; break; case SNMP_PDU_GETNEXT: // GETNEXT *pErrorStatus = GetNextRequest(&pVarBindList->list[i]); if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR) *pErrorIndex++; break; case SNMP_PDU_SET: // SET *pErrorStatus = SetRequest(&pVarBindList->list[i]); if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR) *pErrorIndex++; break; default: *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME; *pErrorIndex++; }; } return SNMPAPI_NOERROR; }
      
      







pVarBindList構造を介して、必要なパラメーターのOIDが取得され、 GetRequestおよびGetNextRequest関数でこれらのパラメーターの値を同じ構造に書き込むことがわかります。



だから、結果は何ですか。 ネットワーク経由で要求を受信したときにシステムが呼び出すDLLを作成できます。 しかし、このまさにSnmpExtensionQueryの内部で行うことはビジネスです。 つまり、マネージャーからリクエストを受け取った私たちは、任意のアクションを実行できます。 SNMPサービスがほぼすべてのコンピューターで利用可能であることを考慮すると、コンピューターの下で実行される技術的手段を管理するための非常に幅広い可能性が得られます。 いずれによっても。



ご清聴ありがとうございました。



参照:

1.www.codeproject.com/Articles/9024/How-to-develop-a-SNMP-extension-agent-DLL



All Articles