C# İle SNMP Programlama
-
arkadaşlar bu konuda bilgisi olan bu kütüphaneyle uğraşmış olan varmı elimdeki mevcut sunucuların bilgilerini snmp yardımıyla çekmek istiyorum
bu konuda elinde örnek kod yada döküman olan varmı
-
Uğraştığım zamanlarda codeprojectte güzel bi örnek bulmuştum, bi bakiim sende bak.
-
baktınız mı??
-
Bunlar iş görürmü ?
SNMP library - http://www.codeproject.com/KB/cs/SNMPDLL.aspx
SNMP agent and client in C# - http://www.codeproject.com/Questions/240592/SNMP-agent-and-client-in-Csharp
Tool to traverse MIB tree using SNMP - http://www.codeproject.com/KB/IP/MIB_Browser_tool.aspx
-
SNMP ile ilgili döküman bulmak zor genelde standartları ile ilgili kaynaklar bulursun.
Ben kendimce bir sınıf yazmıştım standartlarından yola çıkarak onu paylaşayım.
SNMP protokolünün kullandığı port 161. port tur.(Trap bilgilendirmesi hariç : Trap olayı da otomatik bilgilendirme mekanizması snmp nin istediğin bir durumda değişiklik olduğunda haber ediyor)
Bunun dışında Program & Features kısmından bilgisini çekmek istediğin makinanın SNMP özelliğini aktif etmelisin.
Bu benim snmp sınıf kodum :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace SnmpManager { class SNMP { public SNMP() { } #region SNMP istek için GET Methodu public byte[] get(string request, string host, string community, string mibstring) { #region DEĞİŞKEN TANIMLARI // Mesaj paketi byte[] packet = new byte[1024]; byte[] mib = new byte[1024]; // SNMP paketinin uzunluğunu belirliyoruz int snmplen; // Community uzunluğu // Bu uzunluğa göre paket belirleniyor int comlen = community.Length; string[] mibvals = mibstring.Split('.'); int miblen = mibvals.Length; int cnt = 0, temp, i; int orgmiblen = miblen; // Paketin bayt dizisi için kullanılan sayısal değer int pos = 0; #endregion #region String MIB ->> Byte[] Integer // String MIB değerini integer byte dizisine çeviriyoruz // 128 den büyük değerler için çift byte alıyoruz // Buna göre de mib uzunluğu artıyor for (i = 0; i < orgmiblen; i++) { temp = Convert.ToInt16(mibvals[i]); if (temp > 127) { mib[cnt] = Convert.ToByte(128 + (temp / 128)); mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128)); cnt += 2; miblen++; } else { mib[cnt] = Convert.ToByte(temp); cnt++; } } #endregion #region SNMP MESAJ FORMATI #region Tüm SNMP paketinin uzunluğu snmplen = 29 + comlen + miblen - 1; #endregion #region SNMP Dizisi Başlangıcı : 0x30 --> Başla packet[pos++] = 0x30; #endregion #region SNMP dizi uzunluğu packet[pos++] = Convert.ToByte(snmplen - 2); #endregion #region SNMP versiyonu belirtiyoruz : SNMP Versiyon 1 --> 0 , SNMP Versiyon 2 --> 1 , SNMP Versiyon 3 --> 2 packet[pos++] = 0x02; //Integer tipinde packet[pos++] = 0x01; //uzunluk packet[pos++] = 0x00; //SNMP version #endregion #region Community adını belirtiyoruz packet[pos++] = 0x04; // String tipinde #endregion #region Community uzunluğu packet[pos++] = Convert.ToByte(comlen); #endregion #region Community ismini byte dizisine çeviriyoruz byte[] comToByte = Encoding.ASCII.GetBytes(community); for (i = 0; i < comToByte.Length; i++) { packet[pos++] = comToByte[i]; } #endregion #region Mesaj tipini GetRequest olarak belirliyoruz : packet[pos++] = 0xA0; #endregion #region MIB nin toplam boyutu packet[pos++] = Convert.ToByte(20 + miblen - 1); #endregion #region Request ID packet[pos++] = 0x02; //Integer type packet[pos++] = 0x04; //length packet[pos++] = 0x00; //SNMP request ID packet[pos++] = 0x00; packet[pos++] = 0x00; packet[pos++] = 0x01; #endregion #region Error status packet[pos++] = 0x02; //Integer type packet[pos++] = 0x01; //length packet[pos++] = 0x00; //SNMP error status #endregion #region Error index packet[pos++] = 0x02; //Integer type packet[pos++] = 0x01; //length packet[pos++] = 0x00; //SNMP error index #endregion #region Start of variable bindings packet[pos++] = 0x30; //Start of variable bindings sequence packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding packet[pos++] = 0x30; //Start of first variable bindings sequence packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size packet[pos++] = 0x06; //Object type packet[pos++] = Convert.ToByte(miblen - 1); //length #endregion #region Start of MIB packet[pos++] = 0x2b; #endregion #region Place MIB array in packet for (i = 2; i < miblen; i++) packet[pos++] = Convert.ToByte(mib[i]); packet[pos++] = 0x05; //Null object value packet[pos++] = 0x00; //Null #endregion #endregion #region MESAJ HEDEFE YOLLANIYOR Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000); IPHostEntry ihe = Dns.Resolve(host); IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161); EndPoint ep = (EndPoint)iep; sock.SendTo(packet, snmplen, SocketFlags.None, iep); #endregion #region MESAJA GELEN CEVAP ALINIYOR try { int recv = sock.ReceiveFrom(packet, ref ep); } catch (SocketException) { packet[0] = 0xff; } return packet; #endregion } #endregion } }Bu sınıfı yarattıktan sonra aşağıdaki kod ile istediğin verilerin mib değerlerini girerek çekebilirsin.
Not : MIB (Management Information Base)
MIB’ler hiyerarşik bir yapıda kayıtlı tutulan bilgi koleksiyonudur. SNMP’de belirli bir değişkenin değerine ulaşmak için evrensel olarak belirlenmiş bu koleksiyonun ilgili birimi kullanılır. Örneğin bir cihazın üreticisi tarafından atanan cihaz açıklaması için 1.3.6.1.2.1.2 birimindeki bilgiye ulaşmak gerekir. Ağaç yapısında bu rakamların karşılığı iso. identified-organization. Dod. internet. mgmt. mib-2. description değerine karşılık gelmektedir.
//---------------------------------- Send a SysUptime SNMP request ---------------------------------// int commlength, miblength, datatype, datalength, datastart; int uptime = 0; string output; SNMP conn = new SNMP(); byte[] response = new byte[ 1024 ]; response = conn.get( "get", txtHostIP.Text, txtCommunity.Text, "1.3.6.1.2.1.1.4.0" ); if( response[ 0 ] == 0xff ) { richTextBox1.Text += "No response from " + txtHostIP.Text + "\n\n" ; return; } // Get the community and MIB lengths of the response commlength = Convert.ToInt16( response[ 6 ] ); miblength = Convert.ToInt16( response[ 23 + commlength ] ); // Extract the MIB data from the SNMp response datatype = Convert.ToInt16( response[ 24 + commlength + miblength ] ); datalength = Convert.ToInt16( response[ 25 + commlength + miblength ] ); datastart = 26 + commlength + miblength; // The sysUptime value may by a multi-byte integer // Each byte read must be shifted to the higher byte order while( datalength > 0 ) { uptime = ( uptime << 8 ) + response[ datastart++ ]; datalength--; } richTextBox1.Text += "Uptime : " + uptime.ToString() + datatype.ToString() + "\n";Bunlar da işine yarayabilecek kaynaklar;
http://www.rane.com/pdf/ranenotes/SNMP_Simple_Network_Management_Protocol.pdf ---> Bu kaynakta özellikle mesaj tipleri filan açıkca var hocam otur bak kendin yaz daha iyi
http://www.tcpipguide.com/free/t_TCPIPInternetStandardManagementFrameworkandSNMPSta.htm
http://technet.microsoft.com/tr-tr/library/cc783142(d=lightweight,v=WS.10).aspx
