代码改变世界

批量(导入导出)迁移AD中的用户信息和密码到新环境中,同时保持用户在MOSS中的权限【addusers,ldifde,copypwd,UserInfo,tp_SystemID】

2009-10-30 22:32  Virus-BeautyCode  阅读(8110)  评论(2编辑  收藏  举报

  工具介绍:

  1、ldifde是系统自带命令行工具,直接在cmd就可以运行。

  2、addusers是在wind2k resource kit中的命令工具,可以通过安装wind2k resource kit来获取,下载地址:http://download.microsoft.com/download/8/e/c/8ec3a7d8-05b4-440a-a71e-ca3ee25fe057/rktools.exe

  3、copypwd可以导出、导入域用户的密码,可以在迁移用户之后,用来恢复用户的密码,当然了,由于导出的密码是hash的结果,能够被解密,为安全起见,使用之后请将导出的密码文件删除。下载地址:http://blogimg.chinaunix.net/blog/upfile2/081231194831.zip

  用到的sql:

   sql来自: http://vspug.com/dustin/2007/04/08/stsadm-in-a-gui-2007-version/

 

同步MOSS的用户SID,和AD的用户SID保持一致

  另外介绍:

  工具ADSI Editor也是一个很好用的工具,可以编辑AD中的很多信息,还可以使我们更加了解AD。可以通过安装系统安装盘的【I386\SUPPORT\TOOLS】目录中的SUPTOOLS.MSI,来安装。也可以下载:http://download.microsoft.com/download/3/e/4/3e438f5e-24ef-4637-abd1-981341d349c7/WindowsServer2003-KB892777-SupportTools-x86-ENU.exe文件进行安装。

  需求说明:

  如果你的AD环境因为多次的修改,例如调整域名、修改设置、反复安装和域相关的软件,导致在安装某些软件的时候会提示你【联系不上域,找不到域控制器】之类的错误的时候,这时候你想到了重新安装系统和域,但是域中的用户怎么办?就算用户抢救回来了,可是大多用户都修改了密码,想要这次变动在他们不知道的情况下,而且他们不会向你的上司抱怨“怎么密码又给我重置了,你们IT的每天都在做什么啊”,然后这些抱怨最终是会落到你的头上的,这时候怎么办?密码也回来了,可是用户的SID呢?在MOSS网站中用户的权限怎么办?新添加的用户虽然和以前的用户信息都一致,可是SID不一致,导致用户在MOSS网站的权限需要重新配置,在不能编辑新用户的SID的情况下(至少现在还不知道如何编辑域用户的SID值),如何修改它们在MOSS网站中的映射用户的SID值呢?

 

  步骤说明:

1、导出指定的组织单元信息,192.168.0.1为域控制器的IP

ldifde -f c:\exportOu.ldf -s 192.168.0.1 -d "dc=moss,dc=com" -p subtree -r "(&(objectClass=organizationalUnit)(ou=TestOu))" -l "cn,name,objectClass,ou,DistinguishedName,objectCategory"

2、导出指定的域(组织单元)中用户信息,192.168.0.1为域控制器的IP

ldifde -f c:\exportUser.ldf -s 192.168.0.1 -d "ou=TestOU,dc=moss,dc=com" -p subtree -r "(|(objectClass=user)(objectClass=group))" -l "cn,name,objectClass,displayName,DistinguishedName,sAMAccountName,sn,title,userPrincipalName"


3、导入域组织单元信息,192.168.0.1为域控制器的IP

ldifde -i -f c:\exportOu.ldf -s 192.168.0.1


4、导入域中用户信息,192.168.0.1为域控制器的IP
ldifde -i -f c:\exportUser.ldf -s 192.168.0.1

5、导出域用户密码【不能在远程中执行这个命令,只能在本机使用这个命令,运行的同时注意关闭防火墙软件,不能修改命令中的文件名copypwd.txt】

copypwd dump > copypwd.txt

6、导入域用户密码,自动查找同目录的copypwd.txt文件


copypwd set

7、启用账户【导入用户之后账户是禁用状态】


8、修改账户的密码策略为【密码永远不过期】


9、使用AD的账号SID同步MOSS的内容数据库的【UserInfo】中的【tp_SystemID】列的对应值,使用开始工具中介绍的用到的sql【同步MOSS的用户SID,和AD的用户SID保持一致】,因为在MOSS网站的内容数据库的UserInfo表中存储了登录网站的用户信息,其中的tp_SystemID列存储的是AD的域用户的SID值,所以我们在新建用户之后可以使用这段SQL来更新UserInfo表中的tp_SystemID列,使其和新添加的用户的SID保持一致,这样新添加的用户在MOSS网站中的权限就可以不用重新配置了。


注意:
1、导入密码之后密码策略会变成【下次登陆需要修改密码】,只要在登陆之前设置为【密码永远不过期】
2、导入密码之前删除不需要导入密码的帐户信息,只导入需要恢复密码的帐户信息,删除例如administrator之类的系统帐户信息
3、使用addusers导入导出域用户有局限,因为导出的用户信息属性有限,有的属性导不出来
4、使用ldifde导入组织单元和用户的时候有一些属性不能导入,我刚开始导出的时候就是想多导出一些属性,然后把这些属性都导进去,用户信息就齐全了,可是后来发现有的属性可以导出,但是导入的时候就会提示【架构不正确】之类的错误信息,经过多次尝试,删除不能导入的属性,就可以正常运行了。

 

 

下面是另外一位老兄的blog,原文地址如下,大家也可以参考。

 http://imdbt.blog.51cto.com/903896/213331

【现象】
    客户的一台MOSS服务器迁移到了一个新域,域名不同。原来的用户账号也迁移过来了,用户可以登录到域,但是访问MOSS的时候提示没有权限,重新授权后也可以访问。
 
【分析】
    AD账号迁移到新域之后,SID发生了变化。MOSS网站的WSS_Content数据库中Userinfo表中存储的还是旧的SID,所以提示无法访问。
    有部分账号客户手工重新添加到MOSS中了,这部分账号不能更新SID,因为Userinfo表有一个tp_siteid,tp_login,tp_deleted的组合主键,不运出现重复。
 
【解决方法】
     1.将WSS_Content 数据库中UserInfo表中的账号和SID 都更新为新域的账号和SID
     2.使用游标技术,每次取一个账号
     3.使用Suser_SID(‘LoginName’) 函数获取账号的SID
     4.Replace(列名,'字符串','字符串')用来替换旧的域名为新的域名
    5.begin try ....end try, begin catch...end catch 语句用来进行异常处理,让代码出现异常之后,还能继续向下执行
 
【修复代码】
DECLARE @Login Varchar(40), @Systemid Varbinary(128) 
DECLARE Curusers CURSOR LOCAL FOR    
        SELECT Tp_Login, Tp_Systemid FROM Userinfo Where Tp_Deleted = 0 

OPEN Curusers 
FETCH NEXT FROM Curusers INTO @Login, @Systemid 
WHILE @@FETCH_STATUS = 0 
BEGIN 
Begin Try 
  PRINT 'Resetting Login ' + @Login + ' To New Login ' 
  Update Userinfo Set Tp_Login=Replace(Tp_Login, '旧域名\','新域名\'
             WHERE CURRENT OF Curusers 
End Try 
Begin Catch 
  PRINT 'Resetting Login ' + @Login + ' Failed! ' 
  PRINT Error_Message() 
End Catch 
Begin Try 
  PRINT 'Resetting SID ' + @Login + ' To New SID ' 
  PRINT Suser_Sid(@Login) 
  UPDATE Userinfo SET Tp_Systemid = Suser_Sid(Tp_Login)    
        WHERE CURRENT OF Curusers 
End Try 
Begin Catch 
   PRINT 'Resetting SID ' + @Login + ' Failed! ' 
   PRINT Error_Message() 
End Catch 
FETCH NEXT FROM Curusers INTO @Login, @Systemid 
END 
CLOSE Curusers 

DEALLOCATE Curusers