问: User Profile获取大致分为几个过程?

答:

两个. 从Active Directory到SSP的过程叫做Profile Import. 从SSP到Site Collection的过程叫做Profile Sync.

 

问: SharePoint的所有用户的profile信息都会被同步(sync)么?

答:

不是. 只有在数据库里, userinfo表中列tp_isactive标志位是1的用户的profile信息才会被同步, 即这个用户得是active的才可以.

use WSS_Content_80
go
select tp_Login, tp_Title, tp_Email, tp_IsActive from UserInfo

 

问: 那在MySite中的情况, 又如何呢?

答:

用户在自己的MySite中永远都是active的, 所以, 总是会同步的.

 

问: 用户在什么情况下才会被mark为active的呢?

答:

这个情况有点复杂. 不过慢点来也是说得清楚的. 如果一个用户被直接地添加到site collection中, 并且赋予contribute或更高的权限, 那么这个用户会被标志位active, 他的profile会被sync. 换句话说, 用户必须得在站点集上是active的, 他的profile才可以sync.

 

如果一个用户是通过组添加到site collection中的, 那么它的标志位不一定会是active的.

 

首先, 如果用户是通过AD组添加的, 这个用户仅会在他对站点上的某个文档或资源有contribute的时候, 才会被设置为active. 如果用户被添加到AD组中, 但是他一直没有在站点集上添加或修改过任何内容, 那么他的profile就不会被sync. 当这个AD组只有read权限的时候, 这个用户是不会因为在这个组里而被sync的.

 

如果用户是通过SharePoint组添加的, 那么他总是会被sync的. 如果他在一个AD组里, 而且是通过SharePoint组中包含这个AD组而获得权限, 那他的profile不会被sync. 如果SharePoint group包含一个AD group, 那么除非这个Ad Group里的用户对站点添加或修改了什么东西, 否则他是不会被sync的.

 

问: 是不是所有的属性都会在站点集之间同步呢?

答:

不是的. 只有被标识为Replicable的属性才会. 查看这个标志的位置在SSP->User profiles and properties->View profile properties页面里, 点击一个属性, 编辑它, 在Policy Settings的部分里, 有一个叫做replicable的复选框.

一般来说, replicable的属性包括Name, Work e-mail, Responsibilities, About me, Photo, Office Single Value, Title, Work phone, Last name, First name, Department, User name, Web site, SIP Address等.

有一些replicable的属性可以被映射到AD的属性上, 所以任何对这些属性的修改都会在下一次从AD同步时被覆盖掉.

 

问: 负责Profile Sync的timer job是什么? 有什么区别?

答:

有两个timer job负责profile的同步.

 

第一个, 叫做Quick Profile Sync Job. 它负责添加新用户到Site Collections中. 当一个用户首次在一个站点集上被标示为Active, Quick Profile Job运行时会把这个用户的profile信息同步到Site Collection中. 在服务器场中, 典型地, 这个job会每分钟运行一次.

 

第二个, 叫做Profile Sync Job. 它负责同步更新已经被添加到站点集中了的用户信息. 比如说, 在站点集上, 一个user被标示为Active, 他的profile也被输入了. 稍后, 这个user的profile信息进行了更新(比如改了电话, 邮件地址什么的). Profile Sync Job会负责在站点集层次上进行这个更新. 默认情况下, 这个Job每小时运行一次. 当一个用户修改了他的profile信息(要么通过AD, 要么通过MySite, 编辑详细信息修改), 首先在SSP中存储的信息会修改, 每隔一小时, 这个job会运行一次, 在每一个该用户的标志是Active的站点集上进行更新.

 

问: 每个站点集上都有自己的user profile信息, 这样是不是有点多余?

答:

是有点. 不过这样做是为了提高性能. 总的数据存放在SSP中, 如果没有冗余, 那么所有的对于用户profile的信息的请求都会压在一个SSP的数据库上. 这样分散profile数据到各自的site collection中, 可以降低单个数据库上对于profile请求的压力.

 

问: 为啥非要只Sync标示为Active的用户呢?

答:

也是性能方面的原因吧. 如果所有domain的account都sync的话, 那要是domain里用户多一点, 成千上万, 这笔性能开销还是很大的.

 

问: 如果出了问题, 有的账户的信息不能sync, 咋办?

答:

知道了Active这回事儿, 你就可以首先在数据库里看看这个用户在某站点集上的记录中的tp_isActive是不是true. 如果不是, 可以尝试赋予这个用户contribute或以上的权限, 在站点集里修改点什么东西. 等一个小时看看. 或者, Actions -> Site Settings -> People and Groups->All People group, 把这个用户移除, 然后在添加回来, 记住, 权限得是contribute或以上.

 

如果你发现一个user的profile信息只在某个site collection上没有同步, 可能是由于这个站点集处于准备移动的状态, 一旦站点集处于这种状态, 有些功能就不能再运行了, profile的同步就是其中之一.

 

你可以尝试在SQL中运行下面的查询

use SharedServices1_DB
go
select ContentDBID, SiteID, Moving from sitesynch (nolock) where Moving=1
---------------------------
--Assume we got a result entry, 
--  which contentdbid is 9B6AC78F-BFB9-4976-8D98-70EAE30F0862, 
--   and siteid is B658959B-CB67-45BC-8F40-BD8AD4B805DD
---------------------------
use SharePoint_Config
go
select Name, Id from Objects where Id like '9B6AC78F-BFB9-4976-8D98-70EAE30F0862'
select Path, Id from SiteMap where Id like 'B658959B-CB67-45BC-8F40-BD8AD4B805DD'

通过这些查询, 你可以定位content database的名字, 和站点集的路径.

然后, 运行下面的命令来让moving这个标志位设置回到0。

stsadm -o preparetomove -site <SiteCollectionURL> -undo

 

为啥要有这个moving的状态呢? 因为在移动站点集的时候, 我们不希望这个站点集上有任何的修改. 移动结束了, 忘了改回来了, profile不能同步的问题就出现了.

 

如果上面的步骤还不起作用, 那么就得使用下面的命令了.

stsadm -o sync deleteolddatabases 0

这个命令删除当前还没有synch的content db的记录. 这会让SSP强制重新sync这些内容数据库.(SharePoint Profile Import)

 

还有一点, 如果站点的状态变为了unprovisioned, 那么这个站点的user profile也是不会被sync的.

如何确定一个站点的状态是不是unprovisionde呢? 如果是, 那么如何改回来呢?

对Content Database运行下面的查询, 结果集中UnProvisioned列为1的就是状态为unprovisioned的了.

select id, title, fullurl, cast((Flags & 0x100) as bit) as UnProvisioned from Webs

 

修复的方式是运行一个名为proc_markWebAsProvisioned的存储过程. 把上一步的来的id作为参数传给这个存储过程就可以了. 把该SharePoint的存储过程的源码贴在这里, 方便大家理解.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[proc_markWebAsProvisioned](
    @WebId uniqueidentifier)
AS
    SET NOCOUNT ON
    UPDATE 
        Webs
    SET
        Flags = ~(0x100 | ~Flags)
    WHERE
        Id = @WebId

 

参考资料:

Syncing WSS and MOSS User profile properties with Active Directory

http://sharepointnotes.wordpress.com/2008/05/05/syncing-wss-and-moss-user-profile-properties-with-active-directory/

MOSS User Profiles not syncing with Site User Info

http://www.portalsolutions.net/Blog/Lists/Posts/Post.aspx?List=1fef67f0-70ca-4263-b683-f10c1958687a&ID=35&Web=2a4e9897-6530-44a1-80b5-4fac295c2c26