SNMP UDF Wer macht mit ?

  • Hay vielleicht hatt ja noch jemand lust sich den kopf zu zerbrechen...:D

    Ausgangssituation ist ich muss snmp abfragen von Druckern abfragen...
    Wer sich mal länger mit snmpget beschäftigt hatt wird festgestellt haben, das es a) Gut CPU braucht b) relativ langsam ist und c) handles produziert und sie offen lässt solange die compilierte exe läuft.

    Nun schwacher ansatz aber fangen wir mal an

    [autoit]

    func snmpget ($ipadress,$port,$community,$oid)
    $socket = UDPOpen ($ipadress,$port)
    UDPSend ($socket,$oid)
    $oid = UDPRecv ($socket,???,0)
    UDPCloseSocket ($socket)
    Return $oid

    EndIf

    [/autoit]

    Jetzt werdet ihr bestimmt lachen weil das alles andere als funktioniert aber das ist so mein erster denkansatz :D

    • Offizieller Beitrag

    Ich hab mit SNMP selber nix zu tun - aber ich hab Quellen :D
    Vielleicht ist diese WMI-Variante etwas, was du verwenden kannst? Hab da noch ein paar Skriptbeispiele (System Group Information, TCP und UDP Verbindungen und Listening Ports)

    Bsp.

    SNMP MIB-II Interface Table Information
    [autoit]

    $strTargetSnmpDevice = "192.168.0.1"

    $objWmiLocator = ObjCreate("WbemScripting.SWbemLocator")
    $objWmiServices = $objWmiLocator.ConnectServer("", "root\snmp\localhost")

    $objWmiNamedValueSet = ObjCreate("WbemScripting.SWbemNamedValueSet")
    $objWmiNamedValueSet.Add ("AgentAddress", $strTargetSnmpDevice)
    $objWmiNamedValueSet.Add ("AgentReadCommunityName", "public")

    $colIfTable = $objWmiServices.InstancesOf("SNMP_RFC1213_MIB_ifTable", , $objWmiNamedValueSet)

    For $$objInterface In $colIfTable
    MsgBox(0, '', _
    "ifIndex [Key]: " & $objInterface.ifIndex & @CRLF & _
    " ifAdminStatus: " & $objInterface.ifAdminStatus & @CRLF & _
    " ifDescr: " & $objInterface.ifDescr & @CRLF & _
    " ifInDiscards: " & $objInterface.ifInDiscards & @CRLF & _
    " ifInErrors: " & $objInterface.ifInErrors & @CRLF & _
    " ifInNUcastPkts: " & $objInterface.ifInNUcastPkts & @CRLF & _
    " ifInOctets: " & $objInterface.ifInOctets & @CRLF & _
    " ifInUcastPkts: " & $objInterface.ifInUcastPkts & @CRLF & _
    " ifInUnknownProtos: " & $objInterface.ifInUnknownProtos & @CRLF & _
    " ifLastChange: " & $objInterface.ifLastChange & @CRLF & _
    " ifMtu: " & $objInterface.ifMtu & @CRLF & _
    " ifOperStatus: " & $objInterface.ifOperStatus & @CRLF & _
    " ifOutDiscards: " & $objInterface.ifOutDiscards & @CRLF & _
    " ifOutErrors: " & $objInterface.ifOutErrors & @CRLF & _
    " ifOutNUcastPkts: " & $objInterface.ifOutNUcastPkts & @CRLF & _
    " ifOutOctets: " & $objInterface.ifOutOctets & @CRLF & _
    " ifOutQLen: " & $objInterface.ifOutQLen & @CRLF & _
    " ifOutUcastPkts: " & $objInterface.ifOutUcastPkts & @CRLF & _
    " ifPhysAddress: " & $objInterface.ifPhysAddress & @CRLF & _
    " ifSpecific: " & $objInterface.ifSpecific & @CRLF & _
    " ifSpeed: " & $objInterface.ifSpeed & @CRLF & _
    " ifType: " & $objInterface.ifType )
    Next

    [/autoit]
    Printer Port Properties
    [autoit]

    $strComputer = "."
    $objWMIService = ObjGet("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

    [/autoit] [autoit][/autoit] [autoit]

    $colPorts = $objWMIService.ExecQuery _
    ("Select * from Win32_TCPIPPrinterPort")

    [/autoit] [autoit][/autoit] [autoit]

    For $objPort in $colPorts
    MsgBox(0, '', "Description: " & $objPort.Description & @LF & _
    "Host Address: " & $objPort.HostAddress & @LF & _
    "Name: " & $objPort.Name & @LF & _
    "Port Number: " & $objPort.PortNumber & @LF & _
    "Protocol: " & $objPort.Protocol & @LF & _
    "SNMP Community: " & $objPort.SNMPCommunity & @LF & _
    "SNMP Dev Index: " & $objPort.SnMPDevIndex & @LF & _
    "SNMP Enabled: " & $objPort.SNMPEnabled )
    Next

    [/autoit]
  • Tip Top da haben wir ja schonmal Ansätze.

    Son udp beispiel wäre richtig lecker vielleicht könnte man es ja damit abdeken ohne wmi schnitstelle.
    Wäre top wenn du mal ein UDP beispiel einstellen könntest, hab noch nie damit gearbeitet.

    Danke

  • [autoit]

    UDPStartup ()
    $socket = UDPOpen ("10.10.3.213",161)
    If @error <> 0 Then
    MsgBox (0,"Fehler","Fehler beim Verbinden zum Drucker !")
    EndIf

    $status = UDPSend($socket,".1.3.6.1.2.1.43.10.2.1.4.1.1")
    If $status = 0 then
    MsgBox(0, "ERROR", "Error while sending UDP message: " & @error)
    Exit
    EndIf

    [/autoit]

    Ich frag mich gerade nur wie hol ich die Antwort ab... hab mich mal dann mit udpbind und udprecv beschäftigt glaub aber das ich da aufm Hollzweg bin....