[方法] 変更ログを使用してユーザー プロファイルの最新の変更を取得する
Microsoft Office SharePoint Server 2007 では、ユーザー プロファイル ストアで個人ベースの通知をサポートするための変更追跡オブジェクト モデルが提供されています。これらの通知は、記念日およびその他のさまざまなユーザー プロファイルの変更をユーザーに知らせます。Office SharePoint Server 2007 では、ユーザー プロファイル内の日付フィールドはすべて記念日として扱われます。ユーザーのプロファイル内の日付が現在の日付 (サーバー時間) と一致したときに、Office SharePoint Server 2007 によって新しい記念日イベントが作成されます。日付フィールドを変更した場合は、イベントは作成されません。
変更追跡オブジェクト モデルの実装は、Windows SharePoint Services 3.0SPChange オブジェクトと似ていますが、堅牢性は劣ります。UserProfile クラスは、変更追跡をサポートする 2 つのオーバーロード メソッドを定義します。それらを次に示します。
public Microsoft.Office.Server.UserProfiles.UserProfileChangeCollection GetChanges(Microsoft.Office.Server.UserProfiles.UserProfileChangeQuery)
public 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.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"))
{
ServerContext context = ServerContext.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();
}
}
}
}