Выполните SNMP-обход, используя метод SharpSnmpLib BulkWalk - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь получить MAC-адрес устройства, которое подключается к сети.Моя цель - выполнить WALK, а затем найти результаты по номеру порта, который вызвал событие.

Сначала я получаю информацию о порте через GetRequestMessage (Success).Затем я TRY , чтобы выполнить прогулку, чтобы получить таблицу MAC-адресов.Я не получаю никаких ошибок или исключений, но я также не получаю никаких результатов.

Где я иду не так?

// Capture IPAddress
string ipAddress = e.Sender.Address.ToString();

// Capture the port
string port = e.Message.Scope.Pdu.Variables[0].Data.ToString();

// Setup Authentication with password from App.Config
var auth = new SHA1AuthenticationProvider(new OctetString(_Password));

// Setup Privacy with Phrase from App.Config
var priv = new DESPrivacyProvider(new OctetString(_Phrase), auth);

// Setup username from App.Config
OctetString userName = new OctetString(_Username);

// Create IPEndPoint
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(ipAddress), 161);

// Create discovery
Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);

// Create report
ReportMessage report = discovery.GetResponse(60000, iPEndPoint);

// Setup OID variables to get port information
List<Variable> variables = new List<Variable>
    {
        // Port Description
        new Variable(new ObjectIdentifier($"1.3.6.1.2.1.31.1.1.1.18.{ port }")),
        // Port PVID
        new Variable(new ObjectIdentifier($"1.3.6.1.2.1.17.7.1.4.5.1.1.{ port }")),
        // Voice VLAN
        new Variable(new ObjectIdentifier($"1.3.6.1.4.1.674.10895.5000.2.6132.1.1.1.2.13.1.28.{ port }")),
    };

// Create SNMP request
GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, userName, variables, priv, Messenger.MaxMessageSize, report);

// Send request and get reply
ISnmpMessage reply = request.GetResponse(60000, iPEndPoint);

// Request failed
if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
{
    throw ErrorException.Create(
        "error in response",
        IPAddress.Parse(ipAddress),
        reply);
}

// Store reply information
string Port_Description = reply.Scope.Pdu.Variables[0].Data.ToString(),
    Port_Pvid = reply.Scope.Pdu.Variables[1].Data.ToString(),
    Port_VLAN = reply.Scope.Pdu.Variables[2].Data.ToString();

// Create BulkWalk Discovery 
// TODO: Do I need to do this or can I reuse the original discovery??
Discovery BULKWALK_discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);

// Create BulkWalk report
// TODO: Do I need to do this or can I reuse the original report??
ReportMessage BULKWALK_report = BULKWALK_discovery.GetResponse(60000, iPEndPoint);

// Variable to store the results of the WALK
var BULKWALK_results = new List<Variable>();

// Perform the walk and return the count of results. Community name from App.Config
var BULKWALK_results_count = Messenger.BulkWalk(VersionCode.V3, iPEndPoint, new OctetString(_CommunityName), OctetString.Empty, new ObjectIdentifier($"1.3.6.1.2.1.17.7.1.2.2.1.2"), BULKWALK_results, 60000, 10, WalkMode.WithinSubtree, priv, BULKWALK_report);

Debugger.Break();

РЕДАКТИРОВАТЬ

Кроме того, я использую этот ресурс в качестве руководства.

1 Ответ

0 голосов
/ 01 марта 2019

Итак, я нашел проблему, которая была в два раза.

Первый был при создании Discovery для BulkWalk, он должен быть следующим:

Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetBulkRequestPdu);

Ключевой частью является получение правильного SnmpType (мой код выше SnmpType.GetRequestPdu ине SnmpType.Get Bulk RequestPdu).В учебнике не упоминается, что SnmpType отличается.

Во-вторых, при передаче параметров в метод Messenger.BulkWalk () я передавал имя сообщества, а не имя пользователя.Замечания по исходному коду для метода BulkWalk действительно говорят имя сообщества, но это должен быть пользователь.

Я сделал так, как предложил Лекс Ли, и выполнил / проверил образец snmpwalk, чтобы убедиться в отсутствии проблем.После этого я вернулся и просмотрел исходный код этого примера и обнаружил две проблемы.

...