前几天在群中51CTO的HZ022朋友提出了个关于AD用户批量更新OU的问题,大家都清楚在AD图形界面中我们只能一个个增加、移动、删除用户,这样操作有时真的够烦的,在大批量操作时浪费的时间也很多,有没有更好的办法解决我们经常面临的问题呢?其实我们可以使用简单的脚本来实现所需的功能,在这里我把它延伸为下面几个问题并进行解答。后面编写的一个脚本同样可以完成下面的操作,大家可以下载下了测试一下哦,如果脚本在测试时你有更好的方法或发现有错误的地方可得知会一下小弟哦。

1.假设一个企业(DC为www.gr.com,以下相同)中有1000个用户,其中包含了user字符的有100个用户,它们分部在不同的OU中,如:IT,PM,MRP,ACC等等,现在我们新建了一个OU名称为Sales,现在如何将这100个用户从其它的OU中移至Sales这个OU?

解答:

  • dsquery user –name *user* >>c:\user.txt

  • for /f %i in (c:\user.txt) do dsmove %i -newparent ou=Sales,dc=www,dc=gr,dc=com

2.假设一个企业中有1000个用户,其中有100个用户属于Sales组,它们分部在不同的OU中,如:IT,PM,MRP,ACC等等,现在我们新建了一个OU名称为Sales,现在如何属于Sales组的这些用户从其它的OU中移至Sales这个OU?

解答:

  • dsget group "cn=Sales,cn=users,dc=www,dc=gr,dc=com" -members >>c:\user.txt

  • for /f %i in (c:\user.txt) do dsmove %i -newparent ou=Sales,dc=www,dc=gr,dc=com

3.假设一个企业新进100个职员,他们分别分配在IT,PM,MRP,ACC,Sales部门,现在如何批量建立这些用户并设置他们所在的组和OU?

解答:

  • 首先建立一个c:\userlist.csv,格式如下:    
       henGong,ACC,p@ssw0rd      
       ChengYuanZhi,IT,p@ssw0rd      
       ChengPu,MRP,p@ssw0rd

  • FOR /F "eol=; tokens=1,2,3* delims=, " %a in (c:\userlist.csv) do dsadd user "cn=%a,ou=%b,dc=www,dc=gr,dc=com" -pwd %c -samid %a -upn %a@www.gr.com

4.时间长了,由于职员离职等原因,在AD中被禁用的用户越来越多,而且他们分部在不同的OU中,如何将这些被禁用的用户批量的删除掉呢?

解答:

  • dsquery user -disabled >>c:\user.txt

  • for /f %i in (c:\user.txt) do dsrm -noprompt -c "%i"

 

总结上面几个问题,我编写了一个脚本,运用它我们可以简单的来实现以上功能。

脚本如下,大家可以拷贝到记事本中并保存为cmd格式,你也可以下载我上传的文件分别将其后缀改为cmd和csv,其中此脚本中我所用的测试DCwww.gr.com,请试验时将脚本中相应部分更改为你自己的DC。

@echo off  
cls    
cd\    
c:    
echo.    
echo -------------------------------------------    
echo 此脚本用于更改AD用户所在的OU及批量建立用户.    
echo -------------------------------------------    
echo.    
echo 【1】批量更改用户至新OU    
echo 【2】将同一组用户更改至新OU    
echo 【3】批量建立用户    
echo 【4】批量删除被禁用用户

echo -------------------------------------------  
echo.    
set /p select=请在菜单中选择:    
if "%select%"=="1" set /p username=请输入所需查找用户(可使用匹配符): &goto A    
if "%select%"=="2" set /p groupname=请输入所需查找组名: &goto B    
if "%select%"=="3" goto D    
if "%select%"=="4" goto E

:A  
dsquery user -name %username% >>user.txt    
echo.    
echo ---------------------------    
echo 已成功导出所匹配的用户信息。    
echo ---------------------------

goto C

:B  
dsget group "cn=%groupname%,cn=users,dc=www,dc=gr,dc=com" -members >>user.txt    
echo.    
echo ----------------------------------    
echo 已成功导出%groupname%组的用户信息。    
echo ----------------------------------

goto C

:C  
echo.    
set /p ouname=请输入用户所需更新到的OU:    
for /f %%i in (user.txt) do dsmove %%i -newparent ou=%ouname%,dc=www,dc=gr,dc=com

echo.    
echo ----------------------------------------    
echo 已成功更新用户到 %ouname% OU中,谢谢使用。    
echo ----------------------------------------    
echo.

goto Z

:D

set /p userpath=请输入用户列表文件路径(c:\userlist.csv):  
FOR /F "eol=; tokens=1,2,3* delims=, " %%a in (%userpath%) do dsadd user "cn=%%a,ou=%%b,dc=www,dc=gr,dc=com" -pwd %%c -samid %%a -upn %%a@www.gr.com

echo.    
echo ----------------------------------------------------    
echo 已成功创建%userpath%列表中的用户,谢谢使用。    
echo ----------------------------------------------------    
echo.

goto Z

:E  
set /p select=请确定删除被禁用用户吗?(y/n):

if "%select%"=="y" goto F  
if "%select%"=="n" goto Z

:F  
dsquery user -disabled >>user.txt    
for /f %%i in (user.txt) do dsrm -noprompt -c "%%i"

echo.    
echo -------------------------------    
echo 已成功删除被禁用用户,谢谢使用。    
echo -------------------------------    
echo.

:Z  
del user.txt    
pause    
echo on

 

以上脚本欢迎大家指正,谢谢。