Назад | Перейти на главную страницу

Запрос Citrix по snmp для виртуального принтера, не поддерживающего snmp

Мне нужно предложение, как заставить это работать.

У нас есть сервер печати, на котором есть приложение-конвертер «pcl в pdf», которое прослушивает порт 9001, собирает задания PCL и создает PDF-файлы из PCL. Проблема в том, что приложение pcl to pdf не поддерживает SNMP. Поскольку все это происходит в среде Citrix, Citrix использует протокол snmp для запроса состояния принтера. Мы не можем отключить SNMP в Citrix из-за ограничения ИТ. Из-за всего этого принтер сообщается как отключенный для всех пользователей, и его нельзя использовать.

Когда мы помещаем захват пакетов на нашу машину, мы видим некоторые ловушки / ошибки принтера:

1.3.6.1.2.1.25.3.2.1.5.1

1.3.6.1.2.1.25.3.5.1.1.1

1.3.6.1.2.1.25.3.5.1.2.1

Если бы мы могли каким-то образом имитировать ответы принтера на запросы snmp по указанным выше идентификаторам OID, это решило бы нашу проблему.

Какие-либо предложения?

Мне удалось найти решение своей проблемы.

Я загрузил #SNMP (SNMP на основе C # с открытым исходным кодом) который содержит проект SNMPD (агент SNMP), а затем я написал пару классов, которые обрабатывают OID, на которые я должен был ответить.

По материалам: http://www.oid-info.com/get/1.3.6.1.2.1.25.3.2.1.5

public class hrDeviceStatus : ScalarObject
{
    private readonly Integer32 _value = new Integer32(2); // running 2

    public hrDeviceStatus()
        : base(new ObjectIdentifier("1.3.6.1.2.1.25.3.2.1.5.1"))
    {
    }

    public override ISnmpData Data
    {
        get 
        {
            return _value; 
        }
        set {  }
    }
}

По материалам: http://www.oid-info.com/get/1.3.6.1.2.1.25.3.5.1.1

public class hrPrinterStatus : ScalarObject
{
    private readonly Integer32 _value = new Integer32(1); // other

    public hrPrinterStatus()
        : base(new ObjectIdentifier("1.3.6.1.2.1.25.3.5.1.1.1"))
    {
    }

    public override ISnmpData Data
    {
        get 
            { 
                return _value; 
            }
        set { }
    }
}

По материалам: http://www.oid-info.com/get/1.3.6.1.2.1.25.3.5.1.2

public class hrPrinterDetectedErrorState : ScalarObject
{
    private readonly OctetString _value = new OctetString("\0\0"); // all 16 bits set to 0 

    public hrPrinterDetectedErrorState()
        : base(new ObjectIdentifier("1.3.6.1.2.1.25.3.5.1.2.1"))
    {
    }

    public override ISnmpData Data
    {
        get 
        { 
            return _value; 
        }
        set { }
    }
}

А потом я добавил их в хранилище объектов.

    var store = Container.Resolve<ObjectStore>();
    store.Add(new hrDeviceStatus());
    store.Add(new hrPrinterStatus());
    store.Add(new hrPrinterDetectedErrorState());

Вот и все. Спасибо всем, кто пытался помочь.