目录

​分区Naming Context​

​Domain NC(DomainName NC) ​

​Configuration NC(Configuration NC)​

​Schema NC(Schema NC)​

​LDAP 中的类和继承​

​Schema NC中的类​

​Schema NC中的属性​

​Application Partitions​


分区Naming Context

首先有一点得明确,Active Directory具有分布式特性,一个林中有若干个域,每个域内有若干台域控,每台域控有一个独立的Active Directory。这个时候就有必要将数据隔离到多个分区中,如果不隔离的话,则每个域控制器都必须复制林中的所有数据。若隔离为若干个分区之后,就可以有选择性的复制某几个分区。微软将Active Directory划分为若干个分区(Naming Context,简称NC),每个Naming Context都有其自己的安全边界。

Active Directory预定义了四个Naming Context:


  • 域目录分区(Domain Directory Partition):每一个域各有一个域目录分区,它存储着与该域有关的对象。每一个域控各自拥有一份域目录分区,它只会被复制到该域内的所有域控中,但并不会复制到其他域的域控中。如下图中的 DC=xie,DC=com 就是域目录分区
  • 配置目录分区(Configuration Directory Partition):它存储着整个活动目录结构,例如有哪些域、哪些域控等信息。整个林共享一份相同的配置目录分区,它会被复制到林中所有域的所有域控上。如下图中的 CN=Configuration,DC=xie,DC=com 就是配置目录分区
  • 架构目录分区(Schema Directory Partition):它存储着整个林中所有对象与属性的定义数据,也存储着如何建立新对象与属性的规则。整个林内所有域共享一份相同的架构目录分区,它会被复制到林中所有域的所有域控制器中。如下图中的 DC=Schema,CN=Configuration,DC=xie,DC=com 就是架构目录分区
  • 应用程序目录分区(Application Directory Partition):一般来说,应用程序目录分区是由应用程序所建立的,其内存储着与该应用程序有关的数据。应用程序目录分区会被复制到林中特定的域控中,而不是所有的域控中。如下图中的 DC=DomainDnsZones,DC=xie,DC=com 和 DC=ForestDnsZones,DC=xie,DC=com 就是应用程序目录分区

我们使用ADExplorer连接进来就可以看到分区,用红色框住的分别是域目录分区、配置目录分区和架构目录分区。而后面两个则是应用程序目录分区。

Naming Context分区_数据

Domain NC(DomainName NC) 

每个域都有一个域Naming Context,不同的域内有不同的域Naming Context,其中包含特定域的数据。这个域Naming Context的根由域的专有名称(DN)表示,比如​​xie.com​​​域的DN将为DC​​=xie,DC=com​​。之前我们说过,域内的所有计算机、所有用户的具体信息都存在Active Directory下。具体来说,就是在Active Directory的这个域Naming Context里面。我们使用 ADSI编辑器 和 Active Directory用户和计算机 查看的默认Naming Context选的也是这个Naming Context。后面对域内很多东西的查看都在这个域Naming Context里面。下面我们来看看这个Naming Context的顶级容器有哪些。

Active Directory用户和计算机 查看

Naming Context分区_抽象类_02

AD Explorer查看的,会比 Active Directory用户和计算机 查看的要多

Naming Context分区_抽象类_03

RDN

说明

CN=Builtin


该容器内置了本地域组的安全组,​



CN=Computers


机器用户的容器,包括加入域的所有机器

OU=Domain Controllers

域控制器的容器,包括域内所有域控


CN=ForeignSecurityPrincipals


代表域中来自森林外部域的组中的成员

CN=Managed Service Accounts

托管服务帐户的容器

CN=System

各种预配置对象的容器。包括信任对象,DNS对象和组策略对象

CN=Users

用户和组对象的默认容器

Configuration NC(Configuration NC)

配置NC(Configuration NC),林配置信息的主要存储库,包含有关站点,服务,分区和Active DirectorySchema 的信息,并被复制到林中的每个域控制器上。配置NC的根位于配置容器中,该容器是林根域的子容器。例如,xie.com 林的 Configuration NC 为 CN=Configuration,DC=xie,DC=com

