【现象】
客户的一台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
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
转载于:https://blog.51cto.com/imdbt/213331