目录
AuditingDemo 项目
创建支持审核配置页面
扩展站点操作菜单
查看审核日志条目
逐项查看日志
SharePo® 技术许多用户并未意识到 Windows® SharePo Services (WSS) 3.0 平台中直接内置了审核支持这特点没有广为人知主要是由于 WSS 审核支持默认被关闭WSS 也没有提供现成选项启用该功能要利用 WSS 审核基础架构还需要 WSS 中没有代码
Microsoft® Office SharePo Server (MOSS) 2007 是利用 WSS 审核条捷径MOSS 提供了用户界面(“站点设置”>“配置审核设置”下)让站点集合所有者能启用并配置自动活动事件日志记录MOSS 还提供了审核报告工具用于读取审核日志条目并报告用户在特定站点集合内已执行操作如读写内容等
WSS 审核支持另种使用方式对于开发人员很有吸引力您可以使用 Visual Studio® 构建自定义 SharePo 解决方案创建自定义应用页允许站点集合管理员启用并配置 WSS 活动事件日志记录但是仅开启自动活动事件日志记录还是不够它还有其他要求面向 WSS 自定义审核解决方案还必须包含某种类型用户界面以便用户可以查看或报告已加入 WSS 审核日志审核条目
两年前在 Microsoft 发布 MOSS 2007 第个公用测试版后不久Joanna Bichsel 和我发表了名为“使用 SharePo Server 2007 实现项目级审核”白皮书 (msdn.microsoft.com/library/bb397403)以及辅助代码举例在该书中我们就如何为 WSS 编写审核支持讨论了诸多重要细节我们还探讨了 MOSS 如何使用自定义策略和审核报告生成来充分利用并扩展 WSS 审核基础架构
在本月专栏中我将演示我最近使用名为 AuditingDemo Visual Studio 项目创建新 SharePo 解决方案该项目包含些我在白皮书中提及审核管理代码如通过 WSS 对象模型启用审核支持代码不过AuditingDemo 项目已完全经过重新设计和我两年前编写代码相比性能已大为提高例如使用 STSDEV 实用已创建了 AuditingDemo 项目且我已在解决方案包部署、安全编程和安全修整等方面加入了许多最佳实战
在本月专栏中我想介绍说明这些更新最佳实战和 SharePo 开发技术我意图是对原来白皮书做些补充而不是推翻它内容如果您还未读过原来白皮书我建议您先看看这本书以便了解本月专栏历史渊源
AuditingDemo 项目
AuditingDemo 项目旨在提供个自定义 SharePo 解决方案它能利用 WSS 平台中内置审核支持功能设计这项目时我想法是让站点集合所有者(或担任审核管理员其他用户)能启用、查看并修改当前站点集合审核设置AuditingDemo 项目还具备查看功能这样担任审核员用户就能看到审核日志内容确定整个站点集合、每项或每个文档都出现了什么活动
如前所述此项目使用 STSDEV 实用构建其下载位置是 codeplex.com/stsdev我在 2008 年 3 月 Office Space 专栏中 (msdn.microsoft.com/magazine/cc337895) 也对此做了介绍
AuditingDemo 项目是使用名为 AuditingDemo 核心功能设计该功能在站点集合这级别发挥作用要使用 AuditingDemo仅需在站点集合激活次该功能即可
AuditingDemo 功能包含带有 FeatureActivated 事件处理功能接收器类(请参见图 1)在功能激活期间执行 FeatureActivated 中代码并完成两件重要事情第对整个网站WebSite集合完全启用审核日志记录第 2它专门针对 AuditingDemo 解决方案创建数个安全对象FeatureActivated 中代码还特别新建两个 SharePo 组和两个新权限级别以便站点集合管理员能新增担任审核员和审核管理员用户
图 1. FeatureActivated 事件处理
public override void FeatureActivated(SPFeatureReceiverProperties
properties) {
using (SPSite siteCollection = (SPSite)properties.Feature.Parent) {
SPWeb TopLevelSite = siteCollection.RootWeb;
// Turn _disibledevent=> siteCollection.Audit.Update;
// create permission levels
SPRoleDefinition AuditorPermissions, AuditManagerPermissions;
AuditorPermissions = CreatePermissionLevel(
"Auditor Permissions",
"Can view audit logs",
"Read");
AuditManagerPermissions = CreatePermissionLevel(
"Audit Manager Permissions",
"Can configure auditing support",
"Design",
SPBasePermissions.ManageWeb);
// create Auditors group
SPGroup Auditors = CreateGroup(
"Auditors",
"for users who need to audit user activity");
SPRoleAssignment AuditorRoleAssignment = SPRoleAssignment(Auditors);
AuditorRoleAssignment.RoleDefinitionBindings.Add(AuditorPermissions);
TopLevelSite.RoleAssignments.Add(AuditorRoleAssignment);
// create Audit Managers group
SPGroup AuditManagers = CreateGroup(
"Audit Managers",
"for users who configure WSS auditing support");
SPRoleAssignment AuditManagerRoleAssignment =
SPRoleAssignment(AuditManagers);
AuditManagerRoleAssignment.RoleDefinitionBindings.Add(
AuditManagerPermissions);
TopLevelSite.RoleAssignments.Add(AuditManagersRoleAssignment);
}
注意FeatureActivated 事件处理中代码名为 CreatePermissionLevel 和 CreateGroup 两个实用思路方法我介绍这些是为了确保先删除任何和它们同名旧安全对象每个思路方法随后会创建请求安全对象(权限级别或组)将其添加到顶层站点相应集合内并为返回强类型化安全对象CreatePermissionLevel 思路方法返回代表新权限级别 SPRoleDefinition 对象CreateGroup 思路方法返回 SPGroup注意我是使用数个重载实现设计 CreatePermissionLevel 思路方法它们第 3和第 4个参数是可选参数第 3个参数用于传递现有权限级别名称该级别用于为新权限级别制作副本例如通过制作内置“读取”权限副本来创建 AuditorPermissions 权限级别通过制作内置“设计”权限副本来创建 AuditManagerPermissions 权限级别
CreatePermissionLevel 思路方法第 4个参数类型是 SPBasePermissions用于额外传递个或多个权限随后可使用这些权限化新权限级别例如对 CreatePermissionLevel(它创建 SPRoleDefinition 对象 AuditManagerPermissions)会为第 4个参数传递个 ManageWeb 值这意味着新权限级别是使用和内置“设计”权限相同权限和 ManageWeb 权限创建
ManageWeb 权限十分重要需要调整审核设置用户要用到这权限我在本专栏后面部分将介绍两项安全修整技术它们用于向仅具有此权限用户显示菜单项
CreateGroup 思路方法作用不只限于向顶层站点添加新组它还可以向相关组集合中添加新组并将新组 ID 加入名为 vti_associatemembergroup 站点级属性中当您想让新组显示在组快速启动栏中和“添加用户”页面组合框内以便站点集合所有者能更为直观地利用它向新组中添加用户时这代码非常重要
创建支持审核配置页面
AuditingDemo 项目提供 3个自定义应用页面——AuditConfig.aspx、AuditLogViewer.aspx 和 ItemAudit.aspx——它们都是使用实战效果最好技术开发例如这些应用页面部署在 LAYOUTS 目录内名为 AuditingDemo 特定解决方案目录下为这些页面提供行为代码已写入代码隐藏文件(例如 AuditConfig.cs)该代码隐藏文件随后编译到项目主集 AuditingDemo.dll 中该集从全局集缓存Cache (GAC) 中安装并加载
AuditConfig.aspx 应用页面为配置 WSS 审核支持提供了个用户界面我向 AuditingDemo 功能中添加了个 CustomAction以便具备 ManageWeb 权限用户可以在站点设置页面上看到个链接使用该链接浏览 AuditConfig.aspx:
<!-- Add Link to Site Setting Page -->
<CustomAction
Id="SiteActionsToolbar"
GroupId="SiteCollectionAdmin"
Location="Microsoft.SharePo.SiteSettings"
Sequence="0"
Rights="ManageWebs"
Title="Audit Management" >
<UrlAction Url="~sitecollection/_layouts/AuditingDemo/AuditConfig.aspx"/>
</CustomAction>
注意我是使用 SiteCollectionAdmin GroupId 属性值和 Sequence 属性值 0 创建这个自定义操作这使该链接最先显示在“站点设置”页面“站点集合管理”列中我随同 ManageWebs 值引入了 Rights 属性WSS 用它提供声明性安全修整因此只有具备 ManageWebs 权限用户才能看到该链接网站WebSite集合所有者和其添加到审核管理员角色任何用户皆属此列
用户浏览 AuditConfig.aspx 时会看到图 2 中所示 UI如您所见此应用页面提供了完全启用或禁用审核单选按钮您还能看到用于进入选择模式单选按钮在该模式下用户可以精确选择在审核条目中记录活动
图 2 AuditConfig.aspx 允许用户配置审核日志记录
AuditConfig.aspx OK 按钮源代码相当简单它读取用户选择了哪个单选按钮并将当前站点集合审核标志设置为合适值然后 Audit 属性 Update 将更改记入内容数据库
SPSite siteCollection = this.Site;
(radAuditingOff.Checked) {
siteCollection.Audit.AuditFlags = SPAuditMaskType.None;
}
(radAuditingOnFull.Checked) {
siteCollection.Audit.AuditFlags = SPAuditMaskType.All;
}
(radAuditingOnSelective.Checked) {
siteCollection.Audit.AuditFlags = GetSelectiveAuditingFlags;
}
siteCollection.Audit.Update;
如果用户已选择了可选审核配置选项则会 GetSelectiveAuditingFlags 实用思路方法它会检查所有这些复选框并使用位或运算返回 SPAuditTypeMask 值它代表用户为审核选择所有类型活动组合private SPAuditMaskType GetSelectiveAuditingFlags {
SPAuditMaskType AuditFlags = SPAuditMaskType.None;
(chkAuditView.Checked) {
AuditFlags |= SPAuditMaskType.View;
}
(chkAuditUpdate.Checked) {
AuditFlags |= SPAuditMaskType.Update;
}
// Repeat for Copy, Move, Delete, Undelete, CheckIn, CheckOut,
// Search, Workflow, SecurityChange, ProfileChange, SchemaChange
AuditFlags;
}
扩展站点操作菜单我提供了浏览支持以便用户可以到达 AuditLogViewer.aspx 应用页面担任审核员用户可利用该页查看站点发生活动考虑到许多担任审核员用户不定是管理员可能绝不会因其他缘由访问“站点设置”页面我没有在“站点设置”页面上放置另链接因此使用自定义“站点操作”菜单项添加浏览支持似乎更为直观我还能通过它为您展示如何利用化安全修整创建弹出菜单
如果您想要动态构建菜单项您需要创建自定义Control控件类并添加声明性 CustomAction 元素以例子化正确位置中Control控件类例子注意以下 CustomAction 元素和我先前所示区别的处:
<Elements xmlns="http://schemas.microsoft.com/sharepo/">
<!-- Add Command to Site Actions Dropdown -->
<CustomAction Id="AuditingSupport"
GroupId="SiteActions"
Location="Microsoft.SharePo.StandardMenu"
Sequence="1000"
ControlClass="AuditingDemo.SiteActionsCustomSubMenu"
ControlAssembly="AuditingDemo, [4-part name]"
Title="Auditing Support"
Description="Support for configuring and viewing auditing" />
</Elements>
两者主要区别的处在于它使用 ControlClass 和 ControlAssembly 属性(而不是 UrlAction 元素)做出声明这样就能使用自定义Control控件类动态生成菜单项例如 SiteActionsCustomSubMenu(AuditingDemo 项目中使用了这Control控件类如图 3 代码中所示)注意自定义Control控件类必须从 ASP.NET 编程模型提供 WebControl 类进行继承图 3 SiteActionsCustomSubMenu
public SiteActionsCustomSubMenu : WebControl {
protected override void _disibledevent=> SPWeb site = SPContext.Current.Web;
SPUser user = site.CurrentUser;
// provide security trimming
(IsCurrentUserInGroup("Auditors") ||
IsCurrentUserInGroup("Audit Managers") ||
user.IsSiteAdmin) {
siteCollectionPath = siteCollection.Url;
(!siteCollectionPath.EndsWith(@"/"))
siteCollectionPath "/";
SubMenuTemplate smt = SubMenuTemplate;
smt.Text = "Auditing Support";
smt.ID = "mnuAuditingSupport";
smt.Description = "Configure and View Auditing";
smt.ImageUrl = siteCollectionPath +
@"_layouts/images/AuditingDemo/AfricanPith32.g";
smt.Sequence = 400;
MenuItemTemplate mit1 = MenuItemTemplate;
mit1.ID = "mnuAuditLog";
mit1.Text = "Audit Log";
mit1.Description = "Inspect Audit Entries";
mit1.Sequence = 401;
mit1.ClientOnClickNavigateUrl = siteCollectionPath +
"_layouts/AuditingDemo/AuditLogViewer.aspx";
mit1.ImageUrl = siteCollectionPath +
@"_layouts/images/AuditingDemo/Binoculars32.g";
// add menu item to Controls collection
smt.Controls.Add(mit1);
// perform extra security trimming for menu for AuditConfig.aspx
(IsCurrentUserInGroup("Audit Managers") || user.IsSiteAdmin) {
MenuItemTemplate mit2 = MenuItemTemplate;
mit2.ID = "mnuAuditingConfiguration";
mit2.Text = "Auditing Configuration";
mit2.Description = "Enable/Disable Auditing";
mit2.Sequence = 402;
mit2.ClientOnClickNavigateUrl = siteCollectionPath +
"_layouts/AuditingDemo/AuditConfig.aspx";
mit2.ImageUrl = siteCollectionPath +
@"_layouts/images/AuditingDemo/Compass32.g";
smt.Controls.Add(mit2);
}
this.Controls.Add(smt);
}
}
private bool IsCurrentUserInGroup( GroupName) {
SPWeb site = SPContext.Current.Web;
foreach (SPGroup group in site.SiteGroups) {
(group.Name.Equals(GroupName)) {
group.ContainsCurrentUser;
}
}
throw ApplicationException("There is no group named " +
GroupName);
}
}
CreateChildControls 思路方法提供了动态安全修整注意只有身为站点集合所有者或审核员/审核管理员组成员用户才能看到完整弹出菜单第 2个菜单项(允许用户浏览 AuditConfig.aspx 页面)做了更大修整排除了审核员组中用户只有身为站点集合所有者或添加至审核管理员组用户才能看到此菜单有关使用自定义Control控件类创建动态菜单我还要提及另个更重要关键点和 Web 部件类似自定义Control控件类需要承载 Web 应用 web.config 文件中 SafeControl 条目STSDEV 实用为添加此 SafeControl 提供了支持它在 manest.xml 文件中加入合适元素从而使所需 SafeControl 条目能在场中部署 AuditingDemo.wsp 解决方案包时添加到或多个 web.config 文件内
查看审核日志条目
AuditingDemo 解决方案提供了 AuditLogViewer.aspx 自定义应用页如图 4 所示该页面为用户提供了包含整个站点集合所有审核条目视图该页面上还有个标题为“清除审核日志”按钮此按钮已经过安全修整处理仅显示给站点集合所有者此按钮源代码从审核日志删除了所有条目在您测试自定义审核解决方案时这会很有帮助
图 4 AuditLogViewer.aspx 显示审核日志条目
AuditLogViewer.aspx 源代码使用 SPAuditQuery 对象在当前站点集合中查询审核日志通过对 SPSite 对象 Audit 属性 GetEntries 思路方法来运行查询对 GetEntries 会返回 SPAuditEntryCollection 对象通过枚举该对象可检查每个视为 SPAuditEntry 对象审核条目:
SPSite SiteCollection = SPContext.Current.Site;
SPAuditQuery wssQuery = SPAuditQuery(SiteCollection);
SPAuditEntryCollection auditCol =
SiteCollection.Audit.GetEntries(wssQuery);
foreach (SPAuditEntry entry in auditCol) {
// enumererate through each audit entry
}
通过 SPAuditEntryCollection 进行枚举以创建显示思路方法有许多种我使用技术是动态创建 ADO.NET DataTable 对象然后用每个审核条目行信息填充它通过创建 DataTable并将审核信息绑定到 SPGridView Control控件来显示审核信息会变得相对简单些AuditLogViewer.aspx 页源代码必须在安全方面进行特殊处理如果您检查那些查询审核日志代码就会看到它首先 RunWithElevatedPrivileges以便其能以专用 SHAREPOINT 帐户身份运行由于查询审核日志属于特权操作所以需要使用这项技术
有时也可能出现用户具备了审核员身份但却没有查询审核日志所需必要权限情形因此需要 RunWithElevatedPrivileges这样即使当前用户没有所需权限代码也能查询审核日志
逐项查看日志
AuditingDemo 项目中第 3个应用页是 ItemAudit.aspx该页显示个特殊项目或文档审核条目通过添加个 CustomAction 元素可以浏览此页该元素会向内置 Item 内容类型新增个 EditControlBlock (ECB) 菜单项:
<CustomAction Id="ItemAuditing.ECBItemMenu"
RegistrationType="ContentType"
RegistrationId="0x01"
ImageUrl="/_layouts/images/GORTL.GIF"
Location="EditControlBlock"
Sequence="300"
Title="View Audit History">
<UrlAction Url=
"~site/_layouts/AuditingDemo/ItemAudit.aspx?ItemId=
{ItemId}&ListId={ListId}"/>
</CustomAction>
为 Item 内容类型配置 CustomAction 还会应用到从 Item 继承所有内容类型由于所有内容类型均从 Item 类型继承而来所以该技术可以有效地将 ECB 菜单项添加到整个站点集合每个项目和文档中您可下载 AuditingDemo 举例代码然后将其部署到场内 SharePo 开发机器上以此检验这项技术在某特殊站点集合激活 AuditingDemo 功能后您会看到每个项目和文档都有个 ECB 菜单项以“View Audit History”(查看审核历史记录)为标题只要用户选择 ECB 菜单项就会将其重定向至 ItemAudit.aspx 页如图 5 所示
图 5 ItemAudit.aspx 显示特定项审核条目
和 AuditLogViewer.aspx 页类似ItemAudit.aspx 源代码使用 SPAuditQuery 对象检索审核日志数据和 DataTable(用审核日志条目数据填充然后绑定到 SPGridView Control控件)主要区别是 ItemAudit.aspx 源代码先 SPAuditQuery 对象 RestrictToListItem 思路方法然后再运行查询以过滤结果这样找出就是所关注项目或文档
请特别注意SPAuditQuery 类还提供了其他两种筛选思路方法:RestrictToList 和 RestrictToUser以便您可以查看特殊列表或特殊用户审核条目另请注意您还可使用 RestrictToUser 和 RestrictToListItem 或 RestrictToList 思路方法组合确定列表或列表项具体涉及哪位用户
最新评论