Announcement

Collapse
No announcement yet.

WTSQueryUserToken, ERROR_IO_PENDING und Overlapping in C#

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WTSQueryUserToken, ERROR_IO_PENDING und Overlapping in C#

    So, ich weiß nicht weiter und finde auch nichts drüber Vielleicht kann mir hier ja jemand weiterhelfen?

    Ziel ist ein Dienst, der im Kontext "local system" arbeiten soll und bestimmte Prozesse beim aktuell angemeldeten Benutzer starten und überwachen soll. Dazu habe ich diese zwei Funktionen folgendermaßen in meinen Code eingehängt:
    Code:
    [DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    unsafe private static extern bool WTSQueryUserToken(UInt32 SessionId, out IntPtr phToken);
    
    [DllImport("kernel32.dll")]
    private static extern int WTSGetActiveConsoleSessionId();
    Im weiteren Verlauf werden die Funktionen dann folgendermaßen aufgerufen:
    Code:
    IntPtr oToken = new IntPtr();
    UInt32 oSessionID = WTSGetActiveConsoleSessionId();
    if (WTSQueryUserToken(oSessionID, out oToken))
    {
        int err = Marshal.GetLastWin32Error();
        if (err == 0)
       { ... }
       else
       { ... }
    }
    Zunächst hatte ich eine ganz konkrete Befürchtung: "Scheisse, unter Vista läuft das niemals" - aber kam ganz anders: unter Vista funktioniert der Code prima! Die ID der aktiven Konsolensitzung wird geholt und mit dieser dann das UserToken des angemeldeten Benutzers ermittelt. Alles wunderbar!

    Die Ernüchterung kam dann auf XP. Dort bekomme ich beim Aufruf von WTSQueryUserToken den Fehlercode 997 zurück (ERROR_IO_PENDING). Daraufhin hab ich ein wenig nachgeforscht und nun bin ich so schlau, dass es sich hier um einen asynchronen Vorgang handelt und man das bei managed Code wohl mit Overlapping "in den Griff bekommen kann". Allerdings hänge ich genau an dieser Stelle nun fest. Kann doch nicht sein, dass WTSQueryUserToken unter Vista synchron und unter XP asynchron arbeitet. Zumindest entsteht der Eindruck, denn unter Vista gibt es da kein Murren und kein Meckern, während XP da garnix macht und mir durch die Blume sagt, dass ich erstmal warten soll...

    Ich hoffe, die Codeausschnitte reichen, denn das ganze Projekt zu posten wäre ein wenig Overkill. Kennt jemand diese Problematik und kann mir vielleicht Tips geben? Ich dreh mich hier grad ein wenig im Kreis...

    Vielversprechend hat anfangs das hier auf mich gewirkt:
    http://www.beefycode.com/post/Using-...aged-Code.aspx
    Wobei mein Problem dabei ist, dass WTSQueryUserToken keinen Parameter für Overlapping bereitstellt.
    Zuletzt editiert von ENNEMMEE; 09.12.2008, 16:00.

  • #2
    Is der oToken leer?

    Die MSDN sagt mir das darüber

    Arbeitest du mit Terminal Service?
    Wenn ja, dann hab ich hier was für dich

    Eventuell ist das Thema WaitHandle noch ein Tipp.
    Zuletzt editiert von Stefan Wimmer; 09.12.2008, 19:59.
    Mitarbeiterführung ist:
    Den Mitarbeiter so schnell über den Tisch zu ziehen, dass er die Reibungshitze als Nestwärme empfindet!

    Comment


    • #3
      Dankeschön

      Hab mittlerweile aber auch schon den Fehler gefunden... (komischerweise finde ich immer dann eine Lösung, sobald ich mein Problem irgendwo in ein Forum schreibe, weil ich nicht weiter komme)

      Code:
      IntPtr oToken = new IntPtr();
      UInt32 oSessionID = WTSGetActiveConsoleSessionId();
      if (WTSQueryUserToken(oSessionID, out oToken))
      { ... }
      else
      {
          int err = Marshal.GetLastWin32Error();
          if (err != 0)
         { ... }
      }
      Hatte die Funktionsbeschreibung einfach falsch verstanden. Wenn WTSQueryUserToken true zurückliefert, dann habe ich einen Wert. GetLastWin32Error liefert mir an dieser Stelle trotzdem den Fehler 997 (ERROR_IO_PENDING), aber auswerten muss ich es wohl nicht zwangsläufig. Ich denke nur, dass es wohl heikel wird, wenn der Rechner wenig Leistung hat und einfach ein wenig Zeit dafür braucht. Von daher danke für die Tips, ich werd's mir mal ansehen.

      Comment


      • #4
        Na dann schreib fleißig weiter in das Forum, damit ist auch anderen geholfen

        Grüßle
        Stefan
        Mitarbeiterführung ist:
        Den Mitarbeiter so schnell über den Tisch zu ziehen, dass er die Reibungshitze als Nestwärme empfindet!

        Comment


        • #5
          Hallo
          Ich habe gerade dass gleiche Problem zu lösen
          hast du denn schon eine Lösung fertig
          Kann mann den source Code mal sehen?

          Comment

          Working...
          X