Active Directory

Active Directory（简称AD。中国大陆译名为“活动目录”，台湾与香港维持英文不译）是微软Windows Server中，负责架构中大型网络环境的集中式目录管理服务（Directory Services），在Windows 2000 Server开始内建于Windows Server产品中，它处理在组织中的网络物件，物件可以是使用者、群组、电脑、网域控制器、邮件、设定档、组织单元、树系等等，只要是在Active Directory结构定义档（schema）中定义的物件，就可以储存在Active Directory资料档中，并利用Active Directory Service Interface来存取，实际上，许多Active Directory的管理工具都是利用这个界面来呼叫并使用Active Directory的资料。

Active Directory也被做为微软部分服务器软件与网域构连的资料结构，例如Microsoft Exchange Server 2003-2007，均使用AD来储存其个人信箱资料（透过建立新的Active Directory Schema），并将AD列为建置Exchange Server的必要条件。

Active Directory最早在1996年出现，并在Windows 2000中首次问世，研发代号为Cascade，并历经Windows 2000、Windows Server 2003的演化，目前AD已成为成熟的目录服务元件，在Windows Server 2008中，AD更扩充其角色至五种服务（包含凭证、联合、权限控管与轻量级服务等）。

## 目录结构

Active Directory(AD)以树状的资料结构来组成网络服务的资讯，在简单的网络环境中（例如小公司），通常网域都只有一个，在中型或大型的网络中，网域可能会有很多个，或是和其他公司或组织的AD相互连结（此连结称为信任关系，于后面说明）。

### 物件

Active Directory的最小储存单元为物件（object），每个物件均有自己的schema属性，可以储存不同的资料，像是使用者、群组、电脑、信箱或其他的基本物件等。

一个AD网域底下的基本物件，有以下几种

- Domain Controllers，储存网域所属的网域控制站（简称DC、域控）。
- Computers，储存加入网域的电脑物件。
- Builtin，储存内建的账户群组。
- Users，储存AD中的使用者物件。

若公司需要以不同的组织结构来管理公司的账户，则可以在AD中建立一个或多个组织单元（Organization Unit，简称OU），组织单元是一个具有收纳能力的Active Directory物件（其在ADSI中是IADsContainer界面），可以在OU之中存放AD的物件，包括使用者，群组，电脑等，让组织结构在AD中可以被真实的反映出来，而且也方便AD中的另一个功能——群组原则（Group Policy）的套用与集中管理。

### 树系与多网域

<image>

<image>

若组织的网络环境相当庞大与复杂时，网域可能会有许多个，在AD之中，网域可以有一个或多个，而一个大型公司可能会利用分公司或是办公室的方式来组织网域物件，如此一来，在AD中会有数个网域，若需要在网域中共享资料或是做委派管理与组态设定时，便需要建立彼此间的组织关系，微软将AD中多网域相互的关系阶层化，称为网域树（domain tree），网域树结构以DNS识别方式来区分，例如一间公司可能有业务部门，工程部门与管理部门，那么若要以部门来建立网域时，则可以如此建立（如右图）：

- acme.com.tw：根网域。
- sales.acme.com.tw：业务部门。
- engineering.acme.com.tw：工程部门。
- admin.acme.com.tw：管理部门。

如此便可在AD中反映出组织的结构，同样的，网域内还是可以再建立不同的网域，例如在工程部门中若需要分为软件部门与硬件部门时，还可以在工程部门的网域中建立：

- software.engineering.acme.com.tw：软件部门的网域。
- hardware.engineering.acme.com.tw：硬件部门的网域。

而软件部门和硬件部门的设定，会自动的继承工程部门网域中的群组原则设定，而在软件部门的组态，则不会影响到硬件部门（可经过设定来套用）。

### 森林

<image>

在多个网域的环境下，可能在不同的网域之间会需要交换与共享资料，像是组态设定、使用者账户与群组原则设定等，在这个时候需要有一个角色来做为不同网域间的资讯交换角色，同时又必须要符合AD树状结构的规范，因此微软在多网域之间建立了一个中介用的角色，称为森林（Forest），一个组织中最多只能有一个Forest，在Forest下则是各自的网域树系，而在Forest下的网域或网域树系间，可以共享资讯。

