[转帖]使用 SharePoint Server 2007 实现项目级审核

 
使用 SharePoint Server 2007 实现审核
许多公司和政府机构都有一些政策和法规,要求公司和政府机构仔细跟踪用户在何处以及采用何种方式访问重要记录和文档。特别是,这些公司和机构还需要维护审核日志,这些审核日志详细记录了跟踪数据的事件(如哪些用户查看和更新了记录和文档)以及这些事件发生的时间。
先前的 Microsoft Windows SharePoint Services 2.0 
不能提供广泛的审核支持。例如,不能使用组件审核对页面的访问,也不能审核对列表中的项目的访问。而且,仅当库中的某个文档进行了更新才会触发 Windows 
SharePoint Services 2.0 文档库中的事件处理程序。因此,Windows SharePoint Services 2.0 
文档库中的事件处理程序不能审核用户查看文档时发生的事件。
为适应用户的要求,最新版的 Microsoft SharePoint Products and Technologies 
现在在审核支持方面提供了大量增强功能,所有这些增强功能都包含在 2007 Microsoft Office system 中。Microsoft Windows 
SharePoint Services 3.0 和 Microsoft Office SharePoint Server 2007 
都提供了对用户访问页面、内容和文档的审核支持,并且它们都包含了一些诸如查看和更新一类的可审核的事件。
Windows SharePoint Services 和 Office SharePoint Server 2007 
中内置的审核支持
Windows SharePoint Services 3.0 
引入了内置的审核日志记录,您可以在网站集范围内启用和配置该功能。在您启用审核功能时,Windows SharePoint Services 
会将审核事件条目写入到存储在内容数据库中的一个内部审核日志表中。网站集的审核事件条目与所有其他的 Windows SharePoint Services 
内容(如列表项目、文档和 Web 部件自定义内容)存储在一起。当您备份一个网站集时,会同时备份审核日志中的所有信息。
虽然 Windows SharePoint Services 提供了基本的审核机制,但用户不能直接启用审核功能。因为 
Windows SharePoint Services 没有提供对写入审核日志的条目进行查看的功能,所以必须由开发人员编写代码才能启用 Windows 
SharePoint Services 
审核日志记录功能。开发人员还必须提供代码和用户界面,以读取审核日志中的条目和向网站用户显示这些数据。本文提供的示例代码显示了如何创建这种类型的自定义审核解决方案。
虽然 Windows SharePoint Services 只提供基本审核机制,但 Office SharePoint 
Server 2007 通过提供一个允许在网站集级别进行审核的管理用户界面提高了价值。Office SharePoint Server 2007 
在审核功能上更进一步,它能够在列表或文档库级别启用审核,并能够控制审核日志中应记录的事件类型。Office SharePoint Server 2007 
还提供了一个报告功能,该功能使用 Microsoft Office Excel 工作簿显示和保留审核日志的记录。因此,Office SharePoint 
Server 2007 使您能够利用 Windows SharePoint Services 的审核支持而不需要编写任何自定义代码。
项目级审核:自定义的审核解决方案
本文还提供了一个名为“项目级审核”(MOSSSampleItemLevelAuditing.exe) 
的自定义解决方案,该方案演示了一些在 Windows SharePoint Services 和 Office SharePoint Server 2007 
中可使用的扩展审核支持的技巧。首先,该自定义解决方案显示了如何通过编程方式启用审核日志记录来扩展 Windows SharePoint 
Services。它还提供了一个向 Windows SharePoint Services 
网站用户显示审核日志内容的用户界面组件。该自定义解决方案还演示了如何使用新的 Office Open XML 格式生成包含审核信息的 Excel 
工作簿,从而对报告功能提供更好的支持,以扩展 Office SharePoint Server 2007。项目级审核解决方案还显示了如何解决目前尚不能由 
Windows SharePoint Services 或 Office SharePoint Server 2007 
解决的问题。特别是,该自定义解决方案演示了如何显示和报告与列表中单个条目或文档库中单个文档相关联的审核日志条目。
此解决方案的所有示例代码都包含在一个名为 ItemAuditing.csproj 的 Microsoft Visual 
Studio 2005 项目中。图 1 显示了组成该解决方案的各种文件。这些项目文件使用了 Windows SharePoint Services 3.0 
中引入的许多新的开发技巧,如自定义应用程序页、功能和解决方案包。
 1. ItemAuditing 
项目
在开始之前,请确保您的开发计算机已安装下列程序:
?
Microsoft .NET Framework 3.0(RTM 版本)
?
Microsoft Visual Studio 2005
?
Microsoft Windows SharePoint Services 3.0
?
Microsoft Office SharePoint Server 
2007
接下来,下载 MOSSSampleItemLevelAuditing.exe 
文件并将其内容解压到开发计算机的某个目录中。现在您就可以按照 Setup Document.docx 
中的说明运行该示例解决方案了。在完成安装文档中的操作之后,就会在您的计算机上生成一个完整的 Visual Studio 2005 
项目。本文以下部分解释了使此解决方案能够发挥作用的各个组件。
项目级审核解决方案由以下部分组成:
?
一个名为 Item Auditing 的 Windows SharePoint Services 
功能组件
?
两个名称分别为 AuditLogViewer.aspx 和 ItemAudit.aspx 
的应用程序页
?
一个名为 AuditLogWorkbook.ashx 的自定义处理程序
?
一个名为 ItemAuditing.dll 的程序集
我们首先来查看一下 Item Auditing 功能组件及其 feature.xml 文件。
Xml<Feature Id="AA929AFF-4602-4d7f-A501-B80AC9A4BB52" 
   Title="Item Auditing"
   Description="This feature allows user to view the audit history of documents."
   ImageUrl="CALVIEW.GIF"
   Version="1.0.0.0"
   Scope="Site" 
   ReceiverAssembly="ItemAuditing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7fd3ed697555604d"
   ReceiverClass="ItemAuditing.ItemAuditingFeatureReceiver"
   xmlns="http://schemas.microsoft.com/sharepoint/">
    <ElementManifests>
      <ElementManifest Location="elements.xml" />
    </ElementManifests>
</Feature>
Windows SharePoint Services 3.0 
功能组件始终安装在服务器场级范围内。不过,您可以将功能组件的激活范围设置为四种级别中的一种。可以在网站范围内激活功能组件,也可以在网站集、Web 
应用程序或服务器场中激活它。在此,我们将 Item Auditing 功能组件设计成在网站集级别激活。您可以看一下前面讲到的 Feature 元素,其 
Scope 属性设置为 Site,这意味着它是在网站集范围内激活。如果想创建一个在网站范围而不是在网站集范围内激活的功能组件,可通过将 Scope 
属性的值指定为 Web 而不是 Site 来实现。
在 Windows SharePoint Services 服务器场中安装了 Item Auditing 
功能组件之后,就可以在该服务器场中的任何网站集中将它激活。如果导航到“Site Collection 
Features”(网站集功能组件)管理页,则您能够激活功能组件,如图 2 所示。
 2. 