下面我们来看看这个Naming Context的顶级容器有哪些。

Naming Context分区_应用程序_04

RDN

说明

CN=DisplaySpecifiers

定义了Active Directory管理单元的各种显示格式

CN=Extended-Rights

扩展权限对象的容器,我们将在域内ACL那篇文章里面详解

CN=ForestUpdates

包含用于表示森林状态和与域功能级别更改的对象

CN=Partitions

包含每个Naming Context,Application Partitions以及外部LDAP目录引用的对象

CN=Physical Locations

包含位置对象,可以将其与其他对象关联 以表示该对象的位置。

CN=Services

存储有关服务的配置信息,比如文件复制服务

CN=Sites

包含所有站点拓扑和复制对象

CN=WellKnown Security Principals

包含常用的外部安全性主题的对象,比如Anonymous,Authenticated Users,Everyone等等

Schema NC(Schema NC)

    Schema NC中包含Schema条目信息,该Schema信息定义Active Directory中使用的类和属性。与域NC和配置 NC 不同,Schema NC 不维护容器或组织单位的层次结构。相反,它是具有 classSchema ,attributeSchema 和 subSchema 对象的单个容器。

Schema NC里面包含Schema信息,定义了Active Directory中使用的类和属性。所以在详细讲Schema NC之前我们先来讲一下LDAP里面的类和继承。LDAP里面的类和继承,跟开发里面的面向对象一样,相信有过面向对象开发经验的,理解起来并不困难。


  • 所有类是classSchema的实例
  • 所有属性是attributeSchema的实例
  • objectClass 属性说明了该实例继承自哪些类,多个
  • objectCategory 属性为其对象类的defaultObjectCategory属性指定的值,单一
  • defaultSecurityDescriptor 这个属性表明,如果在创建Computer这个类实例的时候,如果没指定ACL,就用这个属性的值作为实例的默认ACL。
  • nTSecurityDescriptor属性的值是这个条目的ACL,而defaultSecurityDescriptor是实例默认的ACL。
  • rDNAttID属性表明通过LDAP连接到类的实例的时候,使用的两个字母的前缀是cn。
  • objectClassCategory 属性的count为1说明他是一个结构类,为2是抽象类,为3是辅助类
  • subClassOf 属性是值是他的父类
  • systemPossSuperior属性约束了他的实例只能创建在该属性值的实例底下

LDAP 中的类和继承

类和实例:域内每个条目都是类的实例,而类是属性的集合。

举个例子:

域内机器​​CN=WIN7,CN=Computers,DC=xie,DC=com ​​在 Active Directory 里面是一个条目,里面有众多属性描述条目具体信息。

Naming Context分区_应用程序_05

​而这个条目有哪些属性是由他的类决定的。比如说这里的条目是 ​​CN=WIN7,CN=Computers,DC=xie,DC=com ​​​是类Computer的实例,在​​objectClass​​​属性中可以看到。类是可继承的。子类继承父类的所有属性,top类是所有类的父类。所以我们看到的objectClass里面的值除了​​Computer​​​之外,还​​top​​​,​​person​​​,​​organizationPerson​​​,​​user​​​。这是因为objectClass保存了类继承关系。computer是user的子类,​​user​​​是​​organizationPerson​​​的子类,​​organizationPerson​​​是​​person​​​的子类,​​person​​​是​​top​​的子类。

Naming Context分区_数据_06

类的分类

类有三种类型


  • 结构类(Structural):结构类规定了对象实例的基本属性,每个条目属于且仅属于一个结构型对象类。前面说过域内每个条目都是类的实例,这个类必须是结构类。只有结构类才有实例。比如说前面说过的Computer类。
  • 抽象类(Abstract):抽象类是结构类或其他抽象类的父类,它将对象属性中公共的部分组织在一起。跟面对对象里面的抽象方法一样,他没有实例,只能充当结构类或者抽象类的父类。比如说top类。注意抽象类只能从另一个抽象类继承。
  • 辅助类(Auxiliary):辅助类规定了对象实体的扩展属性。虽然每个条目只属于一个结构型对象类,但可以同时属于多个辅助型对象类,注意辅助类不能从结构类继承。

