如何:使用更改日志获取最新用户配置文件更改
上次修改时间: 2010年1月27日
适用范围: SharePoint Server 2010
Microsoft SharePoint Server 2010 提供了用户配置文件存储的更改跟踪对象模型,支持基于个人的警告。这些警告通知您有关纪念日及用户配置文件中的其他更改。SharePoint Server 2010 将用户配置文件中的所有日期字段作为纪念日。当用户配置文件中的某个日期与当前日期匹配(基于服务器时间)时,SharePoint Server 2010 将创建一个新的纪念日事件。注意,更改日期字段不会创建事件。
更改跟踪对象模型的实现与 Microsoft SharePoint Foundation 2010SPChange 对象类似,但是没有后者稳固。UserProfile 类定义了两种过载方法,以支持更改跟踪。这两种方法是:
公共 Microsoft.Office.Server.UserProfiles.UserProfileChangeCollection GetChanges(Microsoft.Office.Server.UserProfiles.UserProfileChangeQuery)
公共 Microsoft.Office.Server.UserProfiles.UserProfileChangeCollection GetColleagueChanges (Microsoft.Office.Server.UserProfiles.UserProfileChangeQuery)
使用 UserProfile 对象的 GetChanges 方法返回在给定时间范围内用户配置文件中发生的更改集合。SPChange 对象包含更改类型的相关信息,如 ChangeType 枚举所呈现的类似。ChangeType 值表明更改类型,包括添加、更新、删除或重命名更改。
UserProfileChangeQuery 是一种枚举,说明了您关注的更改事件。例如,它可以是:
DistributionListMembership
Colleague
QuickLink
Anniversary
ProfileProperty
UserProfile
PrivacyItem
SingleValueProperty
MultivalueProperty
SiteMembership
以下代码示例演示了如何使用 GetChanges() 方法来查找最近 5 天内用户配置文件中的更改。注意,GetColleagueChanges() 方法的运行方式相同,将返回用户同事的配置文件中的更改。
在使用此代码示例前,请用实际值替换 domainname、username 和其他占位符,同时在 Microsoft Visual Studio 中将引用添加到以下各项:
Microsoft.Office.Server
Microsoft.Office.Server.UseProfiles
Microsoft.SharePoint
System.Web
示例
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Server;
using Microsoft.Office.Server.Administration;
using Microsoft.Office.Server.UserProfiles;
using Microsoft.SharePoint;
using System.Web;
namespace UserProfilesOMApp
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://servername"))
{
SPServiceContext context = SPServiceContext.GetContext(site);
UserProfileManager profileManager =
new UserProfileManager(context);
// this gets some subset of changes to a user profile
DateTime startDate =
DateTime.UtcNow.Subtract(TimeSpan.FromDays(5));
UserProfileChangeQuery changeQuery =
new UserProfileChangeQuery(false, true);
UserProfileChangeToken changeToken =
new UserProfileChangeToken(startDate);
changeQuery.ChangeTokenStart = changeToken;
changeQuery.Anniversary = true;
changeQuery.SingleValueProperty = true;
changeQuery.MultiValueProperty = true;
changeQuery.DistributionListMembership = true;
changeQuery.SiteMembership = true;
UserProfileChangeCollection changes =
profileManager.GetUserProfile
("domainname\\username").
GetChanges(changeQuery);
foreach (UserProfileChange change in changes)
{
Console.WriteLine(change.EventTime.ToString());
if (change is UserProfilePropertyValueChange)
{
UserProfilePropertyValueChange propertyChange =
(UserProfilePropertyValueChange)change;
Console.WriteLine(propertyChange.
ChangeType.ToString());
}
else if (change is UserProfileMembershipChange)
{
UserProfileMembershipChange membershipChange =
(UserProfileMembershipChange)change;
Console.WriteLine(membershipChange.
ChangeType.ToString());
}
}
Console.Read();
}
}
}
}