网站集功能组件管理页
如果查看 feature.xml 文件中的 Feature 元素,您就会注意到它有 ReceiverAssembly 属性和 
ReceiverClass 
属性。这一技巧允许功能组件引用具有特定类的程序集,该类提供了一个随功能组件激活而触发的事件处理程序。此种特定于功能组件的事件处理是由一个授权的自定义类实现的,该自定义类从 
类继承而来,如下面代码中 ItemAuditingFeatureReceiver 类所示。
C#using System;
using Microsoft.SharePoint;
namespace ItemAuditing {  
  public class ItemAuditingFeatureReceiver : SPFeatureReceiver {
    public override void FeatureActivated(SPFeatureReceiverProperties properties)  {
      // 功能组件激活代码转到这里。
    }
    public override void FeatureInstalled(SPFeatureReceiverProperties properties) { }
    public override void FeatureUninstalling(SPFeatureReceiverProperties properties) { }
    public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { }
  }
}
为项目级审核解决方案创建的功能组件接收器类仅在 FeatureActivated 
事件处理程序方法中提供了代码。不过,在安装功能组件时,以及取消激活和卸载时,也可以编写其他三种方法来提供事件处理行为。
在激活 Item Auditing 功能组件时,其 FeatureActivated 事件处理程序方法将执行打开 Windows 
SharePoint Services 审核功能所需的代码。事件处理程序中的代码通过获取一个对当前网站集的 SPSite 对象的引用来完成这一操作,然后在 
SPSite 对象的 Audit 
属性上设置正确的审核标志。
C#public override void FeatureActivated(SPFeatureReceiverProperties properties)  {
  SPSite siteCollection = (SPSite)properties.Feature.Parent;
  // 启用审核标志。
  siteCollection.Audit.AuditFlags = SPAuditMaskType.All;
  siteCollection.Audit.Update();
  // 修改首要网站标题。
  SPWeb site = siteCollection.RootWeb;
  site.Title += " (audited)";
  site.Update();
  SPListTemplate template = site.ListTemplates["Document Library"];
  Guid docLibID = site.Lists.Add("AuditLogs", "Library for Audit Log Workbooks", template);
  SPList docLib = site.Lists[docLibID];
  docLib.OnQuickLaunch = true;
  docLib.Update();
}
正如上面代码所示,FeatureActivated 
事件处理程序还更新了首要网站的标题,以使您能够直观地看到它已成功运行。此外,程序代码还在首要网站创建名为 Audit Logs 
的文档库。此文档库用作一个包含了审核日志记录数据的 Office Excel 工作簿存储库。本文稍后还将提供更详细的信息。
现在我们专门分析一下在网站集级别启动日志记录功能的代码。Audit 属性公开了一个 SPAudit 对象,该对象提供了一个 AuditFlags 属性。AuditFlags 属性基于 
SPAuditMaskType 枚举,并且只需指定一个 All 值即可启用所有的审核功能。另外需要注意,在修改 SPAudit 对象上的审核标志之后,还要调用 
Update 方法。
C#siteCollection.Audit.AuditFlags = SPAuditMaskType.All;
siteCollection.Audit.Update();
上面您看到的是如何对整个网站集启用审核功能。不过,您应明白,对于具有巨大流量的大型网站集,这一功能可能是一项非常繁重的任务。例如,如果您的大型网站集上有许多活动用户,或者,如果您在审核一些频繁的操作(如页面读取),则大量数据会非常迅速地填满审核日志。
在某些情况下,例如,当为政府机构中的分类文档设计存储库时,您可能想记录每一项可审核的事件。这可能要求您在网站集级别启用所有审核事件。您可能还要考虑将分类文档划分到它们自己的网站集中,这样,当用户查看未分类的文档时,您就不必记录同一级别的审核信息。
此外,您可能想在单个网站集范围内对审核内容有更灵活的控制。例如,您可能想只审核更新操作而不审核读取操作。也许,您需要对同一网站内某一文档库(而不是其他文档库)的访问进行审核。幸运的是,在启用审核方式上,Windows 
SharePoint Services 提供了更多的选择余地。例如,您可以针对一个单独的文档库启用审核功能。
C#SPSite siteCollection = new SPSite("http://LitwareServer1");
SPWeb site = siteCollection.OpenWeb();
SPList list = site.Lists["Proposals"];
list.Audit.AuditFlags = SPAuditMaskType.All;
list.Audit.Update();
另外还要注意,在启用审核功能时,您不需要记录所有类型的可审核事件。您可以使用审核标志控制需要 Windows 
SharePoint Services 记录的审核事件的类型。SPAuditMaskType 
枚举值就是一些按位标志,您可以结合使用这些标志配置想捕获的审核事件集。
C#list.Audit.AuditFlags = SPAuditMaskType.View |
                        SPAuditMaskType.Update |
                        SPAuditMaskType.Delete;
list.Audit.Update();
上面的代码是一个可包含在审核日志中的事件类型子集的示例。下面列出了所有可用的不同枚举值。
C#SPAuditMaskType.CheckIn
SPAuditMaskType.CheckOut
SPAuditMaskType.ChildDelete
SPAuditMaskType.Copy
SPAuditMaskType.Delete
SPAuditMaskType.Move
SPAuditMaskType.ProfileChange
SPAuditMaskType.SchemaChange
SPAuditMaskType.Search
SPAuditMaskType.SecurityChange
SPAuditMaskType.Undelete
SPAuditMaskType.Update
SPAuditMaskType.View
SPAuditMaskType.Workflow
显示审核日志中的条目
现在您已经学会如何启用审核日志记录,接下来我们要重点讨论如何将审核日志中的事件信息显示给网站用户。项目级审核解决方案提供了一个名为 
AuditLogViewer.aspx 的应用程序页。它主要用于向网站管理员显示网站集审核日志的全部内容。
该项目级解决方案还包含一个名为 elements.xml 的文件,该文件提供了两个 CustomAction Element(自定义操作)元素。CustomAction 元素用于向“网站操作”菜单添加菜单项,这样网站管理员就可以借助菜单定位到 AuditLogViewer.aspx 
文件。
Xml<!-- Add Command to Site Actions Dropdown -->
<CustomAction Id="SiteActionsToolbar"
  GroupId="SiteActions"
  Location="Microsoft.SharePoint.StandardMenu"
  Sequence="1001"
  Title="Audit Log Viewer"
  Description="This page allows you to see the audit log."
  RequireSiteAdministrator="True"
  ImageUrl="/_layouts/images/LTTXTBOX.GIF">
    <UrlAction Url="~sitecollection/_layouts/AuditLogViewer.aspx"/>