接下来让我们结合Schema NC中的类来具体理解下LDAP 中的类和继承

Schema NC中的类

如果我们要查看Schema NC的内容,除了使用传统LDAP编辑器如:ADExplorer

Naming Context分区_数据_07

还可以使用微软自带的 Active Directory Schema

默认没有注册,运行​regsvr32 schmmgmt.dll​注册该dll

然后 cmd 窗口输入mmc打开控制台,文件——> 添加/删除管理单元(M)——>Active Directory架构——>添加——>确定

Naming Context分区_数据_08

域内每个条目都是类的实例。所有的类都存储在Schema NC里面,是Schema NC的一个条目。

Naming Context分区_抽象类_09

Schema NC中的属性

Schema NC除了定义了Active Directory中使用的类,还定义了Active Directory中使用的属性。

每个属性都是一个条目,是类 Attribute-Schema 的实例

在域内的所有属性必须在这里定义,而这里的条目,最主要的是限定了属性的语法定义。其实就是数据类型,比如:Directory String类型、DN、Boolean类型、OID、Enumeration等。

Naming Context分区_数据_10

属性值的类型由属性的​​attributeSyntax和oMSyntax决定。​

以属性Object-Sid (​​CN=Object-Sid,CN=Schema,CN=Configuration,DC=xie,DC=com​​)为例。

他的​​attributeSyntax​​​是​​2.5.5.17​

Naming Context分区_数据_11

​oMSyntax​​是4

Naming Context分区_应用程序_12

通过查表可以得知描述是其值是 一个安全辨识符(SID)

Naming Context分区_抽象类_13

关于各种语法定义在这里不再这里一个个介绍,过于抽象。

我们下面来具体分析下这个条目的一些通用属性,希望大家对类条目有个大概的认识。


  • Attribute代表属性
  • Sytnta代表属性的值的格式
  • Count代表属性的值的个数
  • Value(s)是属性具体的值

Naming Context分区_数据_14

objectClass属性的值代表该实例继承的类有哪些

Naming Context分区_数据_15

我们以一个实例来说明。前面说过条目​​CN=WIN7,CN=Computers,DC=xie,DC=com​​​是类Computer的实例。那么类Computer就存储在Schema NC里面,是Schema NC的一个条目​​CN=Computer,CN=Schema,CN=Configuration,DC=xie,DC=com。​

前面说过每个条目都是类的实例,而类又是Schema NC的一个条目。因此类也是另一个类的实例,这个另一个类就是:

classSchema(​​CN=Class-Schema,CN=Schema,CN=Configuration,DC=xie,DC=com​​)

Naming Context分区_数据_16

所有的类条目都是classSchema类的实例,我们可以在objectClass属性里面看到。

win7是computer的实例,computer是classSchema的实例,classSchema是自己的实例。

Naming Context分区_数据_17

Naming Context分区_应用程序_18

Naming Context分区_抽象类_19

defaultSecurityDescriptor 这个属性表明,如果在创建Computer这个类实例的时候,如果没指定ACL,就用这个属性的值作为实例的默认ACL。

Naming Context分区_应用程序_20

nTSecurityDescriptor属性的值是这个条目的ACL,而defaultSecurityDescriptor是实例默认的ACL。

Naming Context分区_数据_21

举个例子。

​CN=Computer,CN=Schema,CN=Configuration,DC=xie,DC=com​​ 有两个属性nTSecurityDescriptor,defaultSecurityDescriptor。

nTSecurityDescriptor是这条条目的ACL,那Computer的实例化对象​​CN=WIN7,CN=Computers,DC=xie,DC=com ​​​如果在创建的时候,没有指定ACL,那么他的nTSecurityDescriptor的值就是​​CN=Computer,CN=Schema,CN=Configuration,DC=xie,DC=com​​​ 的属性​​defaultSecurityDescriptor​​的值。

