lee*_*d00 3 windows-server-2003 process task-scheduler
我的工作服务器有一些每晚运行的计划任务。它们在没有用户登录系统时运行。他们运行批处理文件,打开带有宏的 MS-Access 数据库。有时,这些脚本不会被脚本关闭,它们的进程仍在运行,并且它们的.ldb
锁定文件会挂起。
我以前看过它们运行,并且看到弹出一个 MS-Access 窗口,如果成功完成,则窗口关闭,没有问题。但是,如果失败,则锁定文件和进程将保留。我假设也许某个地方也有一个窗口...我知道在 Linux 中如果你的程序在 XWindows 会话中有一个窗口,你可以将它转移到另一个 XWindows 会话;在 Windows 上也可以做同样的事情吗?
自从您将标签从 Server 2008 更改为 2003 以来,我就更改了答案...而且我的第一个答案并不准确。
\n\n无论配置什么帐户来运行计划任务,每次任务运行时都会为该帐户创建一个登录会话,为该登录创建一个窗口站,并在该窗口站/登录会话中创建窗口。任务完成后,用户帐户将被注销......当然,系统帐户除外。他们从不注销。
\n\n此外,Server 2003 没有 2008+ 那样的会话 0 隔离。值得注意的是,这在 2008 年以后的工作方式与 2003 年有很大不同。在 2008 年,计划任务由 taskeng.exe 生成,而 taskeng.exe 由 svchost.exe 生成,这意味着计划任务在会话 0 中运行,无论任务是作为 SYSTEM 还是作为普通用户运行。但是,如果该任务在 2003 上设置为以 SYSTEM 身份运行,则其工作方式几乎与 2008 年相同,其中该任务由 svchost.exe 在会话 0 中创建。在 Server 2003 中,会话 0 只是“控制台”会话,您可以使用 /console(Vista/2008+ 中的 /admin)通过 RDP 访问它,您将登录到会话 0,但它会为您生成一个新的窗口站,因此您将无法看到它由系统启动的计划任务的窗口。
\n\n在 Vista/2008+ 中,此类活动可能会触发交互式服务检测服务,该服务的目的是在弹出交互式对话框时将您转移到会话 0 的桌面,但除非其他用户登录该服务ISD 服务同时发出警报。
\n\n因此,当需要从使用了 10 年的操作系统进行迁移时,请记住这一点。
\n\n来自 NTDebugging 博客:
\n\n\n\n\n会话 0 中的所有这些窗口站和桌面到底是什么?
\n\n既然我们知道了如何调整会话视图空间和\n各种桌面的大小,那么值得讨论一下为什么\n有这么多\n窗口站和桌面,特别是在会话0中。首先,\n你\n\xe2 \x80\x99会发现每个WinSta0(交互式窗口站)至少有3个桌面,并且每个桌面使用不同数量的桌面堆。我之前已经提到过这一点,但回顾一下,每个交互式窗口站的三个桌面是:
\n\n\xc2\xb7 默认桌面 - 桌面堆大小可配置,\n 如下所述
\n\n\xc2\xb7 断开桌面连接 - 32 位系统上桌面堆大小为 64k\n
\n\n\xc2\xb7 Winlogon 桌面 - 32 位系统上的桌面堆大小为 128k\n
\n\n请注意,WinSta0 中也可能有更多桌面,\n 因为任何进程都可以调用 CreateDesktop 并创建新桌面。
\n\n让\xe2\x80\x99s 转到与非交互式窗口站关联的桌面:这些通常与服务相关。系统创建\n 窗口站,并在其中启动\n LocalSystem 帐户下运行的服务进程。该窗口站名为\n service-0x0-3e7$。它以 LocalSystem\n 帐户的 LUID 命名,并包含一个名为 Default 的桌面。但是,作为 LocalSystem 交互运行的服务进程在 Winsta0 中启动,以便它们可以与会话 0 中的用户交互(但仍然在 LocalSystem 上下文中运行)。
\n\n任何在显式用户或服务帐户下启动的服务进程都有一个由服务控制管理器为其创建的窗口站和桌面,除非其 LUID 的窗口站已存在。\n 这些窗口站是非交互式窗口站。窗口站名称基于 LUID,每次登录时该名称都是唯一的。\n 如果某个实体(系统除外)多次登录,则每次登录都会创建一个新的窗口站。窗口站名称示例为\n \xe2\x80\x9cservice-0x0-22e1$\xe2\x80\x9d。
\n
来自旧的 MS 知识库:
\n\n\n\n\nMicrosoft Windows NT、Windows 2000 和 Windows XP 服务具有与其关联的\n Window 站和桌面组合。这取决于运行服务的帐户:
\n\n\xe2\x80\xa2如果服务在 LocalSystem 帐户中运行并且不是交互式的(即服务类型不包含 SERVICE_INTERACTIVE_PROCESS\n 标志),则该服务将使用以下 Window 工作站和桌面: \n Service-0x0-3e7$\\default 其中“Service-0x0-3e7$”是\n Window station 的名称,“default”是桌面的名称。
\n\n这是一个非交互式窗口站。
\n\n\xe2\x80\xa2如果服务正在 LocalSystem 帐户中运行并与桌面交互(即服务类型包括 SERVICE_INTERACTIVE_PROCESS 标志),则该服务将使用以下 Window 站和桌面: \n Winsta0\\default 这是一个交互式窗口站。
\n\n\xe2\x80\xa2如果服务在用户帐户的安全上下文中运行,则系统将为该服务创建一个唯一的非交互式 Window 工作站和桌面。Window 站的名称将基于用户的\n 登录安全标识符 (SID):
\n\nService-0xZ1-Z2$\\default,其中 Z1 是登录 SID 的高位部分,Z2 是登录 SID 的低位部分。此外,在相同安全上下文(相同服务帐户名称)中运行的两个服务将不会接收相同的 Window 工作站和桌面,因为登录安全标识符 (SID) 对于该登录会话是唯一的。
\n
没有办法将一个进程及其所有窗口传递到另一个用户的会话中,或者以某种方式将其注入到他们的桌面中...至少没有一些主要的编程...这将是一个非常有趣的程序尝试做。
\n\n最后, Mark Russinovich 博客上这篇文章的评论非常有趣且相关:
\n\n\n\n问题是,在窗口管理器将线程分配给桌面之后,线程是否可以调用 SetThreadDesktop。我刚才写了一些测试代码,它证实了我的记忆。如果一个线程曾经在一个桌面上创建过一个窗口,即使该窗口已被销毁,也永远不会允许它使用 SetThreadDesktop() 到另一个桌面并在那里创建窗口。
\n
归档时间: |
|
查看次数: |
2816 次 |
最近记录: |