【现象】
    客户的一台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