2024年11月那些你不曾了解的WindowStations窗口站(2)

发布时间:

  ⑴对于一个桌面对象的一个访问权限叫做DESKTOP_CREATEWINDOW。如果用户没有被授予这个访问权限,任何由这个用户启动的进程都不能创建窗口。不幸的是, 象CreateWindow 这样的USER APIs 在发生同CreateFile 或 CreateMutex API类似的安全问题时,不会返回 "Aess Denied(访问被拒绝)" 消息。User.dll 中的Windows 应用程序将会被终止,导致DLL初始化错误的消息。Kernel.dll 初始化过程是在创建一个控制板窗口时发生的。一个例程在没有对window station和桌面的合适的访问权限的时候启动cmd.exe。然而不幸的是, CreateProcess 没有任何机制来检查这个错误。当用户不具有对window station和桌面的合适访问权限时,它并不返回一个错误信息。CreateProcess将会启动这个应用程序,然后这个应用程序本身在DLL失败后终止。

  ⑵编程人员还可以有一种方法越过"User.dll initialization failure(User.dll初始化失败"消息。系统有一个堆用来为window station分配内存。内存是有限的。缺省设置允许创建七个或八个window station对象。如果你用光了所有的内存,你就会看到这个消息。不过,值得庆幸的是,有一个关键字可以用来增加这个设置。 (参见Knowledge Base article Q)

  ⑶如果你没在开发服务而只是普通的应用程序,Window stations 和桌面就不是真正的问题。你的应用程序只同交互式桌面WinStaDefault 相关联。如果你是在开发一个服务,那么它可能就会同下面的window station 及桌面组合关联:

  ⑷WinStaDefault

  ⑸Service-x-e$Default

  ⑹Service Aount's Logon SIDDefault

  ⑺WinStaDefault 同运行在LocalSystem帐户的,并且与桌面交互的服务关联 。 (在ServiceType必须指明SERVICE_INTERACTIVE_PROCESS标志)。如果服务不同桌面交互,那么它是与Service-x-e$Default相关联的。这是个不可见的window station。你一定很疑惑这乱七八糟的x-e$ 是什么,它是服务的登录SID 。登录SID是独一无二的。它指的是用户所属的组。系统中的所有用户都会有一个登录SID。