【问题标题】:Sessions, Window stations and Desktops会话、窗口站和桌面
【发布时间】:2011-01-14 00:29:49
【问题描述】:

会话、窗口站和桌面。

一个会话由所有进程和 其他代表一个系统对象 单个用户的登录会话。会话 包含窗口站和窗口 工作站包含桌面。

以上来自http://blogs.technet.com/b/askperf/archive/2007/07/24/sessions-desktops-and-windows-stations.aspx

(类似的文章说同样的话,例如 blogs.technet.com/b/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx 和 blogs.msdn.com/b/ ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx)

我一直认为会话和登录会话是一回事。

但是,阅读 p。 474,Russinovich 和 Solomon,Windows Internals,第 5 版,它说(倒数第二段):

CreateProcessWithLogon 函数 还通过创建一个新的 带有初始进程的登录会话, 这就是 Runas 命令的方式 在替代下启动进程 令牌。

因此 Runas 创建了一个新的登录会话。如果我们使用 Runas 在不同用户的凭据下运行记事本,我们会看到它出现在桌面上。所以记事本和其他所有东西都在同一个桌面上运行。 (据我了解,这是 Window Station Winsta0 中的默认桌面;交互式窗口站。)所以我们现在拥有的是 两个 与同一个 Session 相关联的登录会话(即包含窗口站)。所以会话和登录会话看起来并不相同。

有人可以确认一下吗?

困惑

【问题讨论】:

标签: windows


【解决方案1】:

这里确实有两种类型的会话。这是我对它们工作方式的理解。

  1. logon session[2]Local Security Authority[2] 管理sub>,并管理用户登录的范围。这些主要由winlogon 进程创建,但也由API 函数(如LogonUserCreateProcessAsUserCreateProcessWithLogonW)或使用这些函数的应用程序(如runas 命令)创建。

    登录会话不与任何特定的 Object Manager[2] 概念绑定,如 window stations and desktops。它基本上只是一个包含登录 SID 和一些缓存的帐户安全信息的信息块。这个信息块,这个登录会话,就是access token 指向的内容。

  2. 另一种类型的会话有时称为终端服务会话、终端服务器会话、Remote Desktop session、登录会话(尽管如此令人困惑)、用户登录会话或用户会话。不过,通常它只是称为“会话”,没有进一步的限定。

    这是您通常会听到的会话类型,也是 window stations 所属的类型。这种类型的会话 came about 支持多个交互式 GUI 登录,由终端服务(现在称为 Remote Desktop)提供,现在也用于支持 Fast User Switching。会话在与每个用户登录关联的对象管理器对象之间提供必要的隔离。

我不会花太多时间来处理所有这些东西,所以我对一些细节有点模糊,但我认为这是对整体情况的相当公平的表示。我希望它能把事情弄清楚一点。

【讨论】:

  • 会话在原始设计中,但作为子系统会话(OS/2、POSIX)通过登录会话捆绑在一起。后者应该有自己的对象目录。相反,Windows 子系统将所有内容放在全局 \BaseNamedObjects\DosDevices 中。然后 NT 4 通过 win32k.sys 将窗口管理器移至内核,因此实现 Hydra(终端服务)需要虚拟化 win32k 的状态并为本地命名对象添加一个\Sessions\[SESSION_ID] 目录。现在,smss.exe 在新会话中重新生成以运行 csrss.exe 和 winlogon.exe,退出时将它们孤立。
  • 在 XP 中,Windows 回到了登录会话目录的想法,但仅限于在 \Sessions\0\DosDevices\[LOGON_SESSION_ID] 中创建的设备链接(例如映射的驱动器)。他们还将全局目录重命名为\GLOBAL??(全局什么?)。就个人而言,我会将\Sessions\[SESSION_ID]\DosDevices 设为\LogonSessions 目录的符号链接。在其中,SYSTEM 的登录会话 (00000000-000003e7) 将链接到全局 \DosDevices。其他登录会话将使用[LOGON_SESSION_ID]。无论如何,本机代码应该使用\?? 让对象管理器选择正确的目录。
  • @0xC0000022L,现在WindowStation 逻辑上包含在Session 中。未记录的WINSTATION_OBJECT 的第一个字段是会话ID,命名对象路径在\Sessions\[SESSION_ID]\Windows\WindowStations 中。内核中的 win32k.sys 数据在内核会话空间中被虚拟化,因此 WindowStationDesktop 对象与其关联的 Session 深度连接。
  • @0xC0000022L,登录会话具有来自NtAllocateLocallyUniqueId 的 64 位 ID,并带有一些硬编码,例如 999 (0x3e7) 用于系统登录。 \Sessions 目录用于 NT 会话,它具有从 0 开始并按顺序递增的 32 位 ID。从 NT 3.1 开始,它们一直是这样编号的,但在 Hydra 之前,它们是由会话管理器在通过其 LPC \SmApiPort 请求时创建的,并且仅用于子系统会话。内核中没有会话空间,也没有对象管理器用来虚拟化\BaseNamedObjects\Windows\Sessions 对象目录。
  • @eryksun 等等,所以你的意思是 1.) NT 会话 == TS 会话或 2.) NT 会话是第三种类型的会话?
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多