none
Tastencodes aus RDP Sitzung an Hostpc Durchreichen RRS feed

  • Frage

  • Hallo Forum,

     

    Ich habe eine nicht alltägliches Problem, ich soll einen Tastendruck in einer RDP Verbindung(Windows 2003 Server) isolieren und an den Windows Vista Pc der die RDP Verbindung aufgebaut hat durchreichen.

     Hat jemand eine Idee wie das geht?

    Ich hatte schon daran gedacht ein Datei als Flag in ein Bestimmtes Verzeichnis zusetzen , und auf dem Lokale Pc dieses mit einem Watcher zu überwachen, nur halte ich die Lösung für nicht besonders gut

     

    Hat jemand eine bessere Idee

     

    Besten Dank im Voraus

     

    Bernhard

    <object height="0" id="plugin0" style=";z-index:1000;" type="application/x-dgnria" width="0"><param name="tabId" value="ff-tab-0" /><param name="counter" value="3" /></object>
    Samstag, 3. November 2012 21:14

Antworten

  • Hallo Bernhard,

    Poste bitte deinen gesamten, nicht funktionierenden Code. Du verwendest - wie es aussieht, und anders als ich - eine Konsolenanwendung. Und das ist schon mal keine besonders gute Voraussetzung für einen Low-Level-Keyboard-Hook.

    SetWindowHookEx() bzw. die LowLevelKeyboardProc-Callback-Funktion benötigen eine funktionierende Nachrichtenpumpe in der Anwendung (und das ist mit Konsolenanwendungen nicht ganz trivial einzurichten). Ohne Nachrichtenpumpe wird dem aktiven RDP-Client aber womöglich zu viel CPU-Zeit eingeräumt, Verarbeitungszeit die dem empfangenden Programm dann fehlt. Deine Consolen-Anwendung kommt vermutlich einfach nicht zum Zug, da der Thread der den Hook installiert hat, die Windows-Nachricht nie, oder nur sporadisch empfängt. Weitere Details findest Du in der Dokumentation zur LowLevelKeyboardProc (Link weiter oben).

    Man muss auch beachten, dass jede Window Station eine eigene Nachrichtenschleife hat, d.h. falls der RDP-Client in einer Window Station läuft, und das empfangende Programm in einer anderen, gibt es für die Nachrichten keinen Weg dieses Boundary zu durchbrechen.

    Auch gelten für die Anwendung bzw. für die Remote Desktop Session u.U. verschiedene Sicherheitskontexte, die sich positiv/nachteilig auf die Fähigkeit auswirken, Tastaturanschläge abzufangen.

    Gruß
    Marcel

    • Als Antwort markiert BerndSch111 Mittwoch, 7. November 2012 08:40
    Dienstag, 6. November 2012 08:42
    Moderator

