Windows NT中的所有命名对象和一些未命名的对象都可以被保护。Windows中每个安全对象的安全属性由【安全描述符】描述,其中包含有关对象所有者的信息,以及标识允许或拒绝访问对象的用户和组的【访问控制列表】(ACL)。ACL包含允许或拒绝访问对象的每个用户,全局组或本地组(别名)的条目。这些条目都是【访问控制条目】(ACE)。
在登录时,会向用户分配一个【访问令牌】,其中包含表示用户和用户所属组的标识符。代表此用户运行的每个进程将具有此特定访问令牌的副本。当进程尝试使用对象时,系统会将访问令牌中列出的安全属性与对象ACL中的ACE进行比较。系统将访问令牌与每个ACE进行比较,直到访问被授予或拒绝,或者直到没有更多的ACE才能检查。可以想象,几个ACE可以应用于令牌。而且,如果发生这种情况,每个ACE授予的访问权会累积。例如,如果一个ACE授予对访问令牌中的组的读取访问权限,另一个ACE授予用户的写访问权限,谁也是该组的成员,则当访问权限时,用户将具有对该对象的读取和写入权限检查完成。
下图显示了这些安全信息块之间的关系:
通常,保护对象的应用程序是服务器,它定义具有对对象访问权限的用户和组。当应用程序尝试访问对象时,应用程序与客户端进行交互。用户和组由【安全标识符】(SID)标识。SID是唯一标识用户或组的可变长度的结构。SID存储在安全数据库中,应用程序可以通过调用Win32函数进行查询。除了一个例外,SID用于标识用户或组从未重新分配给另一个用户或组。对于给定的帐户,从登录到登录将不一样的唯一的SID是登录标识符SID。在上图所示的模型中,SID将用于标识以下内容:
*安全描述符中的所有者和组
*每个ACE授予访问的接收者
*访问令牌中的用户和组
安全描述符,SID和ACL被应用程序视为不透明结构,并且仅通过使用Win32函数进行操作。这有助于确保这些结构在语法上保持准确,并防止未来对安全系统的增强将破坏现有代码。
指向双字值或结构的指针必须在双字边界上对齐。但是,异常是字符串,对齐对齐并不重要。所有Win32内存分配函数返回双字对齐内存对象的句柄。