## 实体结构

Active Directory背后，则是一个植基于Windows Server网络基础结构（infrastructure）的网络服务与通讯方式所组成，这些网络服务和通讯方式让Active Directory具有高度的扩充性与向后相容性等，网络管理人员必须要妥适的设定与监控这些网络服务与通讯方式，以让Active Directory能够正常且顺利的运作。

在以往的Windows NT网域环境中，网域的实体结构分为三种角色，即主要网域控制站（Primary Domain Controller, PDC）、备份网域控制站（Backup Domain Controller, BDC）以及成员服务器（Member Server）三种，网域的资料都储存在PDC和BDC中，并且在PDC和BDC间交换资料，但PDC和BDC的部署方式并不方便（一个网域只能有一个PDC），在不同的地理环境中也不能设置PDC，而且所有网域的查询都会被导向PDC，如此很容易造成网域登入和存取的塞车情况，这个问题在Active Directory中已获得改善，即不再有BDC（只有DC和Member Server两种角色），在网域中的任何一台网域控制站都可以负责处理来自用户端的网域查询，如此在分散部署上会具有相当的弹性。

### Global Catalog

在AD的实体结构中，最重要的角色非Global Catalog（全域目录，简称GC）莫属，它储存了最完整的Active Directory的结构资料，也是以目录为主（directory-enabled）的应用程序对AD的查询的主要标的，而通常在不同的地理位置（例如在中国大陆、台湾、美国和英国各有分公司，且各有网域）时，GC扮演了重要的快取结构角色，若台湾的员工出差到英国分公司，并试图登入网域时，Windows会先搜寻最近的Global Catalog Server（由DNS设定提供），若找不到时，才会连结到其他地区的GC，但若分公司的网络很慢时，这种跨地理位置的AD资料存取会直接影响到登入的时间，因此谨慎的GC的布署对AD的推行是很重要的。

### Operation Masters

营运主机（Operation Masters，又称为Flexible Single Master Operation，即FSMO）是被设定为担任提供特定角色资讯的网域控制站，在每一个Active Directory网域中，至少会存在三种营运主机的角色。

- Primary Domain Controller Emulator Master：设定作为这个角色的网域控制站，可以被目前仍存在网域中的Windows NT Backup Domain Controller（备份网域控制站）当做Primary Domain Controller （主要网域控制站）来呼叫使用，同时它也是树系中提供Windows Time Service时间同步的主机。
- RID Master：在网域控制站中会储存AD物件的relative ID（关联识别码），可分散以RID为主的查询的流量。
- Infrastructure Master：负责处理对目前网域的物件参考，以及对应其他网域的物件参考，并可负责处理针对AD物件的变更（例如删除与更名）。

另外还有两种角色，是具有额外功能，但不强制部署在网域的：

- Schema Master：负责处理网域中所有针对物件结构的变更。
- Domain Naming Master：负责处理网域中的目录分割以及应用目录分割的工作。

### Site

Active Directory站台（site），是指一个实体的网络位置，在一个站台中可能会有很多个网域控制站，AD网域资料的复制，就是以站台为主，实际处理复制作业的工具称为KCC（Knowledge Consistency Checker，知识一致性检查器），它会在特定时间对站台设定中的网域进行资料的同步化，复制活动则分为对内复制（intra-site replication）与对外复制（或站间复制，inter-site replication），对内复制是同一个网域间的控制站交换资讯，对外复制则是在网络管理人员的设定下，透过指定的通讯方法（IP或SMTP）以及拓朴进行复制。

预设情况下，站台的通讯方式是使用IP（即RPC over IP）来通讯，这个方式是最快的，且可以利用TCP/IP来执行远端呼叫以及处理，但若是非网域资料（架构、设定和通用类别目录更新，亦即没有AD物件）的复制，则可以利用SMTP通讯方法，但这个方法需要另外建立企业级的凭证服务才可以使用，目的是确保SMTP的资料可以被确认与保全。