</CustomAction>
此 CustomAction 元素是为添加如图 3 所示的菜单项而设计的,该元素的定义中包含 
RequiresSiteAdministrator 属性,并赋予一个 true 值。由于承载 Item Auditing 
功能组件仅在网站集的范围内有效,因此只有拥有网站集的用户才可以查看菜单项。您还会发现,UrlAction 元素的 URL 
属性配置了一个包含“~sitecollection”令牌的 URL。这就是说,Windows SharePoint Services 可以动态地分析 
URL,将用户重定向到基于当前网站集根路径的该应用程序页。
 3. 自定义菜单项
网站集所有者在单击该菜单项以定位到“Audit Log Viewer”(审核日志查看器)页面时,会被重定向到 layouts 
虚拟目录下名为 AuditLogViewer.aspx 的自定义应用程序页。此自定义应用程序页会从网站集的审核日志中读取所有事件信息,并使用 SPGridView 控件来显示这些信息,如图 4 
所示。
 4. 
审核日志查看器页面
创建诸如 AuditLogViewer.aspx 的自定义应用程序页为向含有自定义代码的 Windows SharePoint 
Services 
解决方案添加用户界面组件提供一个功能强大的武器。与网页(例如,default.aspx)不同,自定义应用程序页要针对每个服务器场进行部署,而且不能一个站点接一个站点地进行自定义。由于应用程序页运行于 
virtual _layout 目录之外,并被编译成单独的程序集 DLL 
用于服务器场内的所有网站,因此其性能要优于网页。应用程序页与网页的不同之处还在于,您可以直接向它们添加代码。
通常,创建的自定义应用程序页会链接到 application.master,这是标准 Windows SharePoint 
Services 应用程序页使用的主母版页文件。通常,对于编写应用程序页,应该采取从 Microsoft.SharePoint 程序集内定义的名为 
的基类进行继承的方法。下面是诸如 AuditLogViewer.aspx 的自定义应用程序页的一个起始点,并带有基本布局。<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral,                  
                   PublicKeyToken=71e9bce111e9429c"%> 
<%@ Page Language="C" MasterPageFile="~/_layouts/application.master" 
         Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase"  %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="System.Data" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
    Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<script runat="server">
    protected override bool RequireSiteAdministrator {
        get { return true;}
    }
    protected override void OnLoad(EventArgs e)  {
        // 代码转到这里。
    }    
</script>
<asp:Content ID="contentMain" ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <asp:Button ID="cmdRefreshPage" runat="server" Text="Refresh Page" 
                     />
    <asp:Button ID="cmdDeleteAllEntires" runat="server" Text="Clear Audit Log" 
                     />
    <hr /> 
    <SharePoint:SPGridView ID="SPGridView1" runat="server" AutoGenerateColumns="False" />
</asp:Content>
此页内的代码重写了 RequireSiteAdministrator 
属性,并返回一个 true 值。这可以使您更加安全地锁定应用程序页。以这种方式重写 RequireSiteAdministrator 
属性后,您就可以得到一个安全性极高的环境。这样,如果非网站管理员用户尝试定位到此应用程序页,Windows SharePoint Services 
会将用户重定向到常见的拒绝访问页面。
AuditLogViewer.aspx 的定义在顶端包含一个脚本块,其中的代码可基于对象模型进行编程。如果您在 Visual 
Studio 2005 中编写这样的页面,由于可以使用颜色编码和 IntelliSense,您会觉得非常便捷。但是,您必须确保添加到页面顶端的 
@Assembly 指令是正确的。因此您需要使用 Microsoft.SharePoint 程序集的信息修改之前所示的 @Assembly 
指令。
应用程序页之所以非常实用,是因为人们可以借助它们轻松快捷地访问 Windows SharePoint Services 
对象。按照前述方法创建好应用程序页并提供一个 OnLoad 方法的重写实现后,您就可以使用下列代码获得特定于网站的上下文中 Windows SharePoint 
Services 对象模型的入口点。
C#protected override void OnLoad(EventArgs e)  {
  SPSite siteCollection = SPContext.Current.Site;
  SPWeb site = SPContext.Current.Web;
}
能够获得与网站有关的上下文,我们就能编写出功能更为强大的应用程序页。根据网站访问路径的不同,应用程序页的行为也是有所区别的。通过一个网站的上下文导航到某个应用程序页,与通过另一个网站的上下文导航到该页,该应用程序页的行为通常是不同的。
接下来我们要讨论 AuditLogViewer.aspx 中定义的 OnLoad 
事件内部的代码。这些代码是为读取当前网站集的审核日志而编写的,首先创建一个 SPAuditQuery 对象,然后通过一个调用将此对象作为参数传给 
GetEntries 方法。对 GetEntries 方法的调用会返回一个 SPAuditEntryCollection 
对象,有了该对象,我们就可以借助一个简单的 for…each 循环来检查目标审核日志中的条目。
C#SPSite siteCollection = SPContext.Current.Site;
SPAuditQuery wssQuery = new SPAuditQuery(siteCollection);
SPAuditEntryCollection auditCol = siteCollection.Audit.GetEntries(wssQuery);
foreach (SPAuditEntry entry in auditCol) {
    // 检查条目
}
在查看 AuditLogViewer.aspx 内 OnLoad 方法的整个实现时,您会发现,该方法是使用 SPGridView 
控件来显示审核事件信息的。这种方法可以确保审核条目的显示效果与 Windows SharePoint Services 其他方面的外观和风格保持一致。要向 
SPGridView 控件中填充审核条目,您需要创建一个 Microsoft ADO.NET DataTable 
对象,然后在其中写入审核日志信息。采用这种创建并填充 DataTable 对象的方法能够很便捷地将信息绑定到 SPGridView 控件。
需要注意的是,Windows SharePoint Services 
会按照通用协调时间(格林尼治标准时间)对审核事件的时间进行跟踪。示例应用程序中的代码在检索时间后,会调用 Microsoft .NET Framework 的 
DateTime 类提供的 ToLocalTime 方法,将通用协调时间转换为 Web 服务器的本地时间。但在某些情况下,例如当您的前端 Web 
服务器和您的用户位于不同时区时,请注意该示例应用程序并不支持将审核事件时间转换为用户的时区。
在您检查从 Windows SharePoint Services 
审核日志中读取信息的代码实现时,请仔细观察代码是如何检索用户名的。Windows SharePoint Services 审核日志跟踪的是用户的 
ID,而并非用户名。获得用户 ID 后,您可以使用 SiteUser 集合上的 GetByID 方法检索到与之关联的用户名,这里的 SiteUser 
集合被公开为首要网站的一个属性。请确保您所使用的是 SiteUsers 集合,并且不要将其与 User 
集合混淆,使用这两个集合得出的结果是不同的。
C#Private string GetUserNameById(int UserId, SPWeb site) {
  return site.SiteUsers.GetByID(UserId).Name;
}
有些用户也许希望将部分审核日志导出到其他外部存储(例如,数据库或 Excel 
电子表格)中。该示例应用程序还提供了一个命令按钮,借助它可以清空 Windows SharePoint Services 审核日志。要实现这一点,需要调用目标 
SPAudit 对象上的 DeleteEntries 
方法并传递带有时间和日期的参数,而在此之前,您应该清除所有已审核条目。在调用 DeleteEntries 
方法前,您可以再编写一些代码,将审核数据安全地备份到选好的外部存储中,以避免重要的审核事件数据丢失。
我们建议您不要将此按钮用作当前实现,除非您先向 OnClick 
添加自定义逻辑,执行导出操作,然后再执行删除操作。之所以未在这里添加该逻辑,是因为不同组织可能需要不同类型的备份方法。
C#// 在此处添加代码,以将审核日志导出到外部存储。
SPSite siteCollection = SPContext.Current.Site;
siteCollection.Audit.DeleteEntries(DateTime.Now.ToLocalTime().AddDays(1));
siteCollection.Audit.Update();
当您在一个通信流量很大的大型网站集内使用自定义的审核解决方案时,应先将审核日志保存为单独的文件,然后再清除它,这一点是非常重要的。您可以经常性地使用这种方法更有效地管理空间。
项目级审核
现在,对于在 Windows SharePoint Services 
中启用审核功能并将审核事件信息显示给用户的代码,您应该有所了解了,我们还可以研究如何添加必要的支持,以便用户可以逐个文档、逐个项目地查看审核信息。首先,我们要在“Edit 
Control box”(ECB,编辑控件箱)菜单中为网站集内的所有文档创建一个自定义菜单项,注意,网站集已经激活了 Item Auditing 
功能组件。其目的是使网站集内每个文档的 ECB 菜单都能够提供如下所示的菜单项。
 5. ECB 
