SPContentDatabase.GetChanges 方法 (SPChangeQuery)

从更改日志已被筛选通过指定的查询返回更改的集合。

命名空间:  Microsoft.SharePoint.Administration
程序集:  Microsoft.SharePoint(位于 Microsoft.SharePoint.dll 中)

语法

声明
Public Function GetChanges ( _
    query As SPChangeQuery _
) As SPChangeCollection
用法
Dim instance As SPContentDatabase
Dim query As SPChangeQuery
Dim returnValue As SPChangeCollection

returnValue = instance.GetChanges(query)
public SPChangeCollection GetChanges(
    SPChangeQuery query
)

参数

返回值

类型:Microsoft.SharePoint.SPChangeCollection
代表所做的更改的SPChange对象的集合。您可以调整设置查询参数中传递的SPChangeQuery对象的FetchLimit属性返回的集合的最大大小。

备注

使用此方法或所感只有在选定的操作,在特定对象上时您感兴趣对特定的对象,而不是所有的对象,只筛选变更。有关详细信息,请参阅SPChangeQuery类的文档。

备注

默认情况下,更改日志数据将保留 60 天。您可以通过设置ChangeLogRetentionPeriod属性配置的保留期间。

示例

下面的示例是一个控制台应用程序,对用户和用户组的所有更改的内容数据库的查询和打印有关每次更改控制台的信息。请注意应用程序调用GetChanges方法在循环中,读取批次中的更改,直到已检索到的所有更改。

using System;
using Microsoft.SharePoint;

namespace Test
{
   class ConsoleApp
   {
      static void Main(string[] args)
      {
         using (SPSite siteCollection = new SPSite("https://localhost"))
         {
            using (SPWeb rootSite = siteCollection.RootWeb)
            {
               // Construct a query.
               SPChangeQuery query = new SPChangeQuery(false,  // limit object types
                                                       false); // limit change types
               // object types 
               query.User = true;
               query.Group = true;

               // change types 
               query.Add = true;
               query.Delete = true;
               query.Update = true;
               query.GroupMembershipAdd = true;
               query.GroupMembershipDelete = true;

               // Get the site collection users.
               SPUserCollection users = rootSite.AllUsers;

               // Get the site collection groups.
               SPGroupCollection groups = rootSite.Groups;

               SPTimeZone timeZone = rootSite.RegionalSettings.TimeZone
               long total = 0;
               while (true)
               {
                  SPChangeCollection changes = 
                     siteCollection.ContentDatabase.GetChanges(query);

                  total += changes.Count;

                  foreach (SPChange change in changes)
                  {
                     // Print the date of the change.
                     Console.WriteLine("\nDate: {0}", 
                                       timeZone.UTCToLocalTime(change.Time).ToString());

                     // Get url of the site where the change took place.
                     foreach (SPSite site in siteCollection.ContentDatabase.Sites)
                     {
                        if (site.ID == change.SiteId)
                        {
                           Console.WriteLine("Site Url: {0}", site.Url);
                           break;
                        }
                     }

                     // Get nature of change.
                     Console.WriteLine("Type of change: {0}", change.ChangeType);

                     // Get information about a user change.
                     if (change is SPChangeUser)
                     {
                        SPChangeUser userChange = (SPChangeUser)change;
                        if (userChange.Activate)
                           Console.WriteLine("This change activated a user.");
                        if (userChange.IsSiteAdminChange)
                           Console.WriteLine("This change made the user a site admin.");

                        // Try to get the user login name.
                        try
                        {
                           SPUser user = users.GetByID(userChange.Id); // Throws an exception if not found
                           Console.WriteLine("Login name: {0}", user.LoginName);

                           // Get information about the user.
                           if (user.IsDomainGroup)
                              Console.WriteLine("This user is a domain group.");
                           if (change.ChangeType == SPChangeType.Update)
                           {
                              Console.Write("Member of:");
                              foreach (SPGroup group in user.Groups)
                                 Console.Write(" {0};", group.Name);
                              Console.WriteLine();
                           }
                        }
                        catch (SPException)
                        {
                           Console.WriteLine("Login name: unknown");
                        }
                     }

                     // Get information about a group change.
                     if (change is SPChangeGroup)
                     {
                        SPChangeGroup groupChange = (SPChangeGroup)change;
                        // Try to get the group name.
                        try
                        {
                           SPGroup group = groups.GetByID(groupChange.Id); // Throws an exception if not found
                           Console.WriteLine("Group name: {0}", group.Name);
                           Console.WriteLine("Number of members: {0}", group.Users.Count);
                        }
                        catch (SPException)
                        {
                           Console.WriteLine("Group name: unknown");
                        }
                     }
                  }

                  // Break out of loop if we have the last batch.
                  if (changes.Count < query.FetchLimit)
                     break;
                  // Otherwise, go get another batch.
                  query.ChangeTokenStart = changes.LastChangeToken;
               }

               Console.WriteLine("\nTotal changes = {0:#,#}", total);
            }
         }
         Console.Write("\nPress ENTER to continue...");
         Console.ReadLine();
      }
   }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp
   Sub Main()
      Using siteCollection As SPSite = New SPSite("https://localhost")
         Using rootSite As SPWeb = siteCollection.RootWeb