在中大型的网络环境中，适当的分散网络流量以及设计网络拓朴是很重要的事，KCC会利用设定好的网络通讯成本（cost）来选择要用哪一条网络来进行复制，例如可能公司和办公室间有一条T1和ISDN 64Kbps的线路，而T1的成本设为500（因为会有很大流量），而ISDN只有100时，KCC会选择ISDN做复制，这样代表网络管理员可以自己决定要使用哪一条网络来进行复制，KCC的复制算法会判断哪一个网络最适合复制AD的资料。除了成本以外，AD也支援了桥接站台（site bridge）的结构，站台桥接能力让复制的成本得以分散，并可让同一台GC的复制流量分散，也适合在不同地理区域之间的AD资讯复制与散发工作。

### DNS

Active Directory极度依赖DNS，因为DNS可以让AD表现出阶层化的树状结构，同时也可以和开放的目录标准接轨，因此在建置网域时，DNS服务（或另有架设DNS Server）一定要存在于网络或该网域控制站中，AD以SRV记录（SRV Record）来识别网域控制站，以提供网域处理的服务，而和Windows NT网域不同的是，Windows NT使用的是NetBIOS通讯协定，但AD使用的则是TCP/IP，但AD仍然提供可以在Windows NT账户格式（DOMAIN\User）和AD账户格式（user@domain）的格式互转。

### 实体储存

Active Directory使用强化过的Microsoft Jet Database Engine（基于Microsoft Jet Blue计划），即Extensible Storage Engine（ESE98），可储存16TB的资料量，理论上可容纳十亿个网域物件，档案名称为NTDS.dit，它储存在%system_root%\NTDS目录中（这个目录所在的磁盘也必须要是NTFS格式），内含了物件资料表以及连结资料表，在Windows Server 2003中加入了一个描述安全资讯的新资料表。

而在AD更新资料时的记录，都被储存在edb*.log，预设的名称为edb.log，其他的档案使用"edb" +数字 + ".log"来记录，另搭配了edb.chk作为检查点记录档，以及Res1.log和Res2.log作为系统的保留档案。

AD实体储存的元件有：

- 上层界面（interface）：作为目录服务用户端或目录服务中的其他服务器的连接界面，像是LDAP、REPL、MAPI与SAM等。
- 目录服务代理人（Directory Service Agent）：实作于NTDSA.DLL，负责接收与处理来自用户端的要求或其他服务器的要求（例如KCC的要求）。
- 数据库存取层：内含于ntdsa.dll中，负责直接存取数据库。
- 延伸储存引擎（Extensible Storage Engine）：负责处理数据库与其名称（DN）的记录对应。
- 数据库档案：即NTDS.dit，以及负责处理未认可交易的记录档。

网域控制站会定时（预设为12小时）对NTDS.dit做重组（defragment），并清除资料档中的垃圾，在重组前会检查磁盘空间是否有大于数据库档案1.5倍的空间可用。若数据库所在的目录没有足够的可用空间，就要把数据库移往其他地方去。然而，由于Windows 2000与Windows Server 2003在磁盘区阴影复制服务（VSS）的机制有所不同，使这移动过程有可能失败。对于Windows 2000，log files与数据库可以分别存放在不同的磁盘上，但Windows Server 2003则必须放在同一个磁盘上。要移动数据库，必须重新启动服务器，并进入Active Directory Restore Mode里，利用ntdsutil工具进行移动。

### 只读网域控制站

在Windows Server 2008中，加入了一个新的网域控制站角色，称为只读型网域控制站（Read-Only Domain Controller，简称RODC），RODC可以作为组织的分部、分公司、办公室或是临时单位等，将网域控制站放在该处时会有安全性疑虑或风险时使用，顾名思义，RODC不会写入任何资料到Active Directory，与其他网域的复写也是有限度的，并且只会以系统管理员定义的Password Replication Policy（密码复制原则）控制下的账户才会快取密码等功能。

若要在AD中加入只读网域控制站，则网域的功能层级必须要在Windows Server 2003以上。

## 安全性

Active Directory的安全性可分为物件的安全性识别、阶层的安全性以及森林之间的信任关系等。

### 安全性识别

AD以Kerberos V5作为其安全验证的主要架构，并且每个AD物件都拥有一个独一无二的安全性识别码（Security Identifier，SID），其格式范例为S-1-5-21-7623811015-3361044348-030300820-1013，每组代码均有其意义，这组识别码储存在AD的objectSid属性中。

### 阶层的安全性

