这个链接解释了这一切:https ://docs.microsoft.com/en-us/archive/blogs/winsdk/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later
摘要:您无法像往常一样从 Windows 服务打开交互式进程,因为该服务在完全不同的环境(即 Session 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)
如果您有任何疑问,请告诉我