我正在尝试创建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()
答案 0 :(得分:1)
我添加了错误检查,并发现一个Access denied
错误。仅当我尝试使用权限OpenDesktop
来DESKTOP_SWITCHDESKTOP
时,才会发生该错误。 Turns out服务无法与用户的桌面进行交互:
...服务现在可以在自己的工作站和桌面上运行自己的会话...不再可能访问用户桌面。这是一项安全功能,可以防止碎片攻击。
因此,我使用Pyinstaller将脚本转换为Windows应用程序,并将快捷方式添加到了Startup文件夹中,现在我具有相同的功能,而无需使用Windows服务