4.1.1 包容和聚合
4.1.2 包容实现
4.1.3 聚合实现
4.1.4 聚合例子程序
4.2 进程透明性
4.2.1 列集
4.2.2 自定义列集
4.2.3 标准列集
4.2.4 标准列集的实现
4.2.5 进程外组件例子程序
4.3 安全性
4.3.1 Windows NT安全机制
4.3.2 激活安全性
4.3.3 调用安全性
4.4 多线程特性
4.4.1 Win32线程和COM线程
4.4.2 列集和同步
4.4.3 套间线程
4.4.4 自由线程
4.4.5 进程内组件的线程模型
为了使聚合能顺利实现,内部对象必须能够适应在被聚合的情况下进行特殊的处理,尤其是接口的QueryInterface成员函数,在被聚合的情况下,当客户请求它所不支持的接口或者请求IUnknown接口时,它必须把控制交给外部对象,由外部对象决定客户程序的请求结果。
聚合涉及到聚合对象和被聚合对象双方的协作,并不是每个对象都能够支持聚合特性,但聚合体现了组件软件真正意义上的重用。而包容的重用性完成建立在客户/服务器模型相对性的基础上,实际上也就是客户程序和组件程序的嵌套关系。这是包容和聚合本质的不同。
进程外组件对象与客户程序之间的通信过程。客户程序创建了组件对象之后,它通过接口指针调用对象的成员函数,但实际上,接口指针所指的是本进程中的代理对象(proxy),客户调用的是代理对象的成员函数,由代理对象通过跨进程的调用方法(LPC/RPC)与对象进程中的存根代码(stub)通信,存根代码再调用组件对象成员函数。函数返回的顺序刚好相反,由组件对象,经过存根代码和代理对象,最后返回到客户程序。在这个交互过程中,我们可以看到,客户仍然在调用同一进程内的组件对象,而组件对象也被同一进程内的客户调用,从客户和组件对象两个角度丝毫感觉不到进程的边界。所有跨进程的操作完全由代理对象和存根代码包揽了。
COM作为组件模型其焦点集中在程序之间如何建立一种标准的通信机制,安全性并不是其主要目的。要建立一种适合各种操作系统的安全性机制是很难的,其至是不可能的,所以,COM规范也只是提供了安全性机制框架。在Windows平台上实现的COM版本基本上基于Windows NT的鉴定服务(authentication service)机制。
COM提供了两种类型的安全性:
第一种可称为激活安全性(activation security),激活安全性不同于激发安全性(launch security),它包括COM对象如何被安全地启动、客户如何与对象建立连接,以及如何保护公共的资源,比如全局运行对象表、系统注册表等;
第二种类型被称为调用安全性(call security),这是指在已经建立连接的基础上,客户调用组件程序的安全保护问题。
Windows NT安全机制
Windows NT作为网络操作系统,具有完全的保护机制,系统的所有资源都是受保护的,这些资源包括文件、外设、进程、线程,其至同步对象,共享内存,注册表中的键等等。所谓受保护即指这些资源与特定的访问权限联系在一起,当这些资源被访问时,操作系统要对权限进行验证,以便允许访问或者禁止访问。
1.域、用户和用户组
NT域是指一组网络连接起来的机器的管理单位,用户以及资源都与域联系在一起。每个域包含一个域控制器(也可以有一个或多个备份域控制器),域控制器用于保存用户信息和鉴定用户访问资源的合法性。用户是资源访问的单个实体,用户可以按组方式进行管理,形成用户组。资源的权限设置是指允许或禁止访问资源的用户,可以包括多个用户,甚至用户组。大的组织中可以建立多个域,域与域之间可以建立信任关系,一个域中的资源可以被它信任域中的用户访问。用户组可以由不同域的用户组成。
2. 鉴定
用户为了访问一个被保护的资源,他需要提供三条信息:域名、用户名以及口令,然后操作系统对用户身份进行验证,这个过程被称为鉴定。
3. 安全标识符
域中每一个用户在域控制器的系统数据库中都有一个帐户,帐户包括口令、用户所属的用户组、用户的配置信息、用户的登录许可等等,帐户同时还包括一个安全标识符(SID,security identifier),SID唯一标识了一个用户,通过SID也可以唯一找到系统数据库中用户的帐户信息。用户组也有SID。
4. 安全描述符
安全描述符与某个特定的资源联系在一起,它描述了资源的安全特性。安全描述符包括以下一些信息:(1)所有者,资源的所有者信息。(2)所有者所属的用户组。(3)DACL,指出了允许和拒绝某用户或用户组的存取控制列表,当一个进程需要访问安全对象时,系统就会检查DACL来决定进程的访问权,如果一个对象没有DACL,那么就是说这个对象是任何人都可以拥有完全的访问权限。(4)SACL,指出了在该对象上的一组存取方式(如读、写、运行等 )的存取控制权限细节列表。
5.访问控制列表(ACL)
ACL包括0个或多个访问控制项(ACE,access control entry),每个控制项包括:控制项类型(允许或者禁止)、访问权限(读、写、读写)、用户或用户组的SID。
7. NT安全服务结构
Windows NT的安全机制分两层,底层是安全服务供应者(security service provider),上层是供应者的客户部分,中间通过安全服务供应者接口(security service provider interface)进行通信,NT缺省提供的安全供应者是NTLM安全服务供应者,或简称NTLMSSP。当客户程序提供了鉴定使用的域名、用户名和口令后,由于安全性的考虑,实际上这些信息并没有在网络上传播 。它通过询问/应答(challenge/response)机制鉴定客户程序所提供信息的正确性。
8. 鉴定RPC(也可称为保护RPC)
由于RPC可在各种网络协议上使用,大多数协议(包括TCP/IP)本身并没有提供安全性,因此,在进行分布式程序通信时,有必要在RPC层次上进行鉴定,以保护RPC调用。分5个鉴定层次:一,无鉴定操作即正常的RPC调用;二,连接时进行鉴定;三,每一个接口调用时进行鉴定;三点五,每个个数据包进行鉴定;四,对每个请求进行鉴定,并对接收到的数据包进行完整性检验;五,进行所有的鉴定并对数据包加密。
无、连接、调用、数据包、数据包完整性、数据包保密性。
SCM是COM库中负责找到并启动组件程序的组件。当客户向COM库请求创建新的COM对象或者连接已经运行的组件对象时,负责处理请求的正是SCM。因此,激活安全性也通过SCM实现。在Windows NT平台下,SCM是由RPCSS服务实现的。
激活安全性分为两种情况:静态安全性和动态安全性。
静态安全性包含操作系统一级的缺省安全特性:HKEY_LOCAL_MACHINE\Software\Microsoft\OLE,特定组件程序的安全特性:HKEY_LOCAL_MACHINE\Software\Classes\AppID\{AppID_value}。
如果进程调用了CoInitializaSecurity函数,则进程不再使用注册表的静态调置。