            ' Construct a query.
            Dim query As New SPChangeQuery(False, False)

            ' object types 
            query.User = True
            query.Group = True

            ' change types 
            query.Add = True
            query.Delete = True
            query.Update = True
            query.GroupMembershipAdd = True
            query.GroupMembershipDelete = True

            ' Get the site collection users.
            Dim users As SPUserCollection = rootSite.AllUsers

            ' Get the site collection groups.
            Dim groups As SPGroupCollection = rootSite.Groups

            Dim timeZone As SPTimeZone = rootSite.RegionalSettings.TimeZone
            Dim total As Long = 0
            While True

               Dim changes As SPChangeCollection = _
                   siteCollection.ContentDatabase.GetChanges(query)

               total += changes.Count

               For Each change As SPChange In changes
                  ' Print date of the change.
                  Console.WriteLine(vbCrLf + "Date: {0}", _
                                    timeZone.UTCToLocalTime(change.Time).ToString())

                  ' Print the url of the site where the change took place.
                  For Each site As SPSite In siteCollection.ContentDatabase.Sites
                     If site.ID = change.SiteId Then
                        Console.WriteLine("Site Url: {0}", site.Url)
                        Exit For
                     End If
                  Next site

                  ' Print the nature of change.
                  Console.WriteLine("Type of change: {0}", change.ChangeType)

                  ' Get information about a user change.
                  If TypeOf change Is SPChangeUser Then
                     Dim userChange As SPChangeUser = CType(change, SPChangeUser)
                     If userChange.Activate Then
                        Console.WriteLine("This change activated a user.")
                     End If
                     If userChange.IsSiteAdminChange Then
                        Console.WriteLine("This change made the user a site admin.")
                     End If
                     ' Try to get the user login name.
                     Try
                        Dim user As SPUser = users.GetByID(userChange.Id) ' Throws an exception if not found
                        Console.WriteLine("Login name: {0}", user.LoginName)

                        ' Get information about the user.
                        If user.IsDomainGroup Then
                           Console.WriteLine("This user is a domain group.")
                        End If
                        If change.ChangeType = SPChangeType.Update Then
                           Console.Write("Member of:")
                           For Each group As SPGroup In user.Groups
                              Console.Write(" {0};", group.Name)
                           Next group
                           Console.WriteLine()
                        End If
                     Catch ex As SPException
                        Console.WriteLine("Login name: unknown")
                     End Try
                  End If

                  ' Get information about a group change.
                  If TypeOf change Is SPChangeGroup Then
                     Dim groupChange As SPChangeGroup = CType(change, SPChangeGroup)
                     ' Try to get the group name.
                     Try
                        Dim group As SPGroup = groups.GetByID(groupChange.Id) ' Throws an exception if not found
                        Console.WriteLine("Group name: {0}", group.Name)
                        Console.WriteLine("Number of members: {0}", group.Users.Count)
                     Catch ex As SPException
                        Console.WriteLine("Group name: unknown")
                     End Try
                  End If

               Next change

               ' Break out of the loop when we fetch the last batch of changes.
               If changes.Count < query.FetchLimit Then
                  Exit While
               End If

               ' Go get another batch of changes starting where we left off.
               query.ChangeTokenStart = changes.LastChangeToken

            End While

            Console.WriteLine(vbCrLf + "Total changes = {0:#,#}", total)

         End Using
      End Using
      Console.Write(vbCrLf + "Press ENTER to continue...")
      Console.ReadLine()
   End Sub
End Module

另请参阅

引用

SPContentDatabase 类

SPContentDatabase 成员

GetChanges 重载

Microsoft.SharePoint.Administration 命名空间

其他资源

Using the Change Log