verbinden und installieren von tcp/ip- druckern

  • mahlzeit!
    ich arbeite gerade an einer kleinen gui, von der aus ich (oder mitarbeiter) einen (oder mehrere) tcp/ip- drucker verbinden kann (/können).
    hostanme/ ip sind in ein input- feld einzutragen, druckermodell über ein dropdown- menü auszuwählen.
    derzeitiger fortschritt:

    Spoiler anzeigen

    #RequireAdmin
    #include <GUIConstants.au3>
    $titel = ("Druckerverbindungsmenü TCP/IP")
    $file1 = FileOpen ("!typen.txt", 0)
    ;~ If $file1 = -1 Then
    ;~ MsgBox(0, "Fehlende Daten!", "!typen.txt scheint zu fehlen!")
    ;~ Exit
    ;~ EndIf
    $data = FileReadLine($file1, 1)
    GUICreate($titel, 280, 180)
    GUICtrlCreateLabel("TCP/IP- Drucker verbinden", 20,15,800)
    GUICtrlSetFont (-1, 9.5, 800, 0, "Arial")
    $hilfe = GUICtrlCreateButton ("?", 250,13,20,20)
    GUICtrlSetTip(-1, "klicken Sie hier, wenn Sie Fragen haben")
    GUICtrlCreateLabel("Hostname oder IP des zu verbindenden Druckers:",20,40)
    $host = GUICtrlCreateInput ("",20,60,240)
    GUICtrlCreateLabel("Gerätetyp:",20,90)
    $typ = GUICtrlCreateCombo ("-bitte wählen-",20,110,240)
    GUICtrlSetData(-1, $data)
    $button1 = GUICtrlCreateButton("Verbinden!",40,145,200)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $button1 ;verbinden
    $treiber = (GUICtrlRead ($typ) & "\")
    $command1 = ("cscript %systemdrive%\windows\system32\prnport.vbs -a -r " & GUICtrlRead($host) & " -h " & GUICtrlRead($host) & " -o raw -n 9100")
    $command2 = ("rundll32 printui.dll,PrintUIEntry /if /b " & GUICtrlRead($typ) & " /f " & GUICtrlRead($treiber) & " /r IP_" & GUICtrlRead($host) & " /m " & GUICtrlRead($typ))

    RunWait(@comspec & ' /c ' & $command1,'',@SW_HIDE)
    Run(@comspec & ' /c ' & $command2,'',@SW_SHOW)
    EndSelect
    WEnd


    im anhang: die .au3, die .txt, in der einige druckertypen angeführt sind und zum testen ein ordner mit treiberdateien für einen dell 3110cn.
    bedanke mich schon mal im voraus für eure fehlerdiagnosen/ vorschläge/ optimierungstips.

    mfg

    p.s.: ich vermute, dass das problem in der syntax von $command2 liegt, da das erstellen des tcp/ip- ports ($command1) problemlos fkt.

  • Hi losh,
    genaueres zu dem cmdrun kann ich nicht sagen, aber es liegt wohl im $command2. Da ist wohl irgendwo ein Fehler drin.
    Den oberen Abschnitt jedoch würde ich so lösen:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <GUIConstants.au3>

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

    Global $data
    $titel = ("Druckerverbindungsmenü TCP/IP")
    $file1 = FileOpen("!typen.txt", 0)
    ;~ If $file1 = -1 Then
    ;~ MsgBox(0, "Fehlende Daten!", "!typen.txt scheint zu fehlen!")
    ;~ Exit
    ;~ EndIf
    $zeile = 1
    While 1
    $read = FileReadLine($file1, $zeile)
    If $read = "" Then ExitLoop
    $data = $data & $read & "|"
    $zeile += 1
    WEnd
    GUICreate($titel, 280, 180)

    [/autoit]

    Dann kannst du deine !typen.txt schön anordnen. Also so:
    Dell 3110cn
    Kyocera FS-C1010N
    Kyocera FS-C5016N


    Edit:
    Versuchs mal mit dieser Zeile:

    [autoit]

    $command2 = ("rundll32 printui.dll,PrintUIEntry /b " & GUICtrlRead($typ) & " /f " & GUICtrlRead($treiber) & " /if /r IP_" & GUICtrlRead($host) & " /m " & GUICtrlRead($typ))

    [/autoit]
  • servus, blubbstar!
    danke erstmal für die rasche antwort.
    dein vorschlag ist sehr brauchbar, da neben mir auch andere admins neue gerätetypen eintragen, und dabei auch die übersicht behalten sollen;) DANKE!
    was den zweiten befehl (die .inf-installation) angeht: der spuckt mir immer noch "vorgang konnte nicht abgeschlossen werden" aus.
    hat irgendwer ne idee, wie das zu lösen sein könnte?

    Spoiler anzeigen

    #RequireAdmin
    #include <GUIConstants.au3>

    global $data
    $titel = ("Druckerverbindungsmenü TCP/IP")
    $file1 = FileOpen ("!typen.txt", 0)
    ;~ If $file1 = -1 Then
    ;~ MsgBox(0, "Fehlende Daten!", "!typen.txt scheint zu fehlen!")
    ;~ Exit
    ;~ EndIf
    $zeile = 1
    while 1
    $read = FileReadLine($file1, $zeile)
    If $read = "" then ExitLoop
    $data = $data & $read & "|"
    $zeile += 1
    WEnd
    GUICreate($titel, 280, 180)
    GUICtrlCreateLabel("TCP/IP- Drucker verbinden", 20,15,800)
    GUICtrlSetFont (-1, 9.5, 800, 0, "Arial")
    $hilfe = GUICtrlCreateButton ("?", 250,13,20,20)
    GUICtrlSetTip(-1, "klicken Sie hier, wenn Sie Fragen haben")
    GUICtrlCreateLabel("Hostname oder IP des zu verbindenden Druckers:",20,40)
    $host = GUICtrlCreateInput ("",20,60,240)
    GUICtrlCreateLabel("Gerätetyp:",20,90)
    $typ = GUICtrlCreateCombo ("-bitte wählen-",20,110,240)
    GUICtrlSetData(-1, $data)
    $button1 = GUICtrlCreateButton("Verbinden!",40,145,200)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $button1 ;verbinden
    $treiber = (GUICtrlRead ($typ) & "\")
    $command1 = ("cscript %systemdrive%\windows\system32\prnport.vbs -a -r " & GUICtrlRead($host) & " -h " & GUICtrlRead($host) & " -o raw -n 9100")
    $command2 = ("rundll32 printui.dll,PrintUIEntry /b " & GUICtrlRead($typ) & " /f " & GUICtrlRead($treiber) & " /if /r IP_" & GUICtrlRead($host) & " /m " & GUICtrlRead($typ))
    ;$command2 = ("rundll32 printui.dll,PrintUIEntry /if /b " & GUICtrlRead($typ) & " /f " & GUICtrlRead($treiber) & " /r IP_" & GUICtrlRead($host) & " /m " & GUICtrlRead($typ))

    RunWait(@comspec & ' /c ' & $command1,'',@SW_HIDE)
    Run(@comspec & ' /c ' & $command2,'',@SW_SHOW)
    EndSelect
    WEnd

  • Hai,
    soweit mir bekannt, kann ich einen IP-Druckerport nur mit der prnadmin.dll erzeugen (MS-Tool aus Ressource-Kit).
    Allerdings stammt diese Erfahrung aus der W2k-Welt, unter XP: keine Ahnung, unter Vista kann man (frau auch) IP-Ports mit der Prnadmin.dll anlegen (vb-Scripte).

    Viel Spass!

  • Das GuiCtrlRead($treiber) ist falsch, du musst den $treiber nicht auslesen ;). Aber das führt auch nicht zur Problemlösung. Außerdem gibst ja unter /f nur den Pfad noch an, aber nicht die inf Datei, das verstehe ich nicht ganz.

    Edit:
    Habe etwas rumgespielt ;) Jetzt komme ich schon ziemlich weit :D

    [autoit]

    $command2 = ('rundll32 printui.dll,PrintUIEntry /b "' & GUICtrlRead($typ) & '" /f "' & @scriptdir & '\' & $treiber & 'dlxbuzi.inf" /r "IP_'& GUICtrlRead($host) & ':" /m "' & GUICtrlRead($typ) & '" /if')

    [/autoit]

    Vielleicht hilf dir das ja.

  • n'abend!
    sorry, dass ich erst jetzt antworte...war die meiste zeit damit beschäftigt, rechner von A nach B (das ganze natürlich über Z) zu schippern...-> bin im "client management" eines grossen schulungsunternehmens mit vielen aussenstandorten tätig.
    meine frage wäre jetzt: ist es möglich, ein verzeichnis auf dateitypen (in konkrenten fall EINE .inf) zu durchsuchen, und deren dateinamen auszulesen?

    mfg
    losh

    • Offizieller Beitrag

    Hallo,

    mit _FileListToArray,
    in deinem Fall _FileListToArray ( $Verzeichnis, "*.inf", 1), gibt alle inf dateien im angegebenen Verzeichnis in einem Array zurück!

  • bernd670
    hi!
    als anfänger weiss ich halt noch nicht so ganz, wie ich das einsetzen soll.
    was ich mir vorstelle, wäre in etwa sowas:
    _FileListToArray ( $Verzeichnis, "*.inf", 1)
    $inf = name der ersten (und einzigen) inf datei

    • Offizieller Beitrag

    Hallo,

    [autoit]

    #Include <File.au3>

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

    $aInfList=_FileListToArray($szVerzeichnis, "*.inf", 1)
    If @Error = 1 Then
    MsgBox (0,"","keine INF-Datei gefunden!")
    Exit
    EndIf

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

    ; $aInfList[0] enthält die anzahl der Dateien
    ; $aInfList[1] - %aInfList[n] enthält die Dateinamen der gefundenen INF-Dateien

    [/autoit]

    wenn es im angegebene Verzeichnis nur eine INF-Datei gibt (also $aInfList[0] = 1) dann enthält $aInfList [1] den gefundenen Dateinamen!

    Mal eine andere Frage:

    Hast Du vor auf mehreren Rechnern für den gleichen Drucker eine Druckerwarteschlange einzurichten? Das ist eingentlich unüblich, normalerweise richtet man im Netzwerk auf einem Server die Druckerwarteschlangen für die Drucker ein und gibt sie frei, dann können sich alle Nutzer mit normalen Rechten auf die Drucker verbindenen!

  • yeah!
    dank eurer zahlreichen tips bin ich jetzt echt schon kurz vor der "komplettierung"^^
    standard tcp/ip port wird erstellt, treiber wird mittels .inf installiert,
    ABER: das ganze schliesst mir immer mit der fehler meldung "die argumente sind ungültig" ab...der installierte drucker kann dem port offensichtlich nicht zugeordnert werden.
    jmd eine idee?
    die "aufgelöste" syntax von $command2 sieht so aus:

    Spoiler anzeigen

    rundll32 printui.dll,PrintUIEntry /b "Dell Color Laser 3110cn PCL6" /f "D:\Eigene Dateien\projekte\druckerverbindung\Dell Color Laser 3110cn PCL6\dlxbuzi.inf" /r "IP_test:" /m "Dell Color Laser 3110cn PCL6" /if

    rundll32 printui.dll,PrintUIEntry /b "Kyocera Mita FS-C5016N" /f "D:\Eigene Dateien\projekte\druckerverbindung\Kyocera Mita FS-C5016N\oemsetup.inf" /r "IP_test:" /m "Kyocera Mita FS-C5016N" /if


    ich verwende in der typenliste (!typen.txt) und bei der benennung der treiberordner die namen, wie sie in der "model"- section der jeweiligen .inf datei angegeben sind.
    im anhang die aktuelle .au3 und im unterordner "druckerverbíndung" die typenliste und ein (diesmal vollständiger *g*) ordner mit treiberdateien (kyocera c5016n).
    könnte natürlich zum testen auch mehr treiber hochladen, jedoch fkt das auslesen der jeweiligen .inf mittlerweile problemlos (danke bernd670! :thumbup: ).

    bernd670 : extrem hilfreich, danke!!
    zu deiner frage: bei den rund 900 druckern (zahl steigend), die auf unseren standorten im einsatz sind, sind ca. 20% an einen printserver angebunden...bei den restlichen lässt es sich entweder nicht realisieren (kleiner standort, kein server, etc., etc.), oder ist nicht gewünscht...
    klar, per logon- batch freigegebene netzwerkdrucker verbinden zu lassen sollte -auch meiner meinung nach- für jeden admin die zu bevorzugende variante sein!

    mfg