4 Replies Latest reply on Nov 26, 2009 1:20 AM by bretzeli

    Status User angemeldet / Locked / Screensaver

    bretzeli Expert
      User "Locked/Gesperrt" wie feststellen?

      Wir suchen nach einer Vollumfänglichen Lösung folgendes festzustellen.

      1) Ist der User angemeldet > Dies geht via WMI

      Set('WMI_Caption','0')
      WMISimpleQuery('\\.\root\cimv2','CIM_Process','Caption=explorer.exe','WMI_')
      If %WMI_Caption%='explorer.exe'

      2) Hat der User den Screensaver am laufen > Dies geht via WMI
      Set('WMI_screensaver','0')
      WMISimpleQuery('\\.\root\cimv2','CIM_Process','Caption=logon.scr','WMI_')
      If %WMI_screensaver%='logon.scr'

      Und jetzt die Quizfrage ist der client "Locked/gesperrt". Das problem ist folgendes:

      Wird der client gesperrt dann wird ein Event geworfen. Dieses lässt sich aber ja nur abfangen WENN der code läuft. Ich suche ein Commandline Tool, welchen man aufrufen kann und dann mittels ERRORLEVEL zurueck gibt ob der cliebnt gelocked ist oder nicht.

      Ansätze und Code beispiele hierzu:
      http://www.codeproject.com/KB/vb/DetectWindowslockunlock.aspx
      http://mikesalsbury.com/tag/lock-workstation/

      Wie gesagt wird aber ein Event geworfen und diesen muss man abfangen. Dies heisst ein programm müste 24/7 laufen und dann irgend ein Textfile/Bit ändern auf der Platte oder einen key schreiben. Diese könnte man dann via enteo abfangen.

      Ist sowas schon vorhanden? Hier mal ein Beispiel, welches zeigt wie die events geworfen werden und wie die Klassen heissen. Die Frage ist dann noch gebt Ihr es raus?

      Gruss aus der Schweiz dem Schoggi und Skiland

      Visual Studio 2008 / C#
      using Microsoft.Win32;
      using System.Collections.Generic;
      using System.Collections;
      using System.Text;
      using System.Text.RegularExpressions;
      using System.Data;
      using System.IO;
      using System.Data.Sql;
      using System.Data.SqlClient;
      using System.Net.Mime;
      using System.Net;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.Web;
      using System.Threading;
      using System.Collections.Specialized;
      using System.Security.Cryptography;
      using System.Net.Mail;
      using System.Net.NetworkInformation;
      using System.Security.Principal;
      using System.Diagnostics;



      namespace locker
      {
           class Program
          {
              //Event definition
              public static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
              {
                  //Use switch case to identify the session switch reason.
                  //Code accordingly.
                  switch (e.Reason)
                  {
                      case SessionSwitchReason.SessionLock:
                          System.Console.WriteLine("Lock");
                          break;
                      case SessionSwitchReason.SessionLogoff:
                          System.Console.WriteLine("Logoff");
                          break;
                      case SessionSwitchReason.SessionLogon:
                          System.Console.WriteLine("Logon");
                          break;
                      case SessionSwitchReason.SessionUnlock:
                          System.Console.WriteLine("Unlock");
                          break;
                      default:
                          break;
                  }
              }

          static void Main()
          {
         
                  //Declaring the event.
                SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);


           
          }

      }
      }
        • 1. Re: Status User angemeldet / Locked / Screensaver
          Frank.Scholer Master
          Hallo Bretzeli,

          also ich habe eben schnell (zugegeben, mit Hilfe von Google ;-) ein AutoIt-Script zusammengebastelt, das einen Errorlevel zurückgibt. Mit Aut2Exe hab ich das dann als Executable kompiliert und in ein Test-Batch eingebaut und es scheint zu funktionieren... :-)

          Hier der AutoIt Source-Code:
          Func _isWorkstationLocked()
              If StringInStr(WinGetText(""), "Program Manager") <> 0 And WinGetTitle("") = "" Then Return 1
              Return 0
          EndFunc

          If _isWorkstationLocked() Then
              Exit (1)
          Else
              Exit (0)
          EndIf
          Kannst ja mal testen, ob das bei dir zuverlässig funktioniert...

          HTH, Grüße Frank

          P.S.: wenn's funktioniert, kannst mir ja ne Schoggi schicken ;-)))
          • 2. Re: Status User angemeldet / Locked / Screensaver
            bretzeli Expert
            Hallo Zusammen,

            Danke Frank ;-)

            Hier noch das Binary damit es alle gebrauchen können. Test geht so:

            - Client Locken
            - Von einem anderen PC psexec \\pcname -s -i c:\locked.exe (Vorher locked.exe auf client kopieren oder mit Option)

            0 = Nicht Locked
            1 = Locked

            Psexec.exe (www.systernals.com) muss mit den Oberfläche reden können deswegen der Befehl -i

            Wir brauchen ein AutoIT script, welches man an sich bei ge-lockten clients nicht verwenden soll um heraus zu finden ob er gelockt ;-) Lustig.


            Gruss aus der Schweiz,
            • 3. Re: Status User angemeldet / Locked / Screensaver
              Markus.Zierer Expert
              Hallo Bretzeli,

              Wenn Du schon psexec benutzt um ein  Auto-IT Script remote auf einer Maschine auszuführen, damit du feststellen kannst ob ein User angemeldet ist oder nicht. Warum versuchst Du's nicht mal mit dem Tool "psloggedon". Einfach mal die Sysinternals Suite saugen und das chm File zu den ps tools anschauen. Da ist beschrieben, wie die einzelnen Tools  funktionieren. Ich denke  das Tool sollte genau das ausspucken was Du suchst.
              • 4. Re: Status User angemeldet / Locked / Screensaver
                bretzeli Expert
                Hallo,

                Das psexec, war nur zum "proof of concept" damit man sieht, dass locked.exe sauber geht und man dies testen kann. Das .EXE läuft ja nacher in einem Paket um festzustellen bn ein user den Screen gelockt hat. Sollte dies der Fall sein bricht, das Paket ab.