菜单中的自定义菜单项
诸如图 5 所示的自定义菜单项是通过向 Item Auditing 功能组件的 elements.xml 文件添加第二个 
CustomAction 元素来创建的。该 CustomAction 元素与之前所示的那个有所区别,因为该 CustomAction 元素带有一个 
Location 属性,该属性被赋予一个 EditControlBlock 的值。此属性值会指示 Windows SharePoint Services 
向特定一组项目或文档的 ECB 菜单中添加菜单项。该 CustomAction 元素使用一个带有 List 值的 RegistrationType 
属性和一个带有 101 值的 RegistrationID 属性定义菜单项的目标集,这里的 RegistrationID 属性是标准 Windows 
SharePoint Services 
文档库的标识符。请注意,本示例应用程序仅针对文档库内的文档提供了项目级审核功能。但是,您也可以轻松对其进行扩展,以支持其他任何列表类型。
Xml<!-- Per Item Dropdown (ECB) Link -->
<CustomAction Id="ItemAuditing.ECBItemMenu"
  RegistrationType="List" 
  RegistrationId="101"
  ImageUrl="/_layouts/images/GORTL.GIF"
  Location="EditControlBlock"
  Sequence="300"
  Title="View Audit History">
    <UrlAction Url="~site/_layouts/ItemAudit.aspx?ItemId={ItemId}&amp;ListId={ListId}"/>
</CustomAction>
另外,您还应该观察一下 UrlAction 元素内 URL 属性的值。该 URL 属性的配置如下。
Xml~site/_layouts/ItemAudit.aspx?ItemId={ItemId}&amp;ListId={ListId}
首先,请注意配置该 URL 是为了将用户重定向到名为 ItemAudit.aspx 的第二个自定义应用程序页。同时还应注意,在该 
URL 中包含三个令牌,这三个令牌会在运行时由 Windows SharePoint Services 动态替换。~site 令牌将被替换为指向当前网站的 
URL。{ListId} 令牌将被替换为标识当前文档库的 GUID。{ItemId} 令牌将被替换为文档的整型标识符。后两个令牌用于分析查询字符串,使用 
Windows SharePoint Services 对象模型通过 ItemAudit.aspx 
应用程序页显示对包含该字符串的目标文档和文档库进行访问的信息。
在用户从特定文档的 ECB 菜单中选择“View Audit History”(查看审核历史记录)菜单时,用户将被重定向到名为 
ItemAudit.aspx 的自定义应用程序页。接下来,用户会看到该文档的视图,该视图详细记录了记入日志的已审核事件,如图 6 所示。
 6. 自定义 
