ControlSend sendet Text nur Lower-Case

  • Hallo Zusammen,

    woran kann es liegen, daß ControlSend den Inhalt eines String nur lower-case an ein Fenster sendet?

    Konkret sende ich mit ControlSend einen Benutzernamen an ein Putty-Fenster. Der Benutzername besteht jedoch aus großen und kleinen Buchstaben. Da ControlSend alles klein sendet, wird das Anmelden am System verweigert. Gleiches gilt in der Folge auch für das Senden des Passworts:

    Code
    ControlSend($WinHandle,"",$WinHandle,$UserName,1)


    Wenn ich dem Putty-Fenster den gleichen String mit Send schicke, dann klappt alles soweit:

    Code
    Send($UserName,1)

    Hierbei muß das Putty-Fenster jedoch immer OnTop und aktiviert sein - bei ControlSend kann ich es hiden. Insofern würde ich gerne ControlSend verwenden.

    Hat jemand von euch evtl. eine Idee hierzu?

    Besten Dank vorab,
    viele Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Oscar & Zeitriss,

    ... ja, ControlSetText sendet aber gar nichts ans Fenster.

    Zeitriss: Ich hatte schon gesucht, aber nichts im Forum gefunden. Ich denke, ich schaue auch mal ins englische Forum.

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi,

    Zeitriss: Ich hatte schon gesucht, aber nichts im Forum gefunden. Ich denke, ich schaue auch mal ins englische Forum.

    Hattest du folgendes schon versucht?

    AutoIt
    $sString = "Test"
    $sPattern = "([A-Z_!§$%&\(\)\{\}\;'])"
    $sString = StringregexpReplace($sString ,$sPattern ,"+$1")
    ControlSend( , , ,$sString, 0)
    ;---------------------------------------------------------
    $sString = "Test"
    $sPattern = "([A-Z_!§$%&\(\)\{\}\;'])"
    $sString = StringregexpReplace($sString ,$sPattern ,"{$1}")
    ControlSend( , , ,$sString, 0)

    Ich hatte das im oben verlinkt Beitrag jemandem mit einem ähnlichem Problem vorgeschlagen.
    Allerdings weiß ich nicht ob es damals funktionierte, da der Fragesteller nicht erzählte, wie er es am ende umgesetzt hatt.

    mfg
    Zeitriss

  • Diese Anregung aus dem englischen AutoIt-Forum fand ich interessant:

    AutoIt
    $UserName = "MaxMustermann"
    $UserName = StringRegExpReplace($UserName, '[[:upper:]\W]', "{SHIFTDOWN}{$0}{SHIFTUP}")
    ControlSend($WinHandle,"",$WinHandle,$UserName,1)

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Diese Anregung aus dem englischen AutoIt-Forum fand ich interessant:

    Hehe... isjama ne echt coole Idee! ;)

    Ähnliche Probleme hatte ich z. B. auf Win 7 mit "Synergy" - bei allen Tastatureingaben, die zu einem anderen PC gesendet werden sollen, wurden die Großbuchstaben ausgefiltert... und ich meine gelesen zu haben, dass Microsoft diese Nettigkeit aus sicherheitstechnischen Gründen implementiert hat. Demzufolge wird der Tipp, den @Micha_he hier angeführt hat, sicher auch keine dauerhafte Lösung sein.

  • Hi,

    woran kann es liegen, daß ControlSend den Inhalt eines String nur lower-case an ein Fenster sendet?

    wer weiß, was er tut und das System verstanden hat, und dazu ggf. auch die Hilfe lesen kann, ist (wie so oft) besser dran
    Gesendet werden TASTENDRÜCKE einer Tastatur, genau wie in der Hilfe beschrieben. Dort steht

    ControlSend arbeitet ähnlich wie Send, aber es kann Tastendrücke direkt an ein beliebiges Fenster bzw. Control senden und nicht nur
    an das gerade aktive Fenster.


    Weiterhin der Hinweis (bzgl. Putty)


    Nur bei Kommandozeilen-Fenstern (DOS-Boxen) arbeitet ControlSend unzuverlässig, weil diese anders funktionieren als normale Fenster (scheint physische Zustände zu überprüfen, anstatt den String entgegen zu nehmen).

    "unzuverlässig" bedeutet, dass genau der vom TE beobachtete Vorgang ausgeführt wird, nämlich dass die "normalen" Tastenanschläge (wie auch so vorgesehen) gesendet werden!


    Wenn man also Tastenanschläge simulieren will, tut man gut daran, das auch zu tun! Wenn man an ein Control "ABC" senden will, dann gehört dazu die Shift-Taste gedrückt!
    Oder würdet ihr einen Thread erstellen mit dem Titel:"Wenn ich im Editor abc eingebe, dann wird dort abc angezeigt, ich will aber ABC haben!"

    Die Scripte von Zeitriss in Post #5 beschreiben den Ersatz von + statt {SHIFT}, was funktionieren sollte. Bei {T} als Ersatz für ein großes T wäre ich mir nicht sicher, ich würde, allein aus Verständnisgründen für die Funktion des Scripts, {SHIFT}t vorziehen.

  • Hallo Zusammen,

    ... bitte entschuldigt, daß ich mich erst jetzt wieder zum Thema melde.

    Im englischen Forum gab es jede Menge Hinweise und Scripte zum Thema, leider hat keins wirklich zuverlässig (wie von Andy auch beschrieben) funktioniert. Daher werde ich die beiden Scripte von Zeitriss und Micha_He auf jeden Fall gleich einmal ausprobieren.

    Andy: Ja, Du hast Recht. Ich hatte zwar im Manual nachgelesen, aber es einfach nicht so verstanden. Nun ist es mir klarer, Danke dafür. Ich probiere das mal mit einem statisch zusammengebauten String aus ...

    In dem Zusammenhang: Ich habe ebenfalls versucht, ein Passwort mit einem Sonderzeichen "@" an das Putty-Fenster zu senden, aber das Zeichen wird einfach ignoriert. Hat jemand von euch hierzu evtl. auch einen Tipp?

    Danke vorab,
    viele Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hallo Zusammen!

    Micha_he: Das Script funktioniert. Allerdings löscht mir die Expression die Leerzeichen aus dem String (aus "Max Mustermann" wird MaxMustermann).

    Zeitriss: Beide Scripte funktionieren. Ich werde das mal eine Zeit ausprobieren und schauen, ob es da noch irgendwelche Problemchen gibt.

    Nochmals besten Dank für eure Hilfe,
    viele Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hallo Zusammen,

    ... doch leider zu früh gefreut: Alles funktioniert - aber leider nur solage Putty das aktive Top-Window ist. Wenn Putty nicht das aktive Window ist, dann wird zwar alles ins Terminalfenster gesendet, aber leider nur in lower case. ;(

    Auf der Basis eines Scripts aus https://autoit.de/www.autoitscript.com und euren Tipps habe ich mal nachfolgendes abgewandelt:

    Code
    $Text = '"Max Mustermann (Test Test)"'
    $Laenge = StringLen($Text)
    For $i = 1 To $Laenge
      If StringIsUpper(StringMid($Text,$i,1)) Then
        $ControlText = $ControlText & StringReplace(StringMid($Text,$i,1),StringMid($Text,$i,1),"{SHIFTDOWN}{" & StringMid($Text,$i,1) & "}{SHIFTUP}")
      Else
        $ControlText = $ControlText & StringMid($Text,$i,1)
      EndIf
    Next ;$i


    Das ist zwar langsam, funktioniert aber zumindest dann, wenn Putty aktives Top-Window ist oder aber durch ein anderes Fenster verdeckt wird. Ist Putty jedoch sichtbar aber kein aktives Window, dann sendet ControlSend anstelle von Anführungszeichen eine 2 und anstelle von Klammer auf bzw. zu eine 8 bzw. eine 9. Ist schon irgendwie schräg ... :)

    Ich probiere noch etwas rum, bin natürlich auch für weitere Ideen überaus dankbar.

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Gibt es nicht auch bessere Wege Putty bzw. SSH Sessions zu automatisieren? Eine kurze google Suche mit den passenden Begriffen lässt mich dies jedenfalls vermuten. Consolen-Programme wie Putty via Send/Controlsend zu automatisieren wäre mir jedenfalls viel zu heikel und unzuverlässig.

    Bei der Arbeit nutzen wir in einem unserer BatchScripte z.B. WinScp in Verbindung mit einem Commando Script um lokale Backup-Dateien des Linux Hosts auf einen zentralen File Server zu übertragen. Ich nehme an mit Putty ist ähnliches machbar.

  • Hallo Zusammen,

    ... natürlich habe ich es auch schon mit plink.exe versucht, aber die WLCs von Cisco verlagen ein "Enter" VOR dem Login und damit scheitert der Verbindungsaufbau. Es klappt (derzeit) wirklich nur mit dem Putty - wenn ich dem Fenster zuerst ein "Enter" sende und dann die Login-Daten ...

    Und ja - ihr habt Recht: Es ist ziemlich unzuverlässig. ;(

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hehe... ja, wie erkläre ich dass... ok, ich versuche es mal so...

    Mit dem Echo-Befehl sendest du via Pipe "|" einen leeren String, der mit einem @CRLF bzw. @CR (Enter) abgeschlossen ist, an den Befehl plink, der es dann quasi 1:1 weiterreicht.

    Hier ein Beispiel:

    Bash
    C:\Users\ghost>COMP m:\for.cmd m:\Temp\for.cmd
    Vergleichen von M:\for.cmd und M:\Temp\for.cmd...
    Dateien sind identisch
    
    
    Weitere Dateien vergleichen (J/N) ?


    Hier nervt es mich, dass ich COMP nicht benutzen kann, ohne dass er mir dumme Fragen stellt... und mit einem vorangestelltem Echo-Befehl geben wir ihm nun eine "automatisierte" Antwort...

    Bash
    C:\Users\ghost>echo n | COMP m:\for.cmd m:\Temp\for.cmd
    Vergleichen von M:\for.cmd und M:\Temp\for.cmd...
    Dateien sind identisch
    
    
    Weitere Dateien vergleichen (J/N) ?
    C:\Users\ghost>


    In diesem Fall hat Echo ein "n" an COMP übergeben... und COMP hat somit seine Antwort bekommen, das n, welches ich sonst manuell hätte eingeben müssen.

    Kannst es ja einfach mal bei dir am PC testen...

    Einmal editiert, zuletzt von Bitnugger (9. November 2016 um 12:57)

  • ... sehr sehr gut erklärt. :klatschen:

    Ich werde das gleich morgen früh mal probieren. Klingt auf jeden Fall sehr interessant - und ist allemal ein Versuch wert! :)

    Danke Dir. :thumbup:

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Bitnugger,

    ... sorry, das klappt leider auch nicht - wäre natürlich zu schön gewesen. ;(

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]