Überprüfen ob PC gesperrt ist

  • Hallo Zusammen,

    da mein AutoIT-Script nur läuft wenn ein Benutzer am PC angemeldet ist, würde ich gerne zu Beginn des Scripts überprüfen ob der PC gesperrt ist, wenn ja, dann wird das Script gleich wieder beendet. Bisher konnte ich lediglich Informationen finden wie der PC per AutoIT-Script gesperrt werden kann.

    Vielen Dank schonmal für die Hilfe.

    rogi

  • Morgen, was genau soll dein Script für eine Aufgabe erfüllen ? es gibt eine Problematik dabei und zwar solltest du das Script beim Systemstart mitstarten wird es sich immer beenden da das Script um einiges schneller ist als der Benutzer sich anmelden kann somit würde das Script immer erkennen Benutzer nicht angemeldet und sich somit beenden..

    Gruß Marvin

  • Es handelt sich um ein fertiges Script das Daten in eine Software importiert. Da jedoch Mausaktionen ausgeführt werden müssen funktionieren diese nicht beim gesperrten PC. Mein Gedanke war eigentlich simpel:

    Script wird gestartet per geplantem Task -> Script überprüft ob der PC gesperrt ist -> Wenn ja, dann wird das Script beendet (wäre absolut kein Problem) - andernfalls wie gewohnt ausgeführt.

    Es ist mir bekannt dass ich es in den geplanten Tasks angeben kann dass der Task NUR ausgeführt werden soll wenn ein Benutzer angemeldet ist. Mir wäre es allerdings lieber wenn ich das selbst über das Script lösen könnte.

    Gruß
    Rolf

  • Mh, ich da weiß ich leider nicht weiter wie man das genau abfragen kann man kann über die Umgebungsvariablen den momentan angemeldeten User sich ausgaben lassen, mit %username% eventuell kann man da etwas mit anfangen ich bin mir nur nicht sicher wie dieser aussieht wenn kein User angemeldet ist ich schätze 'System' oder ein Leerstring :P aber hab ich noch nie probiert^^

    Gruß Marvin

  • Da Deine Mousaktionen nur funktionieren, wenn der User angemeldet ist, prüfe doch mal, ob Du einen entsprechenden Returncode kriegst.
    Falls ja, könntest Du nach dem Skriptstart gleich eine Mausaktion durchführen und beenden, falls Du einen Fehler kriegst.

  • Ich danke Euch (Protex und water) vielmals, das sind beides gute Ansätze. :thumbup: Werde mit den beiden Ansätzen schaun was ich tun kann und im Lösungsfall hier natürlich posten.

    Gruß
    Rolf

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    Global Const $DESKTOP_ENUMERATE = 0x40
    Global Const $SPI_GETSCREENSAVERRUNNING = 114
    Global Const $DESKTOP_SWITCHDESKTOP = 0x100

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Terminate")
    AdlibRegister("IsDeskTopLocked", 500)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func IsDeskTopLocked()
    Local $p_lngHwnd, $p_lngRtn, $p_lngErr, $p_lngScreenSaver, $p_blnIsScreenSaver

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ' ------------------------------------------
    ;~ ' First check for screen saver one of 2 ways,
    ;~ ' based of OS
    ;~ ' ------------------------------------------
    If @OSTYPE = "WIN32_WINDOWS" Then
    ;~ ' ---------------------------------------
    ;~ ' Pre W2K -- Note, will only be TRUE if
    ;~ ' the "Password Protected" box is
    ;~ ' checked.
    ;~ ' ---------------------------------------
    $p_lngHwnd = DllCall("user32.dll", "int", "OpenDesktopA", "str", "screen-saver", "int", 0, "int", False, "int", $DESKTOP_ENUMERATE)
    If $p_lngHwnd[0] <> 0 Then
    $p_blnIsScreenSaver = True
    Else
    $p_blnIsScreenSaver = False
    EndIf
    Else
    ;~ ' ---------------------------------------
    ;~ ' W2K+ -- Will determine if screen saver
    ;~ ' is running whether or not the
    ;~ ' "Password Protected" box is checked
    ;~ ' ---------------------------------------
    $p_lngRtn = DllCall("user32.dll", "int", "SystemParametersInfoA", "int", $SPI_GETSCREENSAVERRUNNING, "int", 0, "int", $p_lngScreenSaver, "int", 0)
    If $p_lngRtn[0] = 0 Then
    ConsoleWrite("+>Error detecting screen saver" & @LF)
    Else
    $p_blnIsScreenSaver = $p_lngScreenSaver
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ' ------------------------------------------
    ;~ ' If screen saver is *not* running, then
    ;~ ' check for locked workstation
    ;~ ' ------------------------------------------
    If $p_blnIsScreenSaver Then
    If @OSTYPE = "WIN32_WINDOWS" Then
    ConsoleWrite("Screen saver is running..., Handle #" & $p_lngHwnd[0] & @LF)
    $p_lngHwnd = DllCall("user32.dll", "int", "CloseDesktop", "int", $p_lngHwnd[0])
    Else
    ConsoleWrite("Screen saver is running on W2K+" & @LF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $p_lngHwnd = DllCall("user32.dll", "int", "OpenDesktopA", "str", "Default", "int", 0, "int", False, "int", $DESKTOP_SWITCHDESKTOP)

    [/autoit] [autoit][/autoit] [autoit]

    If $p_lngHwnd[0] = 0 Then
    ConsoleWrite("Error with OpenDesktop" & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $p_lngRtn = DllCall("user32.dll", "int", "SwitchDesktop", "int", $p_lngHwnd[0])
    $p_lngErr = _GetLastErrorMessage()

    [/autoit] [autoit][/autoit] [autoit]

    If $p_lngRtn[0] = 0 Then
    If $p_lngErr = 0 Then
    ConsoleWrite("! Desktop is locked" & @LF)
    Else
    ConsoleWrite("Error with SwitchDesktop" & @LF)
    EndIf
    Else
    ConsoleWrite("Not locked!" & @LF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $p_lngHwnd = DllCall("user32.dll", "int", "CloseDesktop", "int", $p_lngHwnd[0])

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    EndIf
    EndFunc ;==>IsDeskTopLocked

    [/autoit] [autoit][/autoit] [autoit]

    Func _Terminate()
    Exit
    EndFunc ;==>_Terminate

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================
    ; _GetLastErrorMessage($DisplayMsgBox="")
    ; Format the last windows error as a string and return it
    ; if $DisplayMsgBox <> "" Then it will display a message box w/ the error
    ; Return Window's error as a string
    ;===============================================
    Func _GetLastErrorMessage($DisplayMsgBox = "")
    Local $ret, $s
    Local $p = DllStructCreate("char[4096]")
    Local Const $FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then Return ""

    [/autoit] [autoit][/autoit] [autoit]

    $ret = DllCall("Kernel32.dll", "int", "GetLastError")

    [/autoit] [autoit][/autoit] [autoit]

    $ret = DllCall("kernel32.dll", "int", "FormatMessage", _
    "int", $FORMAT_MESSAGE_FROM_SYSTEM, _
    "ptr", 0, _
    "int", $ret[0], _
    "int", 0, _
    "ptr", DllStructGetPtr($p), _
    "int", 4096, _
    "ptr", 0)
    $s = DllStructGetData($p, 1)
    If $DisplayMsgBox <> "" Then MsgBox(0, "_GetLastErrorMessage", $DisplayMsgBox & @CRLF & $s)
    Return $s
    EndFunc ;==>_GetLastErrorMessage

    [/autoit]
    Spoiler anzeigen
    [autoit]

    While 1
    Sleep(1000)
    If _isWorksatationLocked() Then ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & " - " & "workstation locked" & @CRLF)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _isWorksatationLocked()
    If StringInStr(WinGetText(""), "Program Manager") <> 0 And WinGetTitle("") = "" Then Return 1
    Return 0
    EndFunc ;==>_isWorksatationLocked

    [/autoit]
  • Die beiden Scripts von Xenobiologist sind für meine Zwecke verwendbar, Danke. Muss ich jedoch noch auseinanderklamüstern, diese Scripts sind zur ständigen Überwachung gedacht was ja bei meinem Script nicht geplant ist. Mein Script wird über den geplanten Task von Windows gestartet, weiß nicht ob ich das so zur Geltung gebracht hatte. Hier nochmal der gewünschte Ablauf:

    - EXE-Datei wird übergeplanten Task gestartet
    - Script überprüft ob der PC gesperrt ist
    - Wenn ja, das Script wird beendet.
    - Wenn nein, der restliche Ablauf wird gestartet und das Script wird danach beendet.

    Werde mich weiter durchkämpfen - sobald ich was habe werde ich es hier veröffentlichen.

    Gruß
    Rolf

  • Hallo Zusammen,

    habe nun das Script von "Xenobiologist" verwendet und auf meine Gegebenheiten angepasst. Nochmals Vielen Dank für die rasche Hilfe auch an "water" und "Protex".

    Gruß
    Rolf


    Hier noch meine Version:

    Spoiler anzeigen


    Global Const $DESKTOP_ENUMERATE = 0x40
    Global Const $SPI_GETSCREENSAVERRUNNING = 114
    Global Const $DESKTOP_SWITCHDESKTOP = 0x100

    Local $p_lngHwnd, $p_lngRtn, $p_lngErr, $p_lngScreenSaver, $p_blnIsScreenSaver

    If @OSTYPE = "WIN32_WINDOWS" Then
    $p_lngHwnd = DllCall("user32.dll", "int", "OpenDesktopA", "str", "screen-saver", "int", 0, "int", False, "int", $DESKTOP_ENUMERATE)
    If $p_lngHwnd[0] <> 0 Then
    $p_blnIsScreenSaver = True
    Else
    $p_blnIsScreenSaver = False
    EndIf
    Else
    $p_lngRtn = DllCall("user32.dll", "int", "SystemParametersInfoA", "int", $SPI_GETSCREENSAVERRUNNING, "int", 0, "int", $p_lngScreenSaver, "int", 0)
    If $p_lngRtn[0] = 0 Then
    ConsoleWrite("+>Error detecting screen saver" & @LF)
    Else
    $p_blnIsScreenSaver = $p_lngScreenSaver
    EndIf
    EndIf

    If $p_blnIsScreenSaver Then
    If @OSTYPE = "WIN32_WINDOWS" Then
    ConsoleWrite("Screen saver is running..., Handle #" & $p_lngHwnd[0] & @LF)
    $p_lngHwnd = DllCall("user32.dll", "int", "CloseDesktop", "int", $p_lngHwnd[0])
    Else
    ConsoleWrite("Screen saver is running on W2K+" & @LF)
    EndIf
    Else
    $p_lngHwnd = DllCall("user32.dll", "int", "OpenDesktopA", "str", "Default", "int", 0, "int", False, "int", $DESKTOP_SWITCHDESKTOP)
    If $p_lngHwnd[0] = 0 Then
    ConsoleWrite("Error with OpenDesktop" & @LF)
    Else
    $p_lngRtn = DllCall("user32.dll", "int", "SwitchDesktop", "int", $p_lngHwnd[0])
    If $p_lngRtn[0] = 0 Then
    If $p_lngErr = 0 Then
    ; ConsoleWrite("! Desktop is locked" & @LF)
    ; MsgBox(0, "Nachricht", "Desktop war gesperrt")
    Exit
    Else
    ConsoleWrite("Error with SwitchDesktop" & @LF)
    EndIf
    Else
    ConsoleWrite("Not locked!" & @LF)
    EndIf
    $p_lngHwnd = DllCall("user32.dll", "int", "CloseDesktop", "int", $p_lngHwnd[0])
    EndIf
    EndIf

    ; .... weiterer Ablauf meines Scripts ....