作为网管,有时我们需要批量地向AD域中添加用户帐户,这些用户帐户既有一些相同的属性,又有一些不同属性。如果逐个添加、设置的话,十分地麻烦。一般来说,如果不超 过10个,我们可利用AD用户帐户复制来实现。如果再多的话,我们就应该考虑使用csvde.exe或ldifde.exe来减轻我们的工作量了。
一、 AD用户帐户复制
1、在“AD域和计算机”中建一个作为样板的用户,如S1。
2、设置相关需要的选项,如所属的用户组、登录时间、用户下次登录时需更改密码等。
3、在S1上/右键/复制,输入名字和口令。
说明:
1、 只有AD域用户帐户才可以复制,对于本地用户帐户无此功能。
2、 帐户复制可将在样板用户帐户设置的大多数属性带过来。具体如下: 选项卡
| 复制到新用户帐号的属性
| 常规 | 无。 | 地址 | 除了“街道”之外所有 | 帐户 | 除了“用户登录名”之外所有 | 配置文件 | 除“配置文件路径”和“主文件夹”。欲复制它们,应该使用
%username%变量,如:\\server\share\%username% | 电话 | 无 | 单位 | 除了“职务”之外所有。 | 隶属于 | 全部 | 拨入 | 无,将默认值应用于新帐户。 | 环境 | 无,将默认值应用于新帐户。 | 会话 | 无,将默认值应用于新帐户。 | 远程控制 | 无,将默认值应用于新帐户。 | 终端服务配置文件 | 无,将默认值应用于新帐户。 |
二、比较csvde与ldifde
| csvde逗号分隔符目录交换
| ldifde轻型目录访问协议
互换格式目录交换
| 功能 | 只能用来添加对象,不能用于删除/修改 | 可用于添加/删除/修改对象 | 格式 | 字段名1,字段名2,字段名3,……
记录1此值,记录1此值,记录1此值,…… | 字段名1: 记录1此值
字段名2: 记录1此值
字段名3: 记录1此值
…… | 举例 | Dn,objectclass,samaccountname,
userprincipalname,useraccountcontrol
“cn=s1,ou=test,dc=mcse,dc=com”
,user,s1,s1@mcse.com,512 | Dn: cn=s1,ou=test,dc=mcse,dc=com
Objectclass:user
Samaccountname:s1
Userprincipalname:s1@mcse.com
useraccountcontrol:512 |
共同点 | 用于导入的文本文件必须包含:
* 用户帐号的OU,对象的类型以及用户登录名的路径,用户主名
* 默认(即不指定时):用户帐户为禁用。启用:512,禁用:514
* 可包含个人信息,但不可包含密码,只能用默认的空口令。
* 或通过设pwdLastSet字段值为0,使“用户下次登录时须更改密码”
(不设这个字段,默认也是如此)。
* 通过设userAccountControl字段值为66048,可使“密码永不过期”。 |
三、以csvde.exe为例说明:域用户帐户的导出/导入
操作步骤如下:
1、 在“AD域和计算机”中建一个用户,如S1。
2、 设置相关需要的选项,如所属的用户组、登录时间、用户下次登录时需更改密码等。
3、 在DC上,开始/运行:cmd
4、 键入:csvde –f demo.csv
说明:
(1)不要试图将这个文件导回,来验证是否好使。因为这个文件中的好多字段在导入时是不允许用的,如:ObjectGUID、objectSID、pwdLastSet 和 samAccountType 等属性。我们导出这个文件目的只是为了查看相应的字段名是什么,其值应该怎么写,出错信息如下:
objectGUID:写 | UNPRINTABLEBINARY(16) | "由于安全原因不允许修改。" | objectSid:写 | UNPRINTABLEBINARY(28) | "由于该属性处于“安全帐户管理器”
(SAM),不允许访问该属性。" |
(2)可通过-d –r参数指定导出范围和对象类型。例如:
-d “ou=test,dc=mcse,dc=com” 或 -d “cn=users,dc=mcse,dc=com”
-r “< Objectclass=user>”
5、 以上面的文件为参考基础,创建自己的my.csv,并利用复制、粘贴、修改得到多条记录。例如:
dn,objectClass,sAMAccountName,userAccountControl,userPrincipalName
"CN=s1,OU=test,DC=mcse,DC=com",user,S1,512,S1@mcse.com
"CN=s2,OU=test,DC=mcse,DC=com",user,S2,512,S2@mcse.com
………………
其它可用字段,我试了一下,见下表(不全):
用户帐户属性
| 字符名
| 说明
|
| “常规”标签
| | 姓 | Sn | | 名 | Givename | | 英文缩写 | Initials | | 显示名称 | displayName | | 描述 | Description | | 办公室 | physicalDeliveryOfficeName | | 电话号码 | telephoneNumber | | 电话号码:其它 | otherTelephone | 多个以英文分号分隔 | 电子邮件 | Mail | | 网页 | wWWHomePage | | 网页:其它 | url | 多个以英文分号分隔 | | “地址”标签
| | 国家/地区 | C | 如:中国CN,英国GB | 省/自治区 | St | | 市/县 | L | | 街道 | streetAddress | | 邮政信箱 | postOfficeBox | | 邮政编码 | postalCode | | | “帐户”标签
| | 用户登录名 | userPrincipalName | 形如:S1@mcse.com | 用户登录名(以前版本) | sAMAccountName | 形如:S1 | 登录时间 | logonHours | | 登录到 | userWorkstations | 多个以英文逗号分隔 | 用户帐户控制 | userAccountControl | 启用:512,禁用:514,66050
密码永不过期:66048 | 帐户过期 | accountExpires | | | “配置文件”标签
| | 配置文件路径 | profilePath | | 登录脚本 | scriptPath | | 主文件夹:本地路径 | homeDirectory | | 连接 | homeDrive | | 到 | homeDirectory | | | “电话”标签
| | 家庭电话 | homePhone | 若是其它,在前面加other。
| 寻呼机 | Pager | 如:otherhomePhone。
| 移动电话 | mobile | 若多个以英文分号分隔。 | 传真 | FacsimileTelephoneNumber | | IP电话 | ipPhone | | 注释 | Info | |
| “单位”标签
| | 职务 | Title | | 部门 | Department | | 公司 | Company | | | “隶属于”标签
| | 隶属于 | memberOf | 用户组的DN不需使用引号,
多个用分号分隔 |
| “拨入”标签
| | 远程访问权限(拨入或VPN) | msNPAllowDialin | | 允许访问 | 值:TRUE | | 拒绝访问 | 值:FALSE | | 回拨选项 | msRADIUSServiceType | | 由呼叫方设置或回拨到 | 值:4 | | 总是回拨到 | msRADIUSCallbackNumber | |
“环境”、“会话”、“远程控制”、“终端服务配置文件”、“COM+”标签 | 说明:这些标签,平常极少用到,我也没试。如果需要可以自己导出来看一下,像一些复杂的字段,如:userParameters,还是用粘贴吧 |
6、导入到AD,键入 csvde –i –f my.csv –j c:\
说明:-j用于设置日志文件位置,默认为当前路径。此选项可帮助用户在导入不成功时排错。
有一点大家必须明确的是:我们在这里做AD域用户帐户复制、做AD域用户帐户的导出/导入,并不能代替“AD备份和恢复”。我们只是在批量创建用户帐号,帐号的SID都是重新生成的,权利权限都得重新设才行。(当然我们可以把导入的用户,通过memberof字段设到一些用户组中去,使它有权利权限。但这与利用“AD备份和恢复”到原状,完全是两回事)。
=====================================================================
追加:利用ldifde修改域用户帐号属性
开始/运行:ldifde -i -f modify.txt
修改域用户帐号user1的“部门”为Info,示例modify.txt的内容如下:
dn: CN=user1,CN=Users,DC=mcse,DC=com
changetype:modify
replace: department
department: info
-
最后的“-” 一定要加上,不然是会报错的,切记!!!冒号后有没有空一格没有关系。
中文的问题,可以先通过导出,查看某个文字的编码。编辑文件时,一粘过来就可以了。
如:“测”字编码为“5rWL”,“试”字编码为“6K+V”
下面为用于导入的文章内容:
dn: CN=user1,CN=users,DC=mcse,DC=com
changetype: modify
replace:department
department::5rWL6K+V
-
……
注意:必须两个冒号
=====================================================================
追加:利用脚本创建批量用户帐户
1、利用脚本创建用户帐号(用户可参考下例)。
Set objDomain = GetObject(LDAP://dc=fabrikam,dc=com)
Set objOU = objDomain.Create("organizationalUnit", "ou=Management")
objOU.SetInfo
说明:在fabrikam.com域创建一个名叫Management的OU。
Set objOU = GetObject(LDAP://OU=Management,dc=fabrikam,dc=com)
Set objUser = objOU.Create("User", "cn= AckermanPila")
objUser.Put "sAMAccountName", "AckermanPila"
objUser.SetInfo
objUser.SetPassword "i5A2sj*!"
objUser.AccountDisabled = FALSE
objUser.SetInfo
说明:在Management OU下创建一个名叫AckermanPila的用户,口令为i5A2sj*!,启用。
Set objOU = GetObject(LDAP://OU=Management,dc=fabrikam,dc=com)
Set objGroup = objOU.Create("Group", "cn=atl-users")
objGroup.Put "sAMAccountName", "atl-users"
objGroup.SetInfo
objGroup.Add objUser.ADSPath
objGroup.SetInfo
说明:在Management OU下创建一个名叫atl-users的用户组,将用户AckermanPila加入到这个组中。
Wscript.echo "Script ended successfully"
说明:显示“脚本成功结束”信息
2、利用脚本中的循环功能实现批量创建用户帐号
Set objRootDSE = GetObject(LDAP://rootDSE)
Set objContainer = GetObject("LDAP://cn=Users," & _ objRootDSE.Get("defaultNamingContext"))
For i = 1 To 1000
Set objUser = objContainer.Create("User", "cn=UserNo" & i)
objUser.Put "sAMAccountName", "UserNo" & i
objUser.SetInfo
objUser.SetPassword "i5A2sj*!"
objUser.AccountDisabled = FALSE
objUser.SetInfo
Next
WScript.Echo "1000 Users created."
说明:在当前域的Users容器中创建UserNo1到UserNo1000,共1000个用户帐户 |