user32.SwitchDesktop仅在调试模式下工作-Python Windows服务

时间:2018-12-05 23:20:17

标签: python ctypes pywin32

我正在尝试创建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 :(得分:1)

我添加了错误检查,并发现一个Access denied错误。仅当我尝试使用权限OpenDesktopDESKTOP_SWITCHDESKTOP时,才会发生该错误。 Turns out服务无法与用户的桌面进行交互:

  

...服务现在可以在自己的工作站和桌面上运行自己的会话...不再可能访问用户桌面。这是一项安全功能,可以防止碎片攻击。

因此,我使用Pyinstaller将脚本转换为Windows应用程序,并将快捷方式添加到了Startup文件夹中,现在我具有相同的功能,而无需使用Windows服务