ItemAudit.aspx 
在从用户角度查看 ItemAudit.aspx 页面之后,我们现在可以查看一下该页面的代码。该应用程序页的基本结构与 
AuditLogViewer.aspx 类似。但是,与 AuditLogViewer.aspx 不同的是,ItemAudit.aspx 
并非仅供网站管理员使用。其他用户也可以根据各自需求来查看该代码。
首先,我们来看一下用于从查询字符串中提取文档列表项 ID 和文档库 GUID 
的代码。正如您在之前的代码中所见到的那样,这是通过使用涉及 ASP.NET Request 对象的 QueryString 
属性的标准编程技术来完成。
C#SPSite siteCollection = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
string ListId = Request.QueryString["ListId"];
string ItemId = Request.QueryString["ItemId"];
SPList list = site.Lists[new Guid(ListId)];        
SPListItem item = list.Items.GetItemById(Convert.ToInt32(ItemId));
txtListId.Text = ListId;
txtItemTitle.Text = list.Title;
txtItemId.Text = ItemId;
txtItemTitle.Text = item.Title;
该代码表还表明,只需额外加入一小段涵盖 Windows SharePoint Services 对象模型的代码,您就可以创建 
SPList 对象和 SPListItem 对象来针对文档库和目标文档进行编程。
在 ItemAudit.aspx 中有为查询审核日志而编写的代码。该代码不同于先前 AuditLogViewer.aspx 
中显示的代码,因为它只查询特定于某单一文档的审核事件。查询通过先调用 SPAuditQuery 对象上的 
RestrictToList 方法,然后调用 GetEntries 并传递与目标文档相关的 SPListItem 对象来实现。
C#SPAuditQuery wssQuery = new SPAuditQuery(siteCollection);
wssQuery.RestrictToListItem(item);            
SPAuditEntryCollection auditCol = site.Audit.GetEntries(wssQuery);
foreach (SPAuditEntry entry in auditCol) {
  // 从审核日志中获取信息
}
了解了如何查询特定于单一文档的事件的审核日志后,我们就可以解决 Item Auditing 
功能组件中一个更为复杂的问题。ItemAudit.aspx 
页是为了向所有用户(包括非网站管理员用户)显示审核信息而特意设计和应用的页面。但是,向所有用户显示审核信息时可能会存在问题,因为 Windows 
SharePoint Services 对象模型要求用户对任何调用 GetEntries 
方法来查询审核日志的代码都拥有管理员权限。如果用户没有网站管理员权限,则在该用户身份下运行的任何代码都会因访问遭拒错误而失败。
大多数情况下,您可能希望阻止非网站管理员用户查看网站集审核日志中的信息。这就是 Windows SharePoint 
Services 对象模型实施这种限制的原因。但是,Item Auditing 
功能组件可帮助您突破该限制。在这种特殊情形下,我们可以向任何网站用户显示审核信息。因此,ItemAudit.aspx 
中的代码必须使用特殊的编程技术来提升其权限,然后才能从 Windows SharePoint Services 审核日志中读取信息。
编写 ItemAudit.aspx 中的代码是为了与 SPSecurity 类交互,以便调用名为 
的静态方法。该方法接受单一参数,这属于委托。如果您希望将该代码编写得简明扼要,可以使用如下代码示例中所示的匿名方法。
C#SPSecurity.RunWithElevatedPrivileges( delegate()  {
  // 此处显示的是要在提升权限的情况下运行的代码。
  // 该代码段在 SHAREPOINT/SYSTEM 帐户下运行。
});
使用该技术提升代码权限后,您必须创建 SPSite 类和 SPWeb 类的新实例。您无法使用通过 Current 
属性提供的对象,因为已在当前用户的安全上下文中创建这些对象。以下代码说明了如何使用已提升权限的安全上下文来创建新 SPSite 对象和新 SPWeb 
对象。
C#SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()  {
  using (SPSite ElevatedSiteCollection = new SPSite(siteColl.ID)) {
    using (SPWeb ElevatedSite = ElevatedSiteCollection.OpenWeb(site.ID)) {
      // 现在针对提升权限的 SPSite 对象和 SPWeb 对象运行程序。
    }
  }
});
前一段代码还说明了如何在 Microsoft Visual C# 中使用 construct 创建新 SPSite 对象和新 
SPWeb 对象以便正确释放对象。现在,我们来看一段更长的代码,它说明了如何通过提升权限来查询目标文档的审核日志。
C#SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()  {
  using (SPSite ElevatedSiteCollection = new SPSite(siteColl.ID)) {
    using (SPWeb ElevatedSite = ElevatedSiteCollection.OpenWeb(site.ID)) {
      
      SPList list = ElevatedSite.Lists[new Guid(ListId)];
      SPListItem item = list.Items.GetItemById(Convert.ToInt32(ItemId));
      
      SPAuditQuery wssQuery;
      SPAuditEntryCollection auditCol;
      wssQuery = new SPAuditQuery(ElevatedSiteCollection);
      wssQuery.RestrictToListItem(item);            
      auditCol = ElevatedSite.Audit.GetEntries(wssQuery);
      foreach (SPAuditEntry entry in auditCol)  {
        // 查询权限提升的审核日志。
      }
    }
  }
});
编写自定义审核条目
您已看到 ItemAuditing.aspx 页可以显示通过 Windows SharePoint Services 
自动写入审核日志的审核条目。但是,有时您可能需要通过在审核日志中编写自定义条目来解决特定问题。例如,您可以将代码添加到应用程序页的 OnLoad 事件中,它将检查用户的 IP 
地址,而如果公司局域网 (LAN) 无法识别用户 IP 
地址,代码会写入一个自定义审核日志条目。再如,您也可以通过添加代码来写入记录自定义工作流事件的自定义审核日志条目。
如果使用项目级审核解决方案,则必须编写自定义审核条目,来记录用户查看特定文档的审核日志的时间。例如,如果用户单击“View 
Audit History”(查看审核历史记录)菜单项并被重定向到 ItemAudit.aspx,那么 Windows SharePoint Services 
审核不会记录该事件。因此,您必须使用以下代码编写自定义审核条目。
C#SPList list = site.Lists[new Guid(ListId)];
SPListItem item = list.Items.GetItemById(Convert.ToInt32(ItemId));
item.Audit.WriteAuditEvent(SPAuditEventType.Custom, 
                           "CustomViewAuditEvent",  // 源名称
                           "<myXml>MyData</myXml>"  // 任意随机 XML 数据
                           );
先前您已经了解到,代码必须在提升权限下运行才能从审核日志读取信息。但是,对于用来向审核日志写入审核条目的代码来说,情况就不同了,它无需提升权限。而且,如果您在向审核日志写入审核条目前提升权限,审核日志会将用户显示为 
SHAREPOINT\SYSTEM 而非当前用户。
编写自定义审核条目后,您就可以从事件日志中读取该条目,就像读取由 Windows SharePoint Services 
审核日志记录工具写入的其他标准审核事件一样。而您也可以对自定义事件进行参数化,以便将相关信息存储在审核日志中。先前的示例说明了如何在写入自定义事件时指定源名称并传递自定义 
XML 数据。您可以在通过 SPAuditEntry 类的 SourceName 
属性和 EventData 属性读取审核事件时了解到该信息。
C#foreach (SPAuditEntry entry in auditCol)  {
  if (entry.SourceName == "CustomViewAuditEvent") {
    string myXml = entry.EventData;
    // 处理自定义事件
  }
}
Office SharePoint Server 2007 对审核的增值支持
Office SharePoint Server 2007 提供了两种有价值的功能,有助于公司对要访问 Windows 
SharePoint Services 和 Office SharePoint Server 2007 网站内容的用户进行审核。首先,Office 
SharePoint Server 2007 提供了一个管理用户界面,使您无需编写任何代码即可启用和配置审核功能。其次,Office SharePoint 
Server 2007 还提供了一项报告功能。具体地说,Office SharePoint Server 2007 使用户可以生成包含 Windows 
SharePoint Services 审核日志中审核事件信息的 Excel 工作簿。本文接下来的几节介绍了 Office SharePoint Server 
2007 如何提供网站集级别的审核支持,以及更具体的审核支持。
我们先来了解用于配置网站集内审核功能的内置 Office SharePoint Server 2007 支持。请转到已安装 
Office SharePoint Server 2007 的服务器场内任一网站的网站设置页面。您可以看到 Office SharePoint Server 
2007 特定功能在此处添加了多个链接。在“Site Collection Administration”(网站集管理)一节中,找到标题为“Site 
Collection audit settings”(网站集审核设置)的链接,如图 7 所示。
 7. 网站集管理
单击“Site collection audit settings”(网站集审核设置)链接,打开名为 
AuditSettings.aspx 的 Office SharePoint Server 2007 特定应用程序页。该页面提供了一个用户界面(图 
8),用于启用和配置当前网站集的审核设置。如图 8 所示,AuditSettings.aspx 
应用程序页使用户可以配置不同详细等级的网站集审核。
 8. AuditSettings.aspx 