在AD中，不同阶层的OU可以定义不同的安全性资讯，以及不同的使用者权限，而不同的网域阶层之间也可以定义不同的使用者权限，管理员也可以利用安全性管理范本（Secutiy Template）来定义不同的安全性资讯，或者使用群组原则（Group Policy）来定义，在大型网络之中，使用群组原则会比安全性范本要来的方便，将两者合并使用更可达到事半功倍之效（例如和Microsoft Base Security Analyzer的整合）。

在父阶层定义的安全性，可以被继承至子阶层。

### 信任关系

在大型的网络环境中，可能组织间有伙伴关系，或者是专案间的合作，而需要在两个Forest间共享或授权存取时，可以利用信任关系（trust relationship）来建立Forest间的信任，以授权在彼此树系间的存取权，在Windows Server 2003以后版本的AD环境可支援四种信任关系：

- 捷径式信任（shortcut trust），此为加速验证流程所设计的信任法，在多层次的网域中，使用者只要连接到最近的网域即可登入，无需要将讯息转到授权的根服器。
- 外部式信任（external trust），此为跨森林的授权方法。
- 领域式信任（realm trust），作为与非Kerberos验证的LDAP目录服务与Windows网域的信任模式。
- 森林式信任（forest trust），此为强化型的外部式信任法，可以经由一个中介的森林信任来取得信任关系，例如acme.com.tw信任aspvendor.com，而contoso.com.tw也信任aspvendor.com，则acme.com.tw可以取得和contoso.com.tw的信任关系。

信任关系的设定可以分为单向（one-way）和双向（two-way）两种，单向信任表示被信任的一方可以存取信任的一方的资源，而双向信任则是可以存取各自的资源。

信任关系的传递可分为可递移（transitive）与不可递移（non-transitive）两种，可递移表示建立信任关系的网域在同一树系内的其他网域也可以使用在建立信任关系网域中的信任资讯，不可递移则表示只有建立信任关系的网域（不论是否有阶层）才可以使用信任资讯。

## 名称系统

Active Directory的命名预设是以LDAP（轻量级目录存取协定）版本的X.500协定为主（由ADSI LDAP Directory Service Provider），对于AD这种如此规模的目录服务而言，LDAP这种具有阶层识别能力的协定，非常适合作为目录服务的存取协定，但AD亦可以支援NT时代的UNC格式（由ADSI Windows NT Directory Service Provider提供），在UNC与LDAP名称间的转换则由ADSI的`IADsNameTranslate`界面来提供。

### 识别名

每个AD物件均有一个以LDAP组成的名称，称为识别名（Distinguished name，简称DN），这个识别名是作为使用LDAP查询AD目录中识别物件的名称，其格式类似下列：

```text
LDAP://cn=John Smith, ou=Software Engineering, dc=engineering, dc=acme, dc=com, dc=tw
LDAP://cn=COMP1024, ou=Computers, dc=acme, dc=com, dc=tw
```

在LDAP字串中经常使用的代字有：

- DC：domainComponent
- CN：commonName
- OU：organizationalUnitName
- O：organizationName
- STREET：streetAddress
- L：localityName
- ST：stateOrProvinceName
- C：countryName
- UID：userid

当用户端在下达LDAP查询字串时，若无法符合AD物件的LDAP DN，则会找不到资料，LDAP代字亦可使用于搜寻（IADsDSObject与ADsDSObject，参见Active Directory Service Interface条目）。

### 一般名称

每个AD中的物件都会有一个一般的名称，又称为别名（Canonical Name），在Schema中的属性为cn（Common Name），但组织单元（OU）基本上是例外，它自己有一个代字ou作为识别符。

### 关联识别名称

为了要在容器与物件间作识别，在Schema中设定了一个Relative Distinguished name（简称RDN），储存在rDnAttId属性中，可在搜寻AD时可以快速的对应容器内的物件。

### GUID

每一个物件都有一个唯一的GUID物件识别码，储存在objectGUID属性中，其编码方式与GUID相同。

### 其他名称

- Windows NT使用者名称系统：即SAM（Security Account Manager）的名称系统，储存在使用者的`sAMAccountName`属性中。
- 使用者主体名称：即User Principal Name，在AD中使用者是以`user@domain`的方式呈现，这个值储存在`userPrincipalName`属性。