rDNAttID属性表明通过LDAP连接到类的实例的时候,使用的两个字母的前缀是cn。

所以他的实例​​CN=WIN7,CN=Computers,DC=xie,DC=com,​​使用的前缀是cn。

Naming Context分区_应用程序_22

这个我们再举个例子

比如条目​​OU=Domain Controllers,DC=xie,DC=com​​​ 是一个ou,它是类​​organizationalUnit​​的实例

Naming Context分区_应用程序_23

我们查看类​​organizationalUnit​​​对应的条目​​CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=xie,DC=com​​​,就可以看到,其rDNAttID的值为ou,所以对于他的一个实例,他的前缀是OU,​​OU=Domain Controllers​

Naming Context分区_数据_24

objectClassCategory属性的count为1说明他是一个结构类


  • 1 代表是个结构类
  • 2 代表是个抽象类
  • 3代表是个辅助类

Naming Context分区_抽象类_25

subClassOf 属性表明他的父类是user类

Naming Context分区_应用程序_26

systemPossSuperior属性约束了他的实例只能创建在这三个类​​container、​​​​organizationalUnit、​​​​domainDNS​​的实例底下。

Naming Context分区_数据_27

比如computer类的一个实例,​​CN=WIN7,CN=Computers,DC=xie,DC=com​​​,它位于容器​​CN=Computers,DC=xie,DC=com​​​底下,而​​CN=Computers,DC=xie,DC=com​​​是​​container​​​的实例,​​container​​​在​​systemPossSuperior的属性值里​​,这不违反这个约束。

Naming Context分区_数据_28

最后一点也是最核心的,我们来讲下他的实例是怎么获取到基本属性的。


  • ​systemMustContain ​​​和 ​​MustContain 属性里的值​​是必选的属性
  • ​systemMayContain ​​​和  ​​MayContain 属性里的值​​是可选的属性

比如我们就以computer类来看。该类继承于 user——>organizationalPerson——>person——>top。

那我们一个一个来看看,top类的必选属性是:


  • objectClass
  • objectCategory
  • nTSecurityDescriptor
  • instanceType

Naming Context分区_应用程序_29

person类的必选属性是: cn

Naming Context分区_应用程序_30

organizationalPerson类没有必选属性

Naming Context分区_应用程序_31

User类没有必选属性

Naming Context分区_数据_32

因此通过继承,computer类的必选属性有如下: 


  • objectClass
  • objectCategory
  • nTSecurityDescriptor
  • instanceType
  • cn

我们通过Active DirectorySchema 查看,就会看到强制类型属性和可选类型属性,以及源类是哪个类。

Naming Context分区_数据_33

Application Partitions

从 Windows Server 2003 开始,微软允许用户自定义分区来扩展Naming Context的概念。Application Partitions其实就是Naming Context的一个扩展,它本质上还是属于Naming Context。管理员可以创建分区(这个分区我们称为区域),以将数据存储在他们选择的特定域控制器上,Application Partitions主要有以下特点:


  1. Naming Context是微软预定义的,用户不可以定义自己的Naming Context。而如果用户想要定义一个分区,可以通过Application Partitions。虽然微软也预置了两个Application Partitions,但是Application Partitions的设计更多是为了让用户可以自定义自己的数据。设计Application Partitions最大的用途就是,让用户自己来定义分区。
  2. Application Partitions可以存储动态对象。动态对象是具有生存时间(TTL) 值的对象,该值确定它们在被Active Directory自动删除之前将存在多长时间。也就说Application Partitions可以给数据设置个TTL,时间一到,Active Directory就删除该数据。

下面演示通过​​ntdsutil​​创建Application Partitions:

Naming Context分区_数据_34

创建成功

Naming Context分区_应用程序_35

我们可以通过rootDSE查看域内的所有Naming Context以及Application Partitions,在属性namingContexts里面。

Naming Context分区_抽象类_36