除了配置网站集级别的审核之外,Office SharePoint Server 2007 
使您还可以配置更详细的审核功能。此支持功能可以通过 Office SharePoint Server 2007 
中包含的信息管理策略功能来实现。
一个信息管理策略由一组规则组成,网站管理员可以定义这些规则,并随后将其应用到特定类型内容。信息管理策略的规则是根据策略功能进行创建和配置的。Office 
SharePoint Server 2007 
默认提供的功能包括对审核、到期、文档标签和条码的支持。策略功能的编程模型还具有可扩展功能,这样开发人员可以创建自己的自定义策略功能。有关开发人员资源的信息,请参阅本文末尾的附录。
Office SharePoint Server 2007 
使您可以为列表或文档库的特定实例创建和配置信息管理策略。您还可以针对某内容类型创建信息管理策略,然后将创建的策略应用于根据该内容类型定义的任何列表或文档库中的列表项和文档。将信息管理策略应用于内容类型的功能非常有用,因为它提供了比网站集级别审核更为详细的控制功能。这样,将不再那么需要在列表实例或文档库实例级别配置审核设置。
Office SharePoint Server 2007 
还使您可以定义网站集级别的信息管理策略。这提高了可管理性,因为您在网站集内定义信息管理策略后,可将其应用到您在该网站集内选择的列表、文档库和内容类型。
网站设置页包含一个标题为“Site collection policies”(网站集策略)的链接。单击该链接,将打开一个名为 
Policylist.aspx 的应用程序页。该页面使您可以根据当前网站集的规模来配置自定义策略。图 9 
所示的自定义策略示例是为了配置标准审核事件集而创建的,它可应用于任何列表、文档库或内容类型。
 9. 自定义策略页
在网站集级别定义自定义策略后,您就可转到列表设置页查询列表或文档库。您会看到一个标题为“Information 
management policy settings”(信息管理策略设置)的链接,如图 10 所示。单击该链接,您将被重定向到名为 Policy.aspx 
的应用程序页,这使您可以创建新的信息策略。您也可以应用已定义的网站集级别策略。在安装了 Office SharePoint Server 2007 
的服务器场中,使您可以创建和配置内容类型的 Windows SharePoint Services 页还提供了一个可将您转到 Policy.aspx 
的链接。您也可以在此创建或应用策略。
 10. 列表设置页
图 11 所示为应用程序页 policy.aspx 
提供的选项。通过这种方法可以简便地应用网站集级别的自定义策略。此外,您还可以定义并配置一个特殊的策略,专门应用于当前列表、文档库或内容类型。多数情况下可管理性能够得到增强。例如,您可以将所有策略创建为网站集级别的策略,然后应用到相应的列表、文档库和当前类型。
 11. 
应用自定义策略
Office SharePoint Server 2007 对审核报告的支持
我们已经了解了 Office SharePoint Server 2007 和信息管理策略如何帮助我们配置 Windows 
SharePoint Services 审核设置。接下来让我们看看与报告功能有关的内容。使用 Office SharePoint Server 2007 
可以生成多种类型的审核报告。您可以单击网站设置页面上标题为“Audit log reports”(审核日志报告)的链接来查看各类审核报告。该链接会打开如图 12 
所示的名为 Reporting.aspx 的应用程序页。
 12. Reporting.aspx 
单击图 12 所示的报告链接,Office SharePoint Server 2007 会相应地生成 XML 
文件并返回给用户。此文件的内容基于名为 Excel Markup Language (ExcelML) 的 XML 语言。Office SharePoint 
Server 2007 会在服务器上生成 ExcelML 文档并将其回传给用户,随后用户可以将文档打开为标准的 Office Excel 
工作簿。
ExcelML 语言最初是为 Microsoft Office Excel 2000 开发的,此后得到增强并用于 
Microsoft Office 2003。借助该语言,团队无需服务器运行 Microsoft Excel 副本即可支持服务器端的 Excel 
工作簿,这也是促使 Office 团队推出 ExcelML 的原因之一。例如,服务器端组件可以使用标准 XML 分析器生成如下格式的 XML 
文档。
Xml<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook>
  <Worksheet>
    <Table>
      <Row>
        <Cell>
          <Data Type="String">Mission Critical Data Goes Here</Data>
        </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>
生成的 ExcelML 文档可以直接在 Microsoft Office Excel 中打开。Office SharePoint 
Server 2007 团队已将这项技术应用于他们的审核报告编写。单击 Reporting.aspx 页上的链接生成审核报告,Office SharePoint 
Server 2007 会返回一个 ExcelML 文档,并显示如图 13 所示的对话框。
 
13.“文件下载对话框
如果您选择直接在 Excel 中打开报告,会看到如图 14 所示的审核信息。此时,您可以使用任何支持的 Excel 
文件格式保存工作簿。通过这种方法,您可以使用 Excel 2003 或 Excel 2007 打开和查看这些审核信息。
 14.  Excel 2007 
中查看审核信息
Office SharePoint Server 2007 
提供了一些标准报告,这些报告可以列出哪些用户查看和更新过列表项目和文档,以及哪些用户修改过其他网站组件(例如,列表定义和安全设置)。此外,Office 
SharePoint Server 2007 在参数设定上也具有极大的灵活性,这为运行非正式报告提供了便利。例如,您可以运行一个自定义报告并填写有关条件,如图 
15 所示。
 15. 自定义报告
生成包含审核日志信息的 Excel 工作簿
在 2007 Microsoft Office System 发布之前,Word、Excel 和 PowerPoint 等 
Microsoft 产品均依赖一种基于二进制格式的默认文件结构。除非您使用宿主 Office 应用程序(如 Word 或 
Excel)的对象模型,否则上述格式的文件读取和修改起来都非常困难。因此,企业往往选择在服务器上运行 Office 
桌面应用程序,但这样会导致可伸缩性和可靠性方面的问题。
Office 2000 和 Office 2003 中添加了一些功能,允许用户使用 XML 创建 Excel 工作簿和 Word 
文档(例如,使用 ExcelML 创建 Excel 工作簿)。
如今,Microsoft 在 2007 Microsoft Office System 
中进一步改进了上述功能,Word、Excel 和 PowerPoint 文档均采用了 Office Open XML 格式。Office Open XML 
格式是为创建包含多个内部 XML 文件的复合文档而制定的一个全新文件标准,其中,内部 XML 
文件提取了文档的其他内容(例如,格式说明、数据和代码)。
Office Open XML 格式中的顶层文件叫做包,其结构是使用标准 .zip 
文件技术构建的。包中的内部文件称为部件。Word、Excel 和 PowerPoint 文件内的许多部件均包含与已发布 XML 架构相符合的 XML 
结构。包中的其他部件可由各种项目(例如,图形、音频剪辑和视频等)的二进制文件组成。
推出 Office Open XML 
格式主要是为在服务器端方案中读取、操作和生成文档提供一种标准方法,因为在服务器端方案中您无法使用桌面应用程序(如 Word 或 
Excel)的对象模型。
假设您要在一个 Windows SharePoint Services 网站方案中创建和配置一个事件处理程序,以便在用户上载新的 
Word 文档时进行触发。新的 Office Open XML 格式可极大简化对文档的数据提取和清理维护(例如,删除命令和个人信息)工作。您还可以利用 
Office Open XML 格式开发服务器端组件,以使用从内容源(如 SharePoint 列表,在我们的自定义解决方案中为 Windows 
SharePoint Services 审核日志)提取的数据快捷地生成 Word 文档和 Excel 工作簿。
要开始使用 Office Open XML 格式,您需要学会如何基于新的 .NET Framework 3.0 打包 API 
进行编程。我们推荐您使用该 API 打开和创建包文件。此外,您还必须对与自己特定 Office 文档类型相对应的包结构和 XML 架构有所了解。具体内容会随 
Microsoft Office Word 2007、Office Excel 2007 和 Microsoft Office PowerPoint 2007 
文档之间的切换而变化。Microsoft 已经在 Open XMLDeveloper.org 
建立了一个开发人员社区,专门讨论和解决与 Office Open XML 格式有关的问题。
我们的项目级审核解决方案提供的代码允许您使用 Office Open XML 格式生成 Excel 工作簿。您可以在名为 
WorkbookFactory.cs 的源文件中检查此代码。在此源文件中,您会发现一个名为 AuditLogWorkbook 的类,该类基于 .NET 
Framework 3.0 打包 API 进行编程,并执行将 Windows SharePoint Services 审核日志信息添加到新 Excel 
工作簿所需的所有任务。
请注意,WorkbookFactory.cs 中的源代码已被编译到名为 ItemAuditing.dll 的程序集中。要访问 
AuditLogWorkbook 类,页面定义需要获得一个程序集指令。<%@ Assembly Name="ItemAuditing, Version=1.0.0.0, Culture=neutral,PublicKeyToken=7fd3ed697555604d" %>
<%@ Page Language="C" MasterPageFile="~/_layouts/application.master" 
         Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase"  %>
