user32.SwitchDesktop работает только в режиме отладки - служба Python для Windows - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать службу Windows (из скрипта Python), которая регистрирует каждый раз, когда пользователь блокирует и разблокирует рабочую станцию.

Когда я запускаю службу в режиме отладки с python WinLockUnlock.py debug, служба работаеткак и ожидалось.

Но если я запускаю службу с python WinLockUnlock.py start Переменная result (SwitchDesktop(hDesktop)) всегда равна 0. Проблема только в функциях user32, служба записывает в файл журнала безлюбая проблема.

Итак, почему функции user32 работают только в режиме отладки?

(я уже пытался запустить службу с учетной записью администратора, но это не сработало)

код в WinLockUnlock.py:

import time
from ctypes import WinDLL
from SMWinService import SMWinService


class WinLockUnlock(SMWinService):
    _svc_name_ = 'LockUnlock'
    _svc_display_name_ = 'Lock Unlock Script'
    _svc_description_ = 'Script que registra cuando se bloquea/desbloquea la sesión del usuario'

    def start(self):
        self.isrunning = True
        self.session_status = True
        self.writemsg('Service started')

    def stop(self):
        self.isrunning = False
        self.writemsg('Service stopped')

    def main(self):
        user32 = WinDLL('user32', use_last_error=True)
        OpenDesktop = user32.OpenDesktopW
        SwitchDesktop = user32.SwitchDesktop
        DESKTOP_SWITCHDESKTOP = 0x0100
        while self.isrunning:
            hDesktop = OpenDesktop('default', 0, False, DESKTOP_SWITCHDESKTOP)
            result = SwitchDesktop(hDesktop)
            self.writemsg('Test Result: {0}'.format(result))
            if result:
                if self.session_status == False:
                    self.session_status = True
                    self.writemsg('----------UNLOCKED----------')
            else:
                if self.session_status == True:
                    self.session_status = False
                    self.writemsg('----------LOCKED----------')
            time.sleep(2)

    def writemsg(self, msg):
        _date = time.strftime('%Y-%m-%d')
        _time = time.strftime('%H:%M:%S')
        filename = 'D:/Temp/TestPython/pyserv{0}.txt'.format(_date)
        with open(filename, 'a', newline='', encoding='utf-8') as file:
            file.write('{0} {1}: {2}\r\n'.format(_date, _time, msg))


if __name__ == '__main__':
    WinLockUnlock.parse_command_line()

1 Ответ

0 голосов
/ 10 декабря 2018

Я добавил проверку ошибок и заметил ошибку Access denied.Ошибка возникла только при попытке OpenDesktop с разрешением DESKTOP_SWITCHDESKTOP. Оказывается служба не может взаимодействовать с рабочим столом пользователя:

... Службы теперь запускают свой собственный сеанс со своей рабочей станцией и рабочим столом ... Получение доступа кРабочий стол пользователя больше невозможен.Это функция безопасности, она предотвращает атаки с разбивкой.

Поэтому я превратил свой скрипт в приложение Windows с Pyinstaller и добавил ярлык в папку «Автозагрузка», теперь у меня естьта же функциональность без использования службы Windows

...