从系统帐户在用户显示上创建 window

Create a window on user display from System account

我有一个 pywin32 应用程序,我从系统启动时触发的 schtask 中 运行ning。任务 运行 来自 SYSTEM 帐户,因此它将 运行 在任何登录的帐户上。

应用程序 运行 如预期(在系统启动时)和 reads/writes 到磁盘,但是应用程序的 window 不会在登录后显示在任何用户的帐户上,即使window 直到用户登录后才会创建。

import os
r = os.popen('quser console')
u = r.read()
if u:  #(variables previously initialized)
    self.hwnd = CreateWindow( mywinclass, "MyApp", style, \
          0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
          0, 0, hinst, None)

当 运行从登录用户的控制台启动应用程序时,window 显示正常,但当从 schtask 启动时 window 没有显示。

我的日志表明 self.hwnd 是一个正常的句柄,CreateWindow 显示没有来自 GetLastError() 的错误。

当从 SYSTEM 帐户 运行ning 时,任务在任务管理器中指示没有 GDI 对象,但是当从登录用户控制台 运行ning 时,当然会显示对象。

是否可以从 SYSTEM 帐户为登录用户创建 window?我将如何做到这一点,以便该应用程序将为所有用户 运行 (在启动时或在登录触发器时),但权限提升(因此它将显示给非管理员,但不允许他删除任务) ?

好的,我现在意识到会话 0 隔离的安全功能不允许我做我想做的事(为系统帐户的用户创建 UI window)有充分的理由. This Q/A 帮助我更好地理解了这个概念。

我相信我的选择是创建一个没有 UI 的服务或应用程序将数据保存到只读文件,然后另一个应用程序为用户在他的 UI 上读取数据。该服务将 运行 以提升的权限自动运行,并且不能被任何用户(管理员除外)终止。

另一个选项是像以前一样创建一个应用程序,在启动时使用 schtasks 和 SYSTEM 帐户执行相同的操作。

我认为这两个选项都需要一个单独的应用程序(运行 和用户帐户),它只读取由更高权限 service/app 创建的数据,允许用户进行交互并采取允许的操作他。