使用:
我有一个python程序,它使用Pystray来显示一个图标,这允许我使Tkinter窗口可用。这需要一段时间,但是,由于堆栈溢出,这个功能可以正常工作。然后,我使用PyInstaller为此创建一个可执行文件,这也运行良好。到目前为止,一切都很好,执行程序启动它的webservice并显示图标。
我从用pywin32创建的服务中调用这个程序。程序按预期启动,它的webservice功能是可用的,但是我看不到系统托盘图标。我认为这是因为我是作为管理员登录的,但是服务运行在一般服务帐户下。
是否有任何方法使所有登录到机器的用户都可以使用Pystray?
发布于 2020-04-13 18:34:41
摘要:您不能像通常那样从windows服务打开交互进程,因为服务运行在完全不同的环境(也称为会话0)上,而登录用户的会话id是1.2.取决于用户的数量。
如果您启动服务并查看任务管理器中的“详细信息”选项卡,您将发现您的进程正在运行,但没有出现
据我所知,这里我们(经过一段时间后也遇到了完全相同的问题)试图从会话0中的服务中打开一个进程,而它不能直接与会话1交互?因此,我们应该使用CreateProcessAsUser作为用户创建新流程。
我使用了以下代码来运行它:
# A SETUP FOR STARTUPINFO
startupInfo = win32process.STARTUPINFO()
startupInfo.dwFlags = win32process.STARTF_USESHOWWINDOW
startupInfo.wShowWindow = win32con.SW_NORMAL
# GET THE TOKEN FOR LOGGED-IN USER
console_session_id = win32ts.WTSGetActiveConsoleSessionId()
console_user_token = win32ts.WTSQueryUserToken(console_session_id)
# GET THE LOGGED IN USER'S ENVIRONMENT TOO
environment = win32profile.CreateEnvironmentBlock(console_user_token, False)
win32process.CreateProcessAsUser(console_user_token,
'notepad.exe', # PATH TO YOUR EXECUTABLE / SCRIPT
None, # THIS ONE IS 'COMMAND LINE' IF YOU INTEND YOU USE IT
None,
None,
0,
win32con.NORMAL_PRIORITY_CLASS,
environment, # TO OPEN IN USER'S ENVIRONMENT
None,
startupInfo)如果您有任何疑问,请告诉我
https://stackoverflow.com/questions/59528750
复制相似问题