<%@ Import Namespace="ItemAuditing" %>
自定义应用程序页 ItemAudit.aspx 提供了一个标题为“Generate Excel Workbook”(生成 
Excel 工作簿)的命令按钮,用户可以根据自身需要使用特定文档的审核事件信息生成 Excel 工作簿。此命令按钮会将用户重定向到 _layouts 目录下名为 
AuditLogWorkbook.ashx 的自定义句柄,并传递带有 ListId 和 ItemId 的同一查询字符串。由于自定义句柄 
AuditLogWorkbook.ashx 也具有与之前所示相同的程序集指令,所以也可以基于 ItemAuditing 
程序集编写其代码。AuditLogWorkbook.ashx 中的代码使用 AuditLogWork 类执行此操作。
C#AuditLogWorkbook log = new AuditLogWorkbook();
log.WriteHeaderInfo(list.Title, item.Name, DateTime.Now);
SPAuditQuery wssQuery;
SPAuditEntryCollection auditCol;
wssQuery = new SPAuditQuery(ElevatedSiteCollection);
wssQuery.RestrictToListItem(item);
auditCol = ElevatedSite.Audit.GetEntries(wssQuery);
string eventType;
foreach (SPAuditEntry entry in auditCol) {
  if (entry.SourceName == "CustomViewAuditEvent") {
    eventType = "View Audit Log";
  }
  else {
    eventType = entry.Event.ToString();
  }
  log.WriteEntry(GetUserNameById(entry.UserId, site),
                  entry.Occurred.ToLocalTime().ToString(),
                  eventType,
                  ParseVersionNumber(entry.EventData));
}
AuditLogWorkbook.ashx 中的代码在使用 AuditLogWorkbook 类生成工作簿后,必须使用 
ASP.NET 响应流将工作簿返回给用户。AuditLogWorkbook 类提供了一个 GetDocument 方法,可以返回一个 MemoryStream 
对象,其中包含带有 Excel 工作簿的包。ItemAudit.aspx 中的代码获得了对 MemoryStream 
对象的引用后,会借助该引用将内容流式返回给用户(某种意义上您可以将其视为 Excel 2007 工作簿)。
C#Stream strDocument = log.GetDocument();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("content-disposition", "attachment; filename=AudutLog.xlsx");
Response.ContentType = @"application/vnd.-excel.document.12";
Response.ContentEncoding = System.Text.Encoding.UTF8;
strDocument.Position = 0;
BinaryWriter writer = new BinaryWriter(Response.OutputStream);
BinaryReader reader = new BinaryReader(strDocument);
writer.Write(reader.ReadBytes((int)strDocument.Length));
reader.Close();
writer.Close();
strDocument.Close();
Response.Flush();
Response.Close();
用户在单击 Generate Excel Workbook 后,可以选择直接在 Microsoft Excel 
中打开工作簿,也可以将工作簿另存为 .xslx 文件。如果用户选择打开文件,审核事件信息将以图 16 所示格式显示给用户。
 16.  Excel 2007 
中查看审核事件信息
使用 Excel Services 实现服务器端工作簿呈现
Office SharePoint Server 2007 提供了多项针对服务器端的新功能,以便用户使用 Excel 
Services 对 Office Excel 工作簿进行操作。Excel Services 是传统 Excel 计算引擎的服务器端版本。这一新引擎位于 
Windows SharePoint Services 3.0 顶端,以便随时伸缩以满足广大用户的要求。
Excel Services 还提供了功能强大的呈现引擎,可以将 Excel 工作簿转换为 
HTML,便于用户在浏览器中查看。这样,企业就可以在集中的 Windows SharePoint Services 
文档库中对一组工作簿进行维护,即便用户的桌面机没有安装 Excel,他们也可以查看工作簿的内容。
刚开始使用 Excel Services 时,您会发现,要将工作簿呈现为 
HTML,必须先将这些工作簿添加到配置了受信任文件位置的文档库。受信任文件位置可为 Office SharePoint Server 2007 
服务器场中心管理员提供控制功能,以便其对可加载到 Excel Services 的工作簿和允许的数据连接类型进行控制。
ItemAudit.aspx 还提供了另一个标题为“View Workbook with Excel Services”(使用 
Excel Services 查看工作簿)的命令按钮。该按钮的事件处理程序同样会使用 Office Open XML 格式生成 Excel 
工作簿。与第一个命令按钮不同的是,该按钮所基于的事件处理程序用于将所得到的 Excel 工作簿存储在名为“Audit 
Logs”的文档库中。然后,用户会被重定向并使用 Excel Services 
查看此工作簿。如果您已经正确地配置了受信任文件位置,就应该可以通过单击该按钮查看通过 HTML 呈现的工作簿,如图 17 中所示。
 17. 通过 HTML 