Alle Antworten

  • Hallo Bernhard,

    Hast Du mit GetAsyncKeyState versucht? Oder vielleicht ein KeyBoard Hook?

    Viele Grüße,

    Ionut


    Montag, 5. November 2012 10:31
    Moderator
  • Hallo Leider Klapt es nicht mi9t dem Server 2003

    hat noch jemmand eine Idee wie ich auf dem Lokalen PC Herausbekommen kann ob in einer RDP Sitzung eine bestimmte Taste gedrückt wurde

    Montag, 5. November 2012 14:49
  • Hallo Bernhard,

    Kannst Du bitte mehrere Infos geben? Was hast Du versucht? Ist Vista und Server 2003 32 bit oder 64 bit?

    Gruß,

    Ionut

    Montag, 5. November 2012 15:22
    Moderator
  • Hallo Bernhard und Ionut,

    Mit einem sog. low level hook über SetWindowsHookEx() klappt es garantiert, auch mit dem Windows Server 2003 (da hatte Ionut schon recht gehabt).

    Ich hatte mal selbst im C#-Forum eine überarbeitete Version von Stephen Toub's Low-Level Keyboard Hook in C# gepostet. Dort kannst Du einfach im HookCallback-Handler die F7/F8-Keyabfrage auskommentieren und stattdessen diese Zeile einfügen:

    this.Invoke(new Action(()=>Text = keys.ToString()));

    Damit werden die Tastaturanschläge im Fenstertitel der Test-Form angezeigt, auch wenn Du sie im RDP-Client ausführst.

    P.S. Ab Vista ist Elevierung erforderlich.

    Gruß
    Marcel


    Montag, 5. November 2012 15:33
    Moderator
  • Hallo Ionut,

    Ich hatte folgendes Testsetup Windows Vista 32 bit baut RDP Verbindung zu Windows 2003 Server auf und das http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

    Demoprogramm wurde auf dem Hosptpc also Windows Vista ausgeführt, solange ich nciht in der RDP sitzung wahr wurden alle a´s und b´s gelogt in der RDP Sitzung angebene a´s uind b´s wurden nichtmehr aufgezeichent

    Lg

    Bernhard
    Montag, 5. November 2012 15:38
  • Hallo Bernhard,

    Hab's gerade nochmals sowohl von einem Windows XP als auch von einem Windows 7-Client aus getestet, und der Low-Level-Hook funktionierte in beiden Fällen tadellos.

    Allerdings mußt Du daran denken, die empfangende Anwendung im elevierten Modus zu starten (als Administrator).

    Gruß
    Marcel

    Montag, 5. November 2012 16:07
    Moderator
  • Hallo Marcel,

    Ich habe das Verhalten bei mir als Video mal aufgezeichent, der Hock schreib alles mit bis ich in die RDP Sitzung gehe dannach nicht mehr, ich habe das Programm direck aus Visual Studio heraus als Administrator gestartet

    Keine Ahnung warum es nicht geht, in der 1 Sequentz ist es Windows 7 auf Windows 2008 Server in der 2 Sequenz Windows 7 auf Windows 2003 Server.

    Besonders da es bei dir Funktioniert

    Aufzeichung des Verhalten

    LG

    Bernhard

    Montag, 5. November 2012 18:59
  • Hallo Bernhard,

    Poste bitte deinen gesamten, nicht funktionierenden Code. Du verwendest - wie es aussieht, und anders als ich - eine Konsolenanwendung. Und das ist schon mal keine besonders gute Voraussetzung für einen Low-Level-Keyboard-Hook.

    SetWindowHookEx() bzw. die LowLevelKeyboardProc-Callback-Funktion benötigen eine funktionierende Nachrichtenpumpe in der Anwendung (und das ist mit Konsolenanwendungen nicht ganz trivial einzurichten). Ohne Nachrichtenpumpe wird dem aktiven RDP-Client aber womöglich zu viel CPU-Zeit eingeräumt, Verarbeitungszeit die dem empfangenden Programm dann fehlt. Deine Consolen-Anwendung kommt vermutlich einfach nicht zum Zug, da der Thread der den Hook installiert hat, die Windows-Nachricht nie, oder nur sporadisch empfängt. Weitere Details findest Du in der Dokumentation zur LowLevelKeyboardProc (Link weiter oben).

    Man muss auch beachten, dass jede Window Station eine eigene Nachrichtenschleife hat, d.h. falls der RDP-Client in einer Window Station läuft, und das empfangende Programm in einer anderen, gibt es für die Nachrichten keinen Weg dieses Boundary zu durchbrechen.

    Auch gelten für die Anwendung bzw. für die Remote Desktop Session u.U. verschiedene Sicherheitskontexte, die sich positiv/nachteilig auf die Fähigkeit auswirken, Tastaturanschläge abzufangen.

    Gruß
    Marcel

    • Als Antwort markiert BerndSch111 Mittwoch, 7. November 2012 08:40
    Dienstag, 6. November 2012 08:42
    Moderator
  • A Endlich es läuft jai Danke !!!
    • Bearbeitet BerndSch111 Mittwoch, 7. November 2012 08:40
    Mittwoch, 7. November 2012 08:31