Umbenannt: Installierte Drucker Remote auslesen

  • Hallo liebe AutoITer,

    ich habe folgendes Problem:

    Innerhalb eines GUI verwende ich eine InputBox. In diese kann/soll der Anwender einen bestimmten Wert eingeben der dann an weitere Funktionen übergeben werden und dann damit weiter gearbeitet werden soll.

    Natürlich soll der Anwender ohne die Anwendung zu schließen und wieder zu öffnen, den Wert verändern können und mehrere Abfragen nacheinander durchführen können.

    Aktuell klappt das ganze leider nur einmal.

    Ändere ich den Wert in der Inputbox und führe die Abfrage erneut aus, wird die Variable nicht verändert weitergegeben.

    Wie gehe ich das am Besten an?

    Hier mal der derzeitige Code:

    Ich hoffe wie immer auf eure Unterstützung.

  • Ich kann es dir nicht genau sagen was falsch läuft, aber dein Fehler liegt in der For Next Schleife

    der Funktion Printerinfo.

    Bist du sicher daß du nur auf @error -1 prüfen willst. Ersetze das mal versuchsweise durch If @error <> 0

  • Ich kann es dir nicht genau sagen was falsch läuft, aber dein Fehler liegt in der For Next Schleife

    der Funktion Printerinfo.

    Bist du sicher daß du nur auf @error -1 prüfen willst. Ersetze das mal versuchsweise durch If @error <> 0

    Hi Tuxedo,

    vielen Dank für deine Antwort.

    habe es versuchsweise mal von @error = -1 auf @error <> 0 gesetzt - das Ergebnis bleibt aber unverändert.

    Was ich allerdings mal geändert habe ist folgendes:

    Ich übergebe der Funktion printerInfo() jetzt die Variable $sComputer und erhalte dann auch ein korrektes Ergebnis mit dem Wert aus der InputBox.

    Wenn ich dann den Wert der Variablen in der InputBox ändere und erneut abfrage, erhalte ich auch neue Daten, die ebenfalls korrekt sind.

    Wenn ich dann aber in die Liste klicke, werden mir wieder die alten Werte angezeigt.

    Also habe ich noch irgendeinen Fehler in der GUI das er sich den aktuellen Status nicht sauber zieht.

    Hier mal der abgeänderte Code:

  • Hallo Lashandan!

    Du musst dir in der Hilf noch einmal die Funktionsweise einer Gui anschauen.

    Und ich nenne es mal den eigentlichen Programm Code mit Funktionen zu mischen ist sehr unübersichtlich.

    Standard ist es die Funktionen unterhalb des Hauptcodes zu erstellen.

    Wenn du SciTE verwendest, dann bitte verwende das Tool --> Tidy Autoit Source.

    Dieses Tool bringt deinen Code in eine übersichtlichere Form.

    Das hilft ungemein.

    Dein Programm wird einmal abgearbeitet und bleibt dann in der While Schleife hängen. edit: das ist nicht ganz richtig, aber du verwendest den GUIOnEventMode und das ist soweit ich es beurteilen kann in diesem Fall nicht der richtige.

    Deshalb der Hinweis dir noch einmal die Funktionsweise einer Gui anzusehen.

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (15. März 2019 um 11:42)

  • Deine Abfrage ist ja auch verkehrt (Die Korrektur gibst du dir eine Zeile drüber schon vor):

    Code
    Func Abfragen()
        ;MsgBox(0, "", GUICtrlRead($sComputer))
        printerInfo($sComputer)
    EndFunc

    Müsste die nicht so heißen:

    Code
    Func Abfragen()
        printerInfo(GUICtrlRead($sComputer))
    EndFunc

    Oder bin ich jetzt verkehrt?

  • Zuerst einmal deklarierst du in einem Globalen Bereich eine lokale Variable.

    Anschließend definierst du sie mit einem GuiCtrl Handle.

    Später setzt du die Variable wieder auf einen Empty String.

    Das Problem ist jetzt aber, dass du die Variable dann nicht mehr nutzen kannst,

    da sich das Objekt quasi nicht mehr darin befindet. Dennoch tust du es mit Guictrlread() .:(

    Gemeint ist:

    Code
    $sComputer = ''

    Diese Zeile würde ich löschen, da sie aus meiner Betrachtung keinen Sinn ergibt.

    Empfehlenswert wäre GuiGetMsg() statt GUICtrlSetOnEvent(). Ist aber

    rein subjektiv betrachtet. Dann bräuchte man auch kein Sleep() mehr.

  • So noch schnell vor dem Wochende!

    Hier meine quick and dirty Umsetzung.

    Der Code ist alles andere als getestet und eineiges ist noch zu machen.

    Aber es sollte eine Basis darstellen.

    Spoiler anzeigen

    edit : Was ich noch schreiben wollte ist, dass du HKEY_CURRENT_USER zwar remote auslesen kannst, aber soweit ich weiß ist das nicht der User der gerade an der Maschine angemeldet ist, sondern der mit dem du das Script aufgerufen hast.

    If not :?: then ?( else :thumbup:

    3 Mal editiert, zuletzt von Concara (15. März 2019 um 13:04)

  • Vielen Dank an der Stelle für eure Hilfe.

    Habe hier mal den aktuellen Code der soweit auch ganz gut funktioniert wie ich mir das vorgestellt habe:

    Concara hast du eine Idee wie ich das Problem mit dem Auslesen der installierten Drucker per remote löse?

    Habe schon verschiedene Pfade gefunden aber diese liefern mir leider nicht die selben Informationen:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-3

    Oder gibt es noch eine ganz andere Möglichkeit die installierten Drucker auszulesen?

  • Hallo Lashandan!

    Also ja es gibt noch den HKEY_USER Zweig in der Registry.

    Computer\HKEY_USERS\S-1-5-21-2320686219-2347650492-1140758951-1001\Software\Microsoft\Windows NT\CurrentVersion\Devices

    Ich habe in der Arbeit noch ein Script, das die Id zu einem User herausfindet. Ich werde morgen nachsehen, bin nicht mehr in der Arbeit.

    Ich nehme mal an du schreibst dieses Tool für eine kleine Firma.

    Deshalb habe ich auch das requireAdministrator eingefügt.

    Ist es eine AD Domaine?

    Eine Workgroup ?

    Ohne Administratorenrechte auf den Jeweiligen PCs kannst du rein garnichts auslesen, auch nicht mit den unten angegebenen VBS Scripts.

    Was genau willst du mit dem Programm eigentlich erreichen?

    Denn wenn es eine Firma ist, dann werdet ihr doch eher einen Printserver verwenden.

    Auf diesem werden dann die Standardeinstellungen vorgegeben.

    Wenn es eine AD Domaine ist, dann kann man auch per GPOs Einstellungen vornehmen.

    Oder habt ihr sehr viele Drucker die per USB am jeweiligen PC angeschlossen sind?

    Zum Managen der Drucker gibt es ab Windows 7 eventuell auch schon Vista diesen Ordner (C:\Windows\System32\Printing_Admin_Scripts\de-DE) mit VBS Scripten.

    Info unter https://docs.microsoft.com/de-de/windows-…ommands/prncnfg

    If not :?: then ?( else :thumbup:

  • Hey Concara ,

    ich werde morgen ebenfalls mal den HKEY_USER Zweig testen.

    Und du liegst völlig richtig in deiner Annahme.

    Ich arbeite in einem Unternehmen mit über 500 Rechnern - und wir verwenden für die Rechner eine AD-Domain.

    Für die meisten Drucker haben wir einen Printserver, dennoch haben wir auch einen beachtlichen Teil an Druckern die lokal per USB angeschlossen sind.

    Die Adminrechte habe ich ausnahmslos.

    Ich möchte ganz simpel folgendes erreichen;

    - Rechnernamen eingeben und den installierten Standarddrucker angezeigt bekommen, weiterhin natürlich auch alle anderen Drucker die für den jeweiligen Rechner installiert sind.

    - viele Rechner haben die klassischen PDF-Printer und einen Hauptdrucker der über den Printserver kommt - dieser ist auch gleichzeitig der Standarddrucker

    - Wir haben aber auch viele Rechner die an mehreren Orten in unserem Unternehmen drucken müssen

    - je granularer und genauer das Skript arbeitet, desto besser

    Ich möchte nichtmal zwingend die Einstellungen der Drucker ändern.

    In der Praxis reicht es mir, angezeigt zu bekommen an welchem Rechner welche Drucker installiert sind.

    Einstellungen, Testseiten drucken usw. ist nur ein kleiner Bonus für den Anwender.

    Die GPOs werden bei uns vom Mutterkonzern vorgegeben und darauf habe ich nur bedingten Einfluss.

    Ich werde morgen nochmal ein bisschen testen.

    Freue mich von dir zu lesen und warte gespant auf dein Skript für die ID zum jeweiligen User ;)

    Bis dahin erstmal,

    gute Nacht :sleeping:

  • Lashandan 19. März 2019 um 01:05

    Hat den Titel des Themas von „Zurücksetzen von InputVariable“ zu „Umbenannt: Installierte Drucker Remote auslesen“ geändert.
  • Lashandan 19. März 2019 um 01:05

    Hat das Label [ offen ] hinzugefügt.
  • Hallo Lasandan,

    über Powershell kannst du die Ausgabe wie folgt machen (funktioniert auch als normaler User auf einen Export Pfad wo der User Schreibrechte hat).

    get-WmiObject -class Win32_printer | ft name, systemName, shareName >> d:\printers.txt

    Das sollte die Netzwerk und lokal installierten Drucker beinhalten.

    Gruß gmmg :)

  • Hi Lashandan!

    Sorry ich hatte etwas Stress in der Arbeit, deshalb erst jetzt meine Rückmeldung.

    Hier der Code der dir ID zum Username findet. Es ist eine wimc Abfrage. Leider Dauert die etwas.

    Spoiler anzeigen

    If not :?: then ?( else :thumbup:

  • Die SID lässt sich auch im AD auslesen ...

    Gruß gmmg

  • Oder gibt es noch eine ganz andere Möglichkeit die installierten Drucker auszulesen?

    Ja, gibt es... hier ein Bsp.:

  • Hallo nochmal in die Runde und nochmal vielen Dank an alle Helfer. :thumbup::party::klatschen::thumbup:

    Letztlich hat mich der Code von Bitnugger am meisten zum Ziel geführt. :theke:

    Hier nun also der finale Code:

    Habe mich allerdings noch dazu entschlossen die Funktionen für die Druckeinstellungen etc. vorerst auszukommentieren.

    Wenn ich hierfür mal wieder mehr Zeit habe, werde ich mich da nochmal ransetzen.

  • Lashandan 2. April 2019 um 11:32

    Hat das Label von [ offen ] auf [ gelöst ] geändert.