WindowStations窗口站

2012-11-08
    Window stations 和桌面可能是Windows NT服务中最与众不同的了。绝大多数编程者都不会直接接触这两种对象,尽管用户每时每刻都要碰到它们。window station 和桌面对象就象其它Windows NT对象,如事件、互斥量和信号量一样,是安全(securable)的。一个window station 对象包括一个剪贴板、一个全局原子集和更多的桌面对象。一个window station或者是可见的或者是不可见的。一个可见的window station接收用户来自于鼠标或键盘的输入。一个显示设备也与之相连这样信息可以显示给交互式用户。
    在 Windows NT 4.0中,只有一个window station 能被看得到,就是WinSta0。可见的window station也被定义成交互式的。一个不可见的window station是不可交互的,而且也不能接收任何用户的输入也没有显示设备与之相连。
    如前所述,桌面包含在window station对象中。一个桌面对象包含一个逻辑的显示表面,和窗口、菜单等。只有属于可见window station的桌面才能被看见并接收用户的输入。这个桌面叫做活动桌面。
    作为交互式用户你在不同的时候碰到三种不同的桌面:缺省(Default)、 Winlogon和Screen-saver。Winlogon 桌面是当你按下Ctrl+Alt+Delete组合键时显示在你面前的对话框。缺省(Default)桌面是浏览器(Explorer)或者是由交互式用户启动的所有进程。它更应当被理解成交互式的应用程序桌面。最终的桌面是Screen-saver,它显示你的屏幕saver。你可能已经注意到可以在不同的桌面之间切换。当一个用户按下Ctrl+Alt+Delete组合键时,操作系统可以从缺省状态切换到Winlogon桌面。当你在登录对话框中选择取消,系统将再切换回缺省桌面。有人问我当切换进行的时候,是否其它桌面上的东西都被破坏掉了,答案是 "不"。虽然你看不到其它桌面,但它们仍然在那里。
    系统中所有的进程都与window station 和桌面相联系。当一个用户第一次登录时,交互式window station, WinSta0,和缺省桌面都与这个用户的Shell进程相关联。这样用户就能看到shell了,如果不是这样,用户是什么也看不到的。而且在这之后,由shell启动的所有进程也会和WinSta0 及缺省桌面相关联。
    你还可以通过STARTUPINFO 数据结构的lpDesktop 成员指定你的进程同哪个window station 和桌面相关联。这个数据结构传递给CreateProcess 和 CreateProcessAsUser两个函数。你可以将lpDesktop 初始化为NULL,意思是让CreateProcess函数使用和调用进程相同的window station 和桌面。你可以将你自己的window station 和桌面组合定义成"WinSta0/Default" 或者就定义成空字符串。这个参数会让操作系统为启动进程创建一个新的不可见的window station 及桌面。与这两个新对象关联的安全性授予每个组对它们的完全访问权限。
    typedef struct _STARTUPINFO { // si
    DWORD cb;
    LPTSTR lpReserved;
    LPTSTR lpDesktop;
    LPTSTR lpTitle;
    DWORD dwX;
    DWORD dwY;
    DWORD dwXSize;
    DWORD dwYSize;
    DWORD dwXCountChars;
    DWORD dwYCountChars;
    DWORD dwFillAttribute;
    DWORD dwFlags;
    WORD wShowWindow;
    WORD cbReserved2;
    LPBYTE lpReserved2;
    HANDLE hStdInput;
    HANDLE hStdOutput;
    HANDLE hStdError;
    } STARTUPINFO, *LPSTARTUPINFO;
    Window stations和桌面是具有安全性的对象。与window station 和桌面将关联的进程必须由对这些对象的合适的访问权限。如果进程没有访问权,你会看到这两个消息之一"User32.dll initialization failure(User32.dll初始化失败)" 或 "Kernel32.dll initialization failure.(Kernel32.dll初始化失败)"。由进程返回的退出码为128 或 ERROR_NO_WAIT_CHILDREN。那么我所指的合适的访问权是什么意思呢?假如你有一个文件这样的对象。你可以为这个文件创建一个DACL以使用户具有对这个文件的读访问权。Window station 和 桌面是以相同的方式工作的。
    对于一个桌面对象的一个访问权限叫做DESKTOP_CREATEWINDOW。如果用户没有被授予这个访问权限,任何由这个用户启动的进程都不能创建窗口。不幸的是, 象CreateWindow 这样的USER APIs 在发生同CreateFile 或 CreateMutex API类似的安全问题时,不会返回 "Access Denied(访问被拒绝)" 消息。User32.dll 中的Windows 应用程序将会被终止,导致DLL初始化错误的消息。Kernel32.dll 初始化过程是在创建一个控制板窗口时发生的。一个例程在没有对window station和桌面的合适的访问权限的时候启动cmd.exe。然而不幸的是, CreateProcess 没有任何机制来检查这个错误。当用户不具有对window station和桌面的合适访问权限时,它并不返回一个错误信息。CreateProcess将会启动这个应用程序,然后这个应用程序本身在DLL失败后终止。
    编程人员还可以有一种方法越过"User32.dll initialization failure(User32.dll初始化失败"消息。系统有一个堆用来为window station分配内存。内存是有限的。缺省设置允许创建七个或八个window station对象。如果你用光了所有的内存,你就会看到这个消息。不过,值得庆幸的是,有一个注册表关键字可以用来增加这个设置。 (参见Knowledge Base article Q142676)
    如果你没在开发服务而只是普通的应用程序,Window stations 和桌面就不是真正的问题。你的应用程序只同交互式桌面WinSta0/Default 相关联。如果你是在开发一个服务,那么它可能就会同下面的window station 及桌面组合关联:
    WinSta0/Default
    Service-0x0-3e7$/Default
    Service Account's Logon SID/Default
    WinSta0/Default 同运行在LocalSystem帐户的,并且与桌面交互的服务关联 。 (在ServiceType必须指明SERVICE_INTERACTIVE_PROCESS标志)。如果服务不同桌面交互,那么它是与Service-0x0-3e7$/Default相关联的。这是个不可见的window station。你一定很疑惑这乱七八糟的0x0-3e7$ 是什么,它是服务的登录SID 。登录SID是独一无二的。它指的是用户所属的组。系统中的所有用户都会有一个登录SID。

  考试大温馨提示:本内容来源于网络,仅代表作者个人观点,与本站立场无关,仅供您学习交流使用。其中可能有部分文章经过多次转载而造成文章内容缺失、错误或文章作者不详等问题,请您谅解。如有侵犯您的权利,请联系我们,本站会立即予以处理。

分享到:
0
相关阅读
友情链接
© 2018 我考网 http://www.woexam.com 中国互联网举报中心 湘ICP备18023104号 京公网安备 11010802020116号
违法和不良信息举报:9447029@qq.com