呈现的工作簿
需要注意的是,如果您的计算机安装了 Windows SharePoint Services,但没有安装 Office 
SharePoint Server 2007,那么在该计算机上运行项目级审核示例应用程序时,标题为“View Workbook with Excel 
Service”(使用 Excel Services 查看工作簿)的按钮将无法正常工作,原因是用户被重定向到的应用程序只有在安装 Office 
SharePoint Server 2007 之后才会出现。
打包项目审核解决方案以便进行部署
我们在前面讨论了项目级审核解决方案的所有内建功能。接下来,我们要讨论如何选定一个解决方案(例如本文的项目级解决方案)并将其打包以便进行部署。在此方案中,必须部署到前端 
Web 服务器的文件包括一个程序集、两个自定义应用程序页和实现 Item Auditing 功能组件所需的文件。
Windows SharePoint Services 3.0 引入了一种被称为解决方案包的部署机制。解决方案包是一个带有 
.wsp 扩展名的 .cab 格式的文件,其中包含了必须部署在前端 Web 服务器上的所有文件和其他各种基于 XML 的指令。每个解决方案包都必须包含一个名为 
manifest.xml 的头文件,用于定义 Solution 元素。请考虑下列针对项目审核解决方案而创建的 manifest.xml 
文件。
Xml<Solution SolutionId="44BE5F4A-D561-4981-A318-95ABC706364A" 
          xmlns="http://schemas.microsoft.com/sharepoint/">
  <FeatureManifests>
    <FeatureManifest Location="ItemAuditing\feature.xml" />
  </FeatureManifests>
  <TemplateFiles>
    <TemplateFile Location="LAYOUTS\AuditLogViewer.aspx"/>
    <TemplateFile Location="LAYOUTS\ItemAudit.aspx"/>
    <TemplateFile Location="LAYOUTS\AuditLogWorkbook.ashx"/>
  </TemplateFiles>
  <Assemblies>
    <Assembly DeploymentTarget="GlobalAssemblyCache" Location="ItemAuditing.dll" />
  </Assemblies>
</Solution>
manifest.xml 文件规定了解决方案中有哪些文件必须部署到前端 Web 服务器。定义了 manifest.xml 
文件后,需要将其与其他所有必需文件编译为一个 .cab 格式文件。这一步可以使用 MAKECAB.EXE 工具来完成。使用此工具时,必须定义一个 .did 
文件,以通知 MAKECAB.EXE 要将哪些文件放入输出的 .cab 格式文件中。下面是一个名为 cab.ddf 
的示例文件,我们用它来构建项目级审核解决方案的 ItemAuditing.wsp 包文件。.OPTION EXPLICIT ;Generate errors 
.Set CabinetNameTemplate=ItemAuditing.wsp     
.set DiskDirectoryTemplate=CDROM ; All cabinets go in a single directory
.Set CompressionType=MSZIP;** All files are compressed in cabinet files
.Set UniqueFiles="ON"
.Set Cabinet=on
.Set DiskDirectory1=Package
Solution\manifest.xml manifest.xml
TEMPLATE\FEATURES\ItemAuditing\feature.xml ItemAuditing\feature.xml
TEMPLATE\FEATURES\ItemAuditing\elements.xml ItemAuditing\elements.xml
TEMPLATE\LAYOUTS\AuditLogViewer.aspx LAYOUTS\AuditLogViewer.aspx
TEMPLATE\LAYOUTS\ItemAudit.aspx LAYOUTS\ItemAudit.aspx
TEMPLATE\LAYOUTS\AuditLogWorkbook.ashx LAYOUTS\AuditLogWorkbook.ashx
bin\Debug\ItemAuditing.dll ItemAuditing.dll
完成对 .ddf 文件的定义后,您可以运行以下命令行指令来构建 .wsp 解决方案包文件。makecab /f Solution\cab.ddf
生成解决方案包文件(如 ItemAuditing.wsp)后,您就已经万事俱备,可以在 Windows SharePoint 
Services 或 Office SharePoint Server 2007 
服务器场中部署解决方案了。部署解决方案包需要完成两步操作。第一步,必须添加解决方案包,将 .wsp 文件复制到配置数据库中。此操作可使用 STSADM.EXE 
工具来完成。@SET SPDIR="c:\program files\common files\microsoft shared\web server extensions\12"
%SPDIR%\bin\stsadm -o addsolution -filename package\ItemAuditing.wsp
解决方案安装完毕,工作并没有结束,您还需要对其进行部署。第二步,您必须通知 Windows SharePoint 
Services 将解决方案包部署到服务器场内的所有前端 Web 服务器上。您可以借助 Windows SharePoint Services 
管理中心应用程序(SetupDocument.docx 中有所介绍)提供的用户界面来完成此步操作。或者您还可以通过 STSADM.EXE 
工具来完成。@SET SPDIR="c:\program files\common files\microsoft shared\web server extensions\12"
%SPDIR%\bin\stsadm -o deploysolution -name ItemAuditing.wsp -immediate –allowGacDeployment
您可以命令 Windows SharePoint Services 
立即部署解决方案,也可以稍后进行部署。在实际工作中,将解决方案包的部署安排在工作之余是比较明智的,这样可以最大限度地降低对用户的影响。从上述示例中可以看出,immediate 
属性是用来命令 Windows SharePoint Services 立即安装解决方案包的。 
还要注意的是,上述从 STSADM.EXE 工具运行解决方案部署操作所用的命令行指令中包含 
–allowGacDeployment 参数。无论何时,解决方案包要向全局程序集缓存添加程序集都需要此参数。
结束语
本文探讨了内置在 Microsoft Windows SharePoint Services 3.0 和 Office 
SharePoint Server 2007 中的审核支持,并演示了如何使用自定义项目级审核解决方案来扩展这一支持。通过本文您会了解到,Windows 
SharePoint Services 为进行审核提供了基本的构建基块,而且为了完成审核,Windows SharePoint Services 
还提供了针对网站集级别的审核日志和一个小工具,用户需要查看和更新内容时可使用该工具将审核条目写入日志。您还会发现,可以通过自定义代码从审核日志中读取和写入信息,从而实现对这些构建基块的轻松扩展。
Office SharePoint Server 2007 
添入一个扩展层,使我们无需编写任何自定义代码即可启用和配置审核功能,从而扩展了 Windows SharePoint Services 的审核支持。使用 
Office SharePoint Server 2007 
中包含的信息管理策略,可以在网站集级别上创建审核策略,并进一步将这些策略应用到列表、文档库和内容类型。
Office SharePoint Server 2007 还提供了一个报告层,可生成含有审核事件信息的 Excel 
工作簿。这些 Excel 工作簿基于 ExcelML,您可以使用 Microsoft Office Excel 2003 或 Microsoft Office 
Excel 2007 打开它们。您还了解到可以创建自定义解决方案(如本文的项目级审核解决方案)来实现使用 Office Open XML 
格式生成包含审核事件信息的 Excel 工作簿。这类解决方案还允许您使用 Excel 
Services,从而可以通过浏览器显示生成的工作簿中的审核事件信息。这样,即使那些桌面机上未安装 Excel 的用户也可以查看这些信息。
posted @ 2009-02-20 11:14  RickyYan  阅读(676)  评论(0编辑  收藏  举报