Active Directory 批量导入和导出分步指南
本指南介绍如何联合运用轻量目录访问协议 (LDAP) 数据交换格式 (LDIF) 实用工具及若干使用 Microsoft Visual Basic®
Scripting Edition (VBScript) 开发系统编写的示例程序对 Active
Directory® 服务进行批处理管理。
本页内容
|
|
|
|
|
|
|
|
|
简介
逐步式指南
Windows Server 2003 部署分步指南提供了很多常见操作系统配置的实际操作经验。本指南首先介绍通过以下过程来建立通用网络结构:安装
Windows Server 2003;配置 Active
Directory;安装 Windows XP Professional 工作站并最后将此工作站添加到域中。后续分步指南假定您已建立了此通用网络结构。如果您不想遵循此通用网络结构,则需要在使用这些指南时进行适当的修改。
通用网络结构要求完成以下指南。
• |
|
• |
|
在配置通用网络结构后,可以使用任何其他的分步指南。注意,某些分步指南除具备通用网络结构要求外,可能还需要满足额外的先决条件。任何额外的要求都将在特定的分步指南中说明。
Microsoft Virtual PC
可 以在物理实验室环境中或通过虚拟化技术(如 Microsoft
Virtual PC 2004 或 Microsoft Virtual Server 2005)来实施 Windows Server 2003 部署分步指南。借助于虚拟机技术,客户可以同时在一台物理服务器上运行多个操作系统。Virtual PC 2004 和
Virtual Server 2005 就是为了在软件测试和开发、旧版应用程序迁移以及服务器整合方案中提高操作效率而设计的。
Windows Server 2003 部署分步指南假定所有配置都是在物理实验室环境中完成的,但大多数配置不经修改就可以应用于虚拟环境。
这些分步指南中提供的概念在虚拟环境中的应用不在本文的讨论范围之内。
重要说明
此处作为例子提到的公司、组织、产品、域名、电子邮件地址、徽标、个人、地点和事件纯属虚构,我们决无意影射,任何人也不应由此臆猜,任何真实的公司、组织、产品、域名、电子邮件地址、徽标、个人、地点或事件。
此通用基础结构是为在专用网络上使用而设计的。此通用基础结构中使用的虚拟公司名称和域名系统 (DNS) 名称并没有为在
Internet 上使用而注册。您不应在公共网络或 Internet 上使用此名称。
此 通用基础结构的 Active Directory 服务结构用于说明“Windows
Server 2003 更改和配置管理”如何与 Active Directory 配合使用。不能将其作为任何组织进行 Active Directory 配置时都可以使用的模型。
概述
本 指南介绍如何联合运用 LDAP 数据交换格式 (LDIF) 实用工具及一个使用 Microsoft Visual Basic
Scripting Edition (VBScript) 开发系统编写的简单程序对 Active Directory
服务进行批处理管理。通过使用这些工具,您可以导出、导入以及修改对象,如用户、联系人、组、服务器、打印机以及共享文件夹。
在本指南中,您将执行以下任务。
• |
使用 Ldifde.exe 实用工具执行批处理操作。将用户导出为与 LDIF 标准格式兼容的文件格式。执行所有用户的批处理修改。使用 LDIF 创建新用户和删除用户。 |
• |
使 用 Active Directory Service
Interfaces (ADSI) 和 VBScript 执行批处理操作。使用 ADSI 和 VBScript 编写的脚本将用户导出到文本文件。使用 VBScript 执行所有用户的批处理修改。使用 VBScript 创建新用户和删除用户。 |
先决条件
• |
|
• |
|
使用 Ldifde.exe 实用工具
LDIF 是关于文件格式的 Internet 草案标准,这种文件格式可用于在符合 LDAP 标准的目录上执行批处理操作。LDIF 可用于导出和导入数据,因而可以在 Active Directory 中执行添加、修改及删除等批处理操作。Windows Server 2003 操作系统中包含一个名为“Ldifde.exe”的实用工具,用于支持基于 LDIF 标准的批处理操作。
您还可使用 Ldifde.exe 实用工具来扩展架构,将 Active Directory 用户和组信息导出到其他应用程序或服务,以及使用来自其他目录服务的数据填充 Active Directory。
注意:在将测试的架构扩展推入生产环境时,建议使用 Ldifde.exe 实用工具。
导出对象
您可以使用 Ldifde.exe 实用工具导出“Marketing”组织单位 (OU) 中的所有对象,这些对象是在中创建的。该示例搜索
OU 中的某些对象,并创建一个包含这些对象名称的文件。
使用 LDIF 导出对象
1. |
以域管理员的身份登录。 |
2. |
单击“开始”按钮,指向“所有程序”,指向“附件”,然后单击“命令提示符”。 |
3. |
在“命令提示符”中,键入: ldifde -f marketing.ldf -s
hq-con-dc-01 -d "ou=marketing,ou=accounts,dc=contoso,dc=com" -p
subtree -r
"(objectCategory=CN=Person,CN=Schema,CN=Configuration,DC=contoso,DC=com)" |
4. |
按“Enter”键。结果应该与图 1 中显示的内容相似。 图 1. 导出目录数据 上 述命令使用以下方法来创建一个名为“Marketing.ldf”的 LDIF 文件:连接到名为“HQ-CON-DC 注意:objectCategory 是用于提高搜索性能的索引属性。 您 可以使用该 LDIF 文件进行批量导入,将“Marketing”OU 中的所有对象导入到与 LDAP 兼容的任何其他目录中。某些属性可能不适用于其他的 LDAP 实现。尤其在使用该机制将对象导入到其他
Active Directory 中时,由于在创建对象期间将自动生成某些属性,因此必须将这些属性省略。(如果没有明确省略它们,操作将会失败。) 例如,除了添加参数
–m 外,用于省略这些属性的 LDIFDE 命令与上述命令相同。 ldifde -f marketing.ldf -s
hq-con-dc-01 -d "ou=marketing,ou=accounts,dc=contoso,dc=com" -p
subtree -r
"(objectCategory=CN=Person,CN=Schema,CN=Configuration,DC=contoso,DC=com)"
–m |
修改对象
在以下示例中,整个“Marketing”组织搬到了新的办公地点。可通过修改省/自治区、街道、县/市以及邮政编码属性,使用 LDIF 对“Marketing”组织中的所有用户对象进行批量修改。
使用 LDIF 和“记事本”修改对象
1. |
单击“开始”按钮,指向“所有程序”,指向“附件”,然后单击“命令提示符”。 |
2. |
在命令提示符下,键入以下命令以提取所需的条目。 ldifde -f marketing.ldf -s
hq-con-dc-01 -d "ou=marketing,ou=accounts,dc=contoso,dc=com" -p
subtree –r
"(objectCategory=CN=Person,CN=Schema,CN=Configuration,DC=contoso,DC=com)"
-l "1,st,streetaddress,postalcode" 注意:在通用网络结构指南中,没有为“Marketing”OU 内的用户对象定义城市、省/自治区、地址以及邮政编码的条目。建议在执行该导出操作之前,为“Marketing”OU 中的每个用户对象填充这些字段。 |
3. |
按“Enter”键。 |
4. |
使用“记事本”打开“marketing.ldf”文件。 图 2. 检查
LDF 文件 |
5. |
在“记事本”中,修改“Marketing.ldf”中的每个用户对象条目,使之与图 3 的内容相似。注意:必须将文件保存为 .ldf 文件。 图 3. 修改 LDF 导入文件 |
6. |
关闭“记事本”。在“命令提示符”窗口中,键入: ldifde –i -f marketing.ldf -s
hq-con-dc-01 |
7. |
按“Enter”键。结果应该与图 4 中显示的内容相似。 图 4. 成功导入 LDF 文件 |
8. |
要确认已相应修改了用户对象属性,请使用“Active
Directory 用户和计算机”管理单元。(有关使用该管理单元的帮助,请参见 。) |
注意:另 一个名为
Csvde.exe 的实用工具执行与 Ldifde.exe 实用工具相同的功能,但是它使用逗号分隔的文件格式。使用该实用工具执行的导入操作只能“添加”对象,而不能修改或删除对象。Microsoft Excel 等应用程序支持逗号分隔值 (CSV) 文件格式。
创建和删除对象
以下示例中使用 LDIF 在 Active Directory 中添加和删除用户。
使用 LDIF 创建新用户
1. |
单击“开始”按钮,单击“运行”,键入“Notepad Newuser.ldf”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。 |
2. |
将以下文本添加到文件中。 dn: CN=Pilar
Ackerman,OU=Marketing,OU=Accounts,DC=contoso,DC=com changetype: add cn: Pilar Ackerman objectClass: user samAccountName: Pilar givenName: Pilar sn: Ackerman |
3. |
保存“newuser.ldf”文件,然后将其关闭。继续进行用户对象创建之前,检查是否将文件保存到了“Documents and Settings”目录中。 |
4. |
在“命令提示符”窗口中,键入以下内容。 ldifde –i -f newuser.ldf -s
hq-con-dc-01 |
5. |
按“Enter”键。完成后,“命令提示符”窗口将确认修改(如图
5 所示)。 图 5. 添加新用户 |
使用 LDIF 删除用户
1. |
单击“开始”按钮,单击“运行”,键入“Notepad
Deleteuser.ldf”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。 |
2. |
将以下文本添加到文件中。 dn: CN=Pilar
Ackerman,OU=Marketing,OU=Accounts,DC=contoso,DC=com changetype: delete |
3. |
保存“deleteuser.ldf”文件,然后将其关闭。 |
4. |
在“命令提示符”窗口中,键入以下内容。 ldifde –i -f deleteuser.ldf
-s hq-con-dc-01 |
使用 VBScript 和 ADSI
ADSI
可以使支持目录的应用程序的开发工作更加轻松。您可以使用 VBScript 或
Microsoft JScript® 开发软件编写脚本以执行批量目录操作(与 Windows Script Host 一起使用)。在本指南中,使用 VBScript 编写的简单应用程序执行上一节描述的过程(它使用的是 LDIF)。
注 意,这些脚本不包括任何错误检查,这意味着它们不提供 VBScript 和
ADSI 程序员参考。此处包含的所有示例都假设:您使用正确的凭据登录到作为目标域成员的计算机上。在 ADSI 中,可以明确指定凭据和目标域。完成每个过程后,请检查“Active Directory 用户和计算机”管理单元,确认条目已修改。
导出对象
本示例中使用文本编辑器(如“记事本”)来创建 VBScript 程序。该脚本搜索“Marketing”OU
并创建一个文本文件,该文件中将列出所有用户对象及其属性子集。
创建并执行导出脚本
1. |
单击“开始”按钮,单击“运行”,键入“Notepad
export.vbs”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。将以下文本复制到“export.vbs”中。 'Global variables Dim
oContainer Dim
OutPutFile Dim
FileSystem 'Initialize global variables Set FileSystem =
WScript.CreateObject("Scripting.FileSystemObject") Set OutPutFile =
FileSystem.CreateTextFile("marketing.txt", True) Set
oContainer=GetObject("LDAP://OU=Marketing,OU=Accounts,DC=contoso,DC=com") 'Enumerate Container EnumerateUsers oContainer 'Clean up OutPutFile.Close Set FileSystem = Nothing Set oContainer = Nothing WScript.Echo
"Finished" WScript.Quit(0) Sub EnumerateUsers(oCont) Dim oUser For Each oUser In oCont Select Case
LCase(oUser.Class) Case
"user" If Not
IsEmpty(oUser.distinguishedName) Then
OutPutFile.WriteLine "dn: " & oUser.distinguishedName End If If Not
IsEmpty(oUser.name) Then
OutPutFile.WriteLine "name: " & oUser.Get
("name") End If If Not
IsEmpty(oUser.streetAddress) Then
OutPutFile.WriteLine "streetAddress: " &
oUser.streetAddress End If If Not
IsEmpty(oUser.l) Then
OutPutFile.WriteLine "l: " & oUser.l End If If Not
IsEmpty(oUser.st) Then
OutPutFile.WriteLine "st: " & oUser.st End If If Not
IsEmpty(oUser.postalcode) Then
OutPutFile.WriteLine "postalcode: " & oUser.postalcode End If Case
"organizationalunit", "container" EnumerateUsers
oUser End Select OutPutFile.WriteLine Next End Sub |
2. |
保存“export.vbs”,然后关闭“记事本”。 |
3. |
在“命令提示符”窗口中,键入“export.vbs”,然后按“Enter”键。 |
注意:执行 export.vbs 操作可创建 Marketing.txt 文件,该文件包含用户及其属性子集的列表。
在 进行适当的修改后,该脚本就可以与支持 Microsoft 组件对象模型 (COM) 和 Visual Basic 技术的任何应用程序一起使用了。这些应用程序包括 Visual Basic、Excel 以及 Microsoft Access。Internet Explorer 和 Internet 信息服务也支持脚本。
修改对象
在本示例中,将更改“Marketing”OU 内的所有用户地址属性。可使用简单的 VBScript 程序,对“Marketing”组织中的所有用户对象进行批量修改。该脚本修改省/自治区、街道、县/市以及邮政编码属性。
创建并执行修改对象脚本
1. |
单击“开始”按钮,单击“运行”,键入“Notepad modify.vbs”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。将以下文本复制到“modify.vbs”中。 Dim oContainer Set
oContainer=GetObject("LDAP://OU=Marketing,OU=Accounts,DC=contoso,DC=com") ModifyUsers oContainer 'cleanup Set oContainer = Nothing WScript.Echo
"Finished" WScript.Quit Sub ModifyUsers(oObject) Dim oUser oObject.Filter =
Array("user") For Each oUser in oObject oUser.Put
"st"," oUser.Put
"streetAddress"," oUser.Put
"postalCode","98052" oUser.Put
"l"," oUser.SetInfo Next End Sub |
2. |
保存“modify.vbs”,然后关闭“记事本”。 |
3. |
在“命令提示符”窗口中,键入“modify.vbs”,然后按“Enter”键。 |
创建和删除对象
本示例中使用 VBScript 将新用户添加到“Marketing”组织中。该示例说明可以使用 ADSI 和 VBScript 非常方便地以编程方式访问目录。注意,在本示例中,在用户创建期间只配置了一组有限的属性。
创建并执行对象创建脚本
1. |
单击“开始”按钮,单击“运行”,键入“Notepad add.vbs”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。将以下文本复制到“add.vbs”中。 Dim oContainer Dim oUser Set oContainer=GetObject("LDAP://OU=Marketing,OU=Accounts,DC=contoso,DC=com") 'Create user Set oUser =
oContainer.Create("User","CN=Pilar Ackerman") 'Assign values to user attributes oUser.Put
"samAccountName","Pilar" oUser.Put
"givenName","Pilar" oUser.Put
"sn","Ackerman" oUser.Put
"userPrincipalName","pilar@contoso.com" oUser.SetInfo 'Clean up Set oUser = Nothing Set oContainer = Nothing WScript.Echo "Finished" WScript.Quit |
2. |
保存“add.vbs”,然后关闭“记事本”。 |
3. |
在“命令提示符”窗口中,键入“add.vbs”,然后按“Enter”键。 |
创建并执行对象删除脚本
1. |
单击“开始”按钮,单击“运行”,键入“Notepad delete.vbs”,然后单击“确定”。在出现相应提示时,单击“是”创建新的文件。将以下文本复制到“delete.vbs”中。 Dim oContainer Set
oContainer=GetObject("LDAP://OU=Marketing,OU=Accounts,DC=contoso,DC=com") 'Delete user oContainer.Delete
"user","CN=Pilar Ackerman" 'Clean up Set oContainer = Nothing WScript.Echo "Finished" WScript.Quit |
2. |
保存“delete.vbs”,然后关闭“记事本”。 |
3. |
在“命令提示符”窗口中,键入“delete.vbs”,然后按“Enter”键。 |
附录 — 使用 LDIFDE
语法
ldifde [-i] [-f FileName] [-s
ServerName] [-c String1 String2] [-v] [-j Path] [-t PortNumber] [-d BaseDN] [-r
LDAPFilter] [-p Scope] [-l LDAPAttributeList] [-o LDAPAttributeList] [-g] [-m]
[-n] [-k] [-a UserDistinguishedName Password] [-b UserName Domain Password]
[-?]
参数
-i
• |
指定导入模式。如果没有指定,则默认模式为导出。
|
-f FileName
• |
指定导入或导出文件名称。
|
-s ServerName
• |
指定执行导入或导出操作的域控制器。默认情况下,Ldifde 在安装了该实用工具的域控制器上运行。 |
-c String1 String2
• |
使用 String2 代替出现的所有 String1。通常在以下情况下使用此参数:从一个域向另一个域导入数据,并且需要将导出域的可分辨名称 (String1) 替换为导入域的可分辨名称 (String2)。 |
-v
• |
设置详细模式。 |
-j Path
• |
设置日志文件位置。默认为当前路径。
|
-t PortNumber
• |
指定 LDAP 端口号。默认 LDAP 端口为 389。全局编录端口为 3268。 |
-d BaseDN
• |
为数据导出设置搜索库的可分辨名称。
|
-r LDAPFilter
• |
为数据导出创建 LDAP 搜索筛选器。例如,要导出所有具有特定姓氏的用户,您可使用以下筛选器:-r (and(objectClass=User)(sn=Surname))。 |
-p Scope
• |
设置搜索范围。搜索范围选项有 Base、OneLevel 或 SubTree。 |
-l LDAPAttributeList
• |
设置在导出查询结果中返回的属性列表。如果省略该参数,则返回所有属性。
|
-o LDAPAttributeList
• |
设置在导出查询结果中省略的属性列表。通常在以下情况下使用此参数:从 Active Directory 中导出对象,然后将其导入到另一个与 LDAP 兼容的目录中。如果另一个目录不支持这些属性,可使用该选项在结果集中省略这些属性。 |
-g
• |
省略分页搜索。 |
-m
• |
省略仅应用于 Active Directory 对象的属性,如 ObjectGUID、objectSID、pwdLastSet 以及 samAccountType 属性。 |
-n
• |
省略二进制值的导出。
|
-k
• |
忽略导入操作期间的错误并继续处理。以下内容是忽略的错误的完整列表:
|
-a UserDistinguishedName
Password
• |
将命令设置为使用提供的用户可分辨名称和密码来运行。默认情况下,使用当前登录到网络上的用户的凭据运行命令。
|
-b UserName Domain Password
• |
将命令设置为使用提供的用户名域密码来运行。默认情况下,使用当前登录到网络上的用户的凭据运行命令。
|
-?
• |
显示命令菜单。 |
注释
在创建用于 Ldifde 命令的导入文件时,可使用 changeType 值来定义导入文件包含的更改类型。您可以使用以下
changeType 值:
值 |
说明 |
Add |
指定新内容包含在导入文件中。 |
modify |
指定已在导入文件中修改现有内容。 |
delete |
指定已在导入文件中删除内容。 |
以下内容是使用 add 值的 LDIF 导入文件格式示例。
DN: CN=
changetype: add
CN: SampleUser
description: DescriptionOfFile
objectClass: User
sAMAccountName: SampleUser
示例
若要只检索返回对象的可分辨名称、公用名称、名、姓以及电话号码,请键入:
-l DistinguishedName, CN,
GivenName, SN, Telephone
要省略对象 GUID,请键入:
-o whenCreated, whenChanged,
objectGUID
格式说明
格式 |
含义 |
斜体 |
用户必须提供的信息 |
粗体 |
用户必须完全按显示内容准确键入的元素 |
省略号 (...) |
可以在命令行中多次重复使用的参数 |
中括号内 ([]) |
可选项 |
大括号内 ({}) 用竖线 (|) 分隔的选项。例如:{even|odd} |
选项集,用户只能从其中选择一个 |
Courier 字体 |
代码或程序输出 |