## 功能层次

Active Directory于是一个开放式的目录服务，而且为了要能够容纳不同版本的Windows操作系统以及其网域，因此特别在AD中使用了一种版本控制的机制，称为功能层次（functional level），功能层次定义了目前在网域环境中可以使用的最大版本层次，同时这个修改是单向无法复原的修改。若网域中有不同版本操作系统的网域控制站，则为了最大的相容性，功能层次的设定应要以最低版本为主，例如一个网域中有Windows Server 2003和Windows 2000时，则网域的功能层次应该设为Windows 2000混合模式（Mixed Mode），若设为Windows Server 2003原生模式（Native Mode）时，Windows 2000的网域控制站会失效。但由于新版本的AD设定通常都会比前版的要强（尤其是安全性的改进），因此若网域中没有前版本的操作系统，则应将功能层次设定到最新版本，以开放AD的所有功能。

另外，若要在网域中安装新版本的操作系统（例如在Windows Server 2003网域中要安装Windows Server 2008）作为网域控制站时，必须要先将Active Directory中的Schema资讯做扩充以相容于较新版本的操作系统，因此微软在安装光碟中都会提供一个Active Directory准备工具 (adprep.exe），它可以让系统管理员以简单的方式升级Active Directory中的资料结构，包含树系以及网域的资料结构（使用参数设定），以相容于新版本操作系统。

- `adprep /forestprep`：升级树系的资料结构。
- `adprep /domainprep`：升级网域的资料结构。
- `adprep /rodcprep`：准备网域以提供RODC（只读网域控制站）的功能（Windows Server 2008以后版本才支援）。

对于Windows NT的BDC，则不是透过功能层次的设定，而是用Operation Master的PDC Emulator来保持相容性。

## 物件结构

由于微软在设计Active Directory是使用开放型的目录服务为方针，且目录服务的最基本特性之一就是要能“广纳百川”，除了基本的网络服务资料外，还需要能够和其他异质型服务连接与整合，因此微软在AD之中实作了一个物件的储存单位，称为“物件结构”（schema），物件结构可以视为AD物件的元数据（metadata）。每一个物件（不论是单元或是容器物件）都有各自的schema，用以储存识别该物件的不同资料，schema是由class和attribute所组成，attribute是最小的储存单元，class则是包含attribute的集合体。

储存在attribute中的资料有很多种格式，微软将这些格式定义成27种Schema资料型态，像是指示账户过期日的`Account-Expires`属性，其值是interval资料型态（代表时间周期，为一个64位元整数值），又如指示账户SAM名称的`sAMAccountName`属性，其值是String（Unicode）值（支援Unicode的字串值），又如储存使用者的照片的`Picture`属性，其值是Object(Repl-Link，代表是字节资料，且可以复制到其他网域控制站）。

微软也开放了可延伸schema的方法，开发人员可以利用这一套方法来延伸Active Directory Schema中的资料，但一旦写入AD后，即不可删除（因为物件识别码不可更动），但是可以停用，延伸AD Schema最好的例子就是Microsoft Exchange Server。

## 服务

Active Directory本身除基本的网络目录服务外，微软也应用这个基础架构设计了不同的服务，并且在Windows Server 2003不同的版次中加入，以提升Active Directory的应用范围。

### 联合服务

由于AD本身具有可分散式的身份验证与授权能力，且在2003年时Web正吹起了单一签入（single-sign on）的架构研究风，微软也开始利用AD来设计一个可支援多个网站（或应用程序）的单一签入功能，其实作品即为Active Directory Federation Services（AD联合服务，简称ADFS），它显露了几个主要成员：

- Federation Service：负责在ADFS的SSO架构中处理验证的服务器。
- Federation Service Proxy：在外部网络或是WS-I服务中，扮演Federation Service的代理角色，并支援WS-Federation规格的验证设定。
- Claim-aware client：由ADFS开放的Claim-aware（宣告感知）元件的Web用户端，或是ASP.NET应用程序，可直接支援ADFS的SSO架构。
- Windows Token-based Agent：以Windows验证为主的Web应用程序，ADFS可支援AD权仗与Windows NT权仗的模拟与交换。

此服务在Windows Server 2003 R2版本中首次出现，并在Windows Server 2008中升级为Active Directory Federation Service角色。

### 轻量级服务

轻量级服务（Lightweight Directory Service）在Windows Server 2003中被称为Active Directory Application Mode（ADAM），它是一个不需要与AD基础架构整合就可以独立运作的目录服务，适合用来表现企业的阶层化概念与物件的管理，而且开发人员只要把使用ADSI的经验搬过来即可使用，不必另外学习ADAM的操作方法，它也可以做为ADFS的外部验证提供者。轻量级目录可以在同一台电脑中安装多个执行个体，因此也很适合用ADAM来实作Directory-Enabled的应用程序，尤其是与组织结构相关的（例如人事或人力资源系统），ADAM本身也可以延伸schema，开发人员可以将ADAM视为另一种型式的数据库，也可以由AD中复制资料到ADAM，不过ADAM不会对AD进行站台复制，开发人员需要自行撰写程式来复制资料。

轻量级服务在Windows Server 2008中改名为Active Directory Lightweight Directory Service（简称AD LDS），并提升为AD的应用角色之一。

### 凭证服务

凭证服务（Certificate Service）是在Windows Server 2008中首次纳入Active Directory体系的服务，它原本是在Windows 2000与Windows Server 2003的凭证服务器（Certificate Server），用来建立企业中的公开金钥基础建设，在Windows Server 2008中，凭证和AD物件有了更强更紧密的整合，所以有了Active Directory Certificate Service（AD CS）的角色，这个角色还可以和权限管理的Right Management Service（RMS）整合在一起，提供对文件或应用程序层次的权利管理。

### 权利管理服务

权利管理服务（Right Management Service）也是在Windows Server 2008中首次纳入Active Directory体系的服务，最早的时候，它是在Microsoft Office 2003开始提出的资讯权利管理（Information Right Management）功能，可利用它来控制Office文件散布时的权限，例如打印以及储存档案等，接着微软发表了Right Management Server以及RMS SDK，供Windows Server 2003平台使用，而在Windows Server 2008中即将它整合到Active Directory中，变成AD服务的一部分。

## 整合Unix到Active Directory中

Active Directory互通的多样性层次得以透过符合标准的LDAP用户端在大多数的类Unix操作系统记录，但这些系统通常缺乏与Windows元件像是群组原则与单向信任关联的许多属性的自动直译，目前也有许多第三方软件厂商提供了将Unix平台（包含UNIX、Linux、Mac OS X与数个Java与Unix-based应用程序）整合Active Directory方法，这些供应商的一部分，包含Thursby Software System（ADmitMac）, Quest Software（Vintela Authentication Services）, Centrify（DirectControl），与Likewise Software（Likewise Open and Likewise Enterprise）。Microsoft也在这个市场中拥有为UNIX产品所设计的免费Microsoft Windows服务（即Windows Service for Unix）。

这些额外的物件结构在Windows Server 2003 R2版本中被释出，包含完全对应到RFC 2307的一般用途的属性。这些RFC 2307、nss_ldap与pam_ldap的参考实作均提供自PADL.com，包含直接使用这属性以及填充资讯的支援。预设群组成员（group membership）的Active Directory Schema与被提议的RFC 2307bis延伸功能一起编译。RFC 2307bis使用LDAP成员属性储存Unix的群组成员资料，与基础RFC 2307，以储存群组成员为以逗号分隔的使用者识别码清单有所不同。Windows Server 2003 R2包含了一个MMC snap-in以建立与编辑这些属性。

一个替代选项是使用其他的目录服务，像是Fedora Directory Server（之前的Netscape Directory Server）或是Sun的Java System Directory Server，它可以执行与Active Directory双向同步化，进而在需要使用FDS验证的Unix与Linux平台与需要使用Windows验证的Windows用户端之间，提供一个与Active Directory之间转向（deflected）的整合。另一个选项是使用OpenLDAP以及它的透通覆盖（translucent overlay）功能得以延伸项目于使用额外属性储存在本地数据库的任何远端LDAP服务器上。在本地数据库中指示的用户端将会看到包含在远端和地的属性，当远端数据库仍保持完整不变的情况下。

Samba 4，在2012年12月11日发布的 Samba 4中包含了一个Active Directory相容服务器。