控制

使用 SharePoint 来管理您的 Windows 服务

Pav Cherny

代码下载可从 MSDN 代码库
浏览代码联机

本文讨论:

  • Windows Services 的 SharePoint 集成
  • Windows 服务和实例的类
  • Windows 服务的进程标识类型
  • 启动和停止服务
本文涉及以下技术:
Windows SharePoint Services

内容

非集成的解决方案原型
与 SharePoint 集成
定义进程标识
Windows 服务依赖项
添加配置参数
最后一触及和测试
设置汇总

所有 Windows Server 操作系统很大程度都取决于 Windows 服务。由于中 1993 Microsoft 首次引入 Microsoft Windows NT 3.1 的服务,并且它可能不会更改在将来的操作系统是,未更改此。即使 SharePoint 无法存在不使用 Windows Services Internet Information Services (IIS) 和 SharePoint 特定于任务的其他服务。您可以利用内置服务基础结构,通过该 Windows SharePoint Services 计时器 (SPTimerV3) 服务的自定义作业,但如果需要大量的数据处理、 连续的系统监视、 病毒扫描、 网络通信或代理基于备份和还原操作,它最好仍创建您自己单独的 Windows 服务。不难生成 Windows 服务。Microsoft Visual Studio 2008 包含在所需的项目模板和向导来获取您和您可以用 C/C++ 以及托管的语言,以实现服务逻辑。但是,不为直接与 SharePoint 集成 Windows 服务。Windows SharePoint Services (WSS) 3.0 软件开发工具包 (SDK) 很不涉及本主题,存在没有向导,并且您必须确保集成结果执行危及 SharePoint 安全性。

此文章中, 我将显示您如何与 SharePoint 集成了 Windows Services–based 解决方案。结果,可以设置、 启动、 停止,并删除通过 SharePoint 3.0 管理中心和对 SharePoint 管理对象模型的服务实例在 SharePoint 配置数据库中集中维护服务设置,并确保在 SharePoint 集群中的所有服务实例都使用相同的安全帐户和配置参数。更改在 SharePoint 中的配置设置时, 可以在服务器场中的所有服务器之间持续应用所做的更改。当然,也可能是配置分别为单独的服务实例的参数如有必要。对于我的示例解决方案,我选择要执行敏感操作重点介绍 SharePoint 特定安全注意事项的前端服务器上。助理材料包括源代码,并在此处,我将讨论的步骤根据向序列完成的各种阶段已编译文件。助理材料还包括分步的工作表,如果想要执行我在自己的开发环境中的说明。

非集成的解决方案原型

来启动开发周期收集需求、 分级显示一个常规的解决方案设计和交付概念验证具有代表性的形式的最佳做法是原型的。是为需要在前端服务器或应用程序服务器上的提升的权限的 security-sensitive SharePoint Services 尤其如此。而不需要与 SharePoint 集成可管理性原型,您原型必须直接从开始以后避免复杂的设计问题中处理 SharePoint 安全依赖项。即使看似简单的解决方案可能导致 SharePoint 环境中的棘手问题。

本文的示例解决方案,为例。解决合并安全事件日志条目从自定义 SharePoint 列表中的前端服务器的要求。就看似简单任务: 解决方案注册一个名为 EntryWrittenEventHandler 接收事件通知操作系统中添加到安全事件日志的新条目,并且然后,如果项符合一个的指定的筛选条件,如项类型为 FailureAudit 或 SuccessAudit,解决方案将添加到 SharePoint 中的自定义安全审核列表的相应项与本地计算机上的事件日志子系统中的处理程序。它并不难生成基本的 Windows 服务和自定义 SharePoint 列表为此,但,服务帐户需要 SharePoint 网站中添加自定义列表的项的写权限和本地服务器上注册 EntryWrittenEventHandler 的管理权限,这是 SharePoint 服务器上的安全问题。

通过在 SharePoint 网站的应用程序池帐户的上下文中运行 Windows 服务,可以满足 SharePoint 权限要求时, 必须不授予本地 SharePoint 的安全帐户管理权限。如标题为 TechNet Magazine 1 月 2009 列中所述,授予前端服务器上的管理权限的安全帐户 jeopardizes SharePoint 安全"SharePoint 安全帐户."

因此,如何执行您避免的特权提升如果您的解决方案必须执行安全敏感的操作?一种很好的技术是分为多个组件的解决方案,并使用它们之间的安全的进程间通信机制。然后,可以运行该要求组件都在上下文中本地系统帐户的管理权限 SharePoint 安全帐户的上下文中运行的其他组件时。Microsoft SPTimerV3 服务中使用此方法。SPTimerV3 运行没有 SharePoint 服务器场帐户的上下文中的管理权限,并依赖于 Windows SharePoint Services 管理 (SPAdmin) 服务在本地服务器上执行管理任务。SPAdmin 服务运行在本地系统帐户的上下文中。SPTimerV3 和 SPAdmin 使用.NET 远程处理进程间通信,但您也可以使用颜色较浅的粗细机制,如命名管道,,只要您的访问控制列表 (ACL) 保护的通信工具。在该示例解决方案,我使用命名管道方法。

请看一下整体解决方案体系结构, 图 1 中。解决方案依赖于包含上述 EntryWrittenEventHandler 回调函数用于从本地事件日志子系统中接收通知的一个单独的安全事件处理程序服务。此服务运行在本地系统帐户的上下文中。其副本就是安全事件接收器服务,在 SharePoint 网站应用程序池帐户指定的安全审核列表中创建内容的项目的上下文中运行。当您启动安全事件接收器时,服务将创建安全的命名的管道,授予仅本地系统帐户访问权限。此安全事件处理程序服务使用此命名的管道时在"安全事件日志条目写入"事件将触发与安全事件接收器。这种设计适用不要求提升的权限和不 jeopardizing SharePoint 安全性。就只是一个更涉及比典型的单一 Windows 服务体系结构。

fig01.gif

图 1 SharePoint 解决方案最拆分

您可能注意到在示例应用程序中 Microsoft.NET Framework 无法分析的安全项说明。这不是关键的这篇文章,但考虑安装 Microsoft 知识库中所述修补程序"使用 Windows NT 安全事件日志 API 的应用程序无法读取事件日志消息的说明运行 Windows Vista 或 Windows Server 2008 的计算机."

与 SharePoint 集成

功能的原型的交付是一个重要的里程碑 ; 另一个是提供适当的管理工具,这是关键方面的 SharePoint 集成的 Windows Services。没有集成,就难以控制已部署的服务实例,或者确保场中的所有服务器上的一致的服务行为。集成,可以使用 SharePoint 3.0 管理中心来确定服务器运行您的服务并集中配置的所有服务实例的相关参数。您已完成所有的集成步骤后, 图 2 显示了应用程序。它可能类似小的应用程序,但 SharePoint 集成提供一个功能齐全的 SharePoint 解决方案的所有特征。

fig02.gif

图 2 与 SharePoint 的集成

您需要与 SharePoint 集成 Windows 服务的四个组件的实质上是,: 标识服务,使 SharePoint 来控制各个服务的类的类实例,将这两个类的对象添加到此 SharePoint 配置与 SharePoint 解决方案包部署这些组件的管理工具。

根据解决方案结构 图 1 中所有两个 Windows 服务: 安全事件处理程序和安全事件接收器。在新的类库项目中,因此让我们创建相应的服务类。我将此项目添加直接到我在 Visual Studio 中构建了 SecurityAudit 解决方案中。它称为 SecurityEventManagement。我添加对 Windows SharePoint Services 库的引用后,我创建了从每个 Windows 服务 SPWindowsService 类派生一个新类。SecurityEventReceiverService 类的初始实现中, SecurityEventHandlerService 类具有相同结构 ; 仅服务名称不同,正如您将看到是否您分析助理材料中步骤 2 文件夹中的该代码。

服务类表示在 SharePoint 集群中的特定 Windows 服务。所有的服务实例一个全局对象但还需要一个类来关联特定的 SharePoint 服务器的服务的一个实例。SharePoint 管理对象模型定义了几个服务的文章类和服务实例类及其对应。SPWindowsService 类在 Windows Services 的正确的选择并且因此 SPWindowsServiceInstance 类权限基类的服务实例类: SecurityEventReceiverServiceInstance 和 SecurityEventHandlerServiceInstance。再次,类定义是相对 uncomplicated。

现在让我介绍如何生成可将服务和服务实例对象添加到 SharePoint 配置该管理工具。您可以完成这通过 SharePoint 3.0 管理中心中,Stsadm.exe 命令的扩展名或任何其他方法的应用程序页 (如) 通过 Windows PowerShell 的使用。我选择创建一个 Stsadm.exe 命令扩展,因为意味着从作业手头的小干扰的低开销。有关 Stsadm.exe 命令扩展的详细信息,阅读文章"如何: 扩展 STSADM 实用程序."

管理工具必须实例化和保持服务并服务实例对象。类的构造函数显示如何实例化对象。很值得注意 SharePoint 服务类从 SPPersistedObject 类派生。调用 Update() 方法时时, 会保留这些对象。同样,如果 de-provisioning 后调用 Delete() 方法,这些对象被再次删除。SecurityEventServiceAdministration.cs 代码文件 SecurityEventManagement 项目中的说明了这些步骤。

就是这样 !可以现在编译解决方案并将其部署通过 WSS 3.0 解决方案包 (.wsp) 的使用。有关如何使用 Visual Studio 和 MakeCab.exe 创建解决方案包了详细说明我建议Andrew Connell 文章有关如何创建 WSS 解决方案文件。请参阅助理材料中将该代码。

定义进程标识

SharePoint 集成的简单性可能是一个很好的意外但具有执行充分利用 SharePoint 对象模型的直接结果。可以已提供服务实例并使用 SharePoint 3.0 管理中心中的管理链接 (请参见 图 3 )。是例如,您可以启动并停止安全事件接收器服务 ; 只是在安全事件处理程序服务不一样容易。这是大小写,因为当您单击开始链接时,SharePoint 更新服务配置。默认情况下, SharePoint 配置服务不具有注册一个 EntryWrittenEventHandler 的权限在本地服务帐户的上下文中运行。因此,安全事件处理程序服务失败。您需要 hardwire 安全事件处理程序服务在本地系统帐户,并且应提供提供安全事件接收器服务使用以及所需的应用程序池帐户的选项。

fig03.gif

图 3 SharePoint 3.0 管理中心

让我们启动与安全事件处理程序服务,因为它是直接 hardwire 系统帐户。在服务构造函数中只需三行代码。第一行设置为系统帐户的服务的进程标识。其他两行禁用凭据部署,和凭据以防止管理员更改 SharePoint 3.0 管理中心中的帐户信息的更新。服务帐户页 (_admin/FarmCredentialManagement.aspx) 不再会列出 Windows 服务的列表框中的此服务。

public SecurityEventHandlerService(SPFarm spFarm)
       : base(ntServiceName, spFarm)
{
   base.ProcessIdentity.CurrentIdentityType = IdentityType.LocalSystem;
   base.ProcessIdentity.IsCredentialDeploymentEnabled = false;
   base.ProcessIdentity.IsCredentialUpdateEnabled = false;
}

因为您必须处理各种安全帐户信息在提供的服务,则安全事件接收器服务是稍微复杂一些。 安全帐户可以使用密码的域用户帐户或不使用密码为系统帐户。 当您处理域用户帐户时,帐户名称必须符合 NetBIOS 名称约定,并应确认该密码。 在我的实现代码将为 True 以便 SharePoint 管理员可以设置安全事件接收器服务后更改 SharePoint 3.0 管理中心中的安全帐户此类中设置 IsCredentialDeploymentEnabled 和 IsCredentialUpdateEnabled 属性。

当然,您还必须扩展提供 SecurityEventReceiverService 对象使用的用户名和密码管理工具。 签出该 SecurityEventServiceAdministration.cs 文件在步骤 3 助理文件夹中。 它包括必要的修改为 Stsadm.exe 命令扩展名。

Windows 服务依赖项

到目前为止,您可以启动并停止 SharePoint 服务器上的设置的服务实例和服务保留其安全帐户。 但是,如果您停止这两个服务实例,然后尝试启动但不第一个选定的服务器上启动 SecurityEventReceiverService 实例的 SecurityEventHandlerService 实例时,遇到错误,指出"相关服务或组无法启动"。 原因是安全审核安装程序配置安全事件处理程序服务依赖于安全事件接收器服务,以使服务控制管理器 (SCM) 在启动安全事件处理程序服务时自动启动安全事件接收器服务。 但是,SCM 如果其启动类型已禁用,SharePoint 将启动类型设置为禁用停止的服务实例时无法启动服务。 请考虑更改服务安装程序逻辑。 如果您删除所有依赖项和安装服务最初与启动类型设置为禁用,,可以避免此错误。 这样可确保 SharePoint 3.0 管理中心中一个一致的控件行为。

很好要避免错误错误,但原始的依赖项已存在一个原因。 别是忘服务相互依赖的正常运行的安全事件处理程序服务,安全事件接收器审核解决方案。 如果您启动或停止一,则您还应启动或停止其他。 可以通过重写提供和服务实例 Unprovision 方法来实现此行为。 在 SecurityEventReceiverServiceInstance 尝试在同一台服务器上查找其 SecurityEventHandlerServiceInstance 副本并启动或如果停止除了自己的实例,找到。 代码还演示了如何自定义开始,并停止操作链接通知受影响的服务的管理员用户界面中显示一个消息框。

如果您分析在步骤 4 助理文件夹中的源代码,您会发现 SecurityEventHandlerServiceInstance 类中不包含重写的设置和 Unprovision 方法。 就足够了启动和停止服务通过 SecurityEventReceiverServiceInstance 类。 相反,我将在 SecurityEventHandlerServiceInstance 标记为删除相应的启动系统服务和停止链接,和隐藏该服务可配置服务的列表中。 SecurityEventHandlerService 引用目前只在服务的视图在服务器页上所有可见。 下面的代码说明如何标记作为系统服务的服务实例:

public overrid  e bool SystemService
{
    get
    {
        return true;
    }
}

添加配置参数

解决方案现在并的 SharePoint 的一个组成部分。 下一步是移动相关的配置设置从本地注册表到 SharePoint 配置数据库以提高整个 SharePoint 场的配置的一致性。 所有的服务实例共享相同的配置数据库。 您只需要修改 Windows 服务从配置数据库而不是在注册表中读取参数。 若要维护配置数据库中的参数,使用在 SPPersistedObject 类 (如在 WSS 3.0 SDK 中所述)" SPPersistedObject 类 (Microsoft.SharePoint.Administration)."

在 SPWindowsService 和 SPWindowsServiceInstance 类从 SPPersistedObject 类派生,因此我 SecurityEventReceiverService 和 SecurityEventReceiverServiceInstance 类。 这意味着可以添加全局参数作为保留属性直接对服务和服务实例的类。 在我的示例,这些是参数 SiteURL,ListName 和 EventFilter。 SecurityEventReceiverServiceInstance 类将正确的选择对于实例特定的参数,但我解决方案,所有的服务实例是应该使用相同的设置,因此我扩展 SecurityEventReceiverService 类中。

若要检索参数值,您需要对配置数据库的访问。 SharePoint 负责这对您如果保留进程标识服务的类凭据部署启用 (IsCredentialDeploymentEnabled = true)。 我这样做的安全事件接收器服务类,但 Windows 服务还必须知道如何使服务类。 您可以注意这一要求添加到 Visual Studio 项目包含与 Windows 服务的类库引用。 在我的示例,这是 SecurityEventReceiver 项目。 请确保您标记为 public SecurityEventReceiverService 类,以便 Windows 服务可以使用它,并利用您的 SharePoint 解决方案包部署在全局程序集缓存 (GAC) 的类库的程序集。 您需要检索服务对象中使用服务器场的服务集合的 GetValue 方法之前部署到 GAC 中。 以下是如何访问 SecurityEventReceiverService 类的配置属性:

SecurityEventReceiverService EventReceiverService =
    SPFarm.Local.Services.GetValue<SecurityEventReceiverService>(
        SecurityEventReceiverService.ntServiceName);

if (EventReceiverService == null)
    throw new Exception("Unable to locate SecurityEventReceiverService"
                      + " in the local SharePoint farm.");
siteURL = EventReceiverService.SiteURL;
listName = EventReceiverService.ListName;
eventFilter = EventReceiverService.EventFilter;

现在,Windows 服务可以在配置数据库中读取参数,剩余的任务是设置它们。 首选的选择,许多管理员是一个自定义应用程序页添加到 SharePoint 3.0 管理中心,并绑定到该服务通过 ManageLink 属性,但也可以使用 Stsadm.exe 命令扩展或其他方法。 以下代码使用添加到 SecurityEventReceiverServiceInstance 类将 ManageLink 属性。

public override SPActionLink ManageLink
{
    get
    {
      return new 
        SPActionLink("SecurityAudit/ManageSecurityAuditSettings.aspx");
    }
}

该服务的显示名称转换打开 _admin/SecurityAudit/ManageSecurityAuditSettings.aspx 页的超链接。 您可以在我调用 ManageSecurityAuditSettings 单独的类库中找到 ManageSecurityAuditSettings.aspx 页面。 有关如何创建自定义应用程序页的详细信息,阅读 Ted Pattison" Windows SharePoint Services 3.0 中创建的应用程序页." 请参阅第 5 步助理文件夹。

最后一触及和测试

该项目随即几乎完成,除了 finishing 触及和正确的解决方案的测试。 是例如您可能需要更改对服务在 SharePoint 3.0 Central Administration 显示名称,因为默认名称 SecurityEventManagement.SecurityEventHandlerService 和 SecurityEventManagement.SecurityEventReceiverService 不是最友好的用户。 但是,您不会通过重写在您的服务类中的 DisplayName 属性获得所需的效果。 在显示名称对应 TypeName 属性而是,因此不依赖于 TypeName = GetType().ToString() = SharePoint 解决方案中。

此外请注意服务和服务实例的类提供 TypeName 属性因为则从该 SPPersistedObject 类继承,但 quasi-hierarchical 的关系。 服务实例在默认情况下使用其关联的服务的名称。 服务实例类从返回关联的服务类的 TypeName 的 SPServiceInstance 类继承重写的 TypeName 属性。 当然,您可以再次若要更改特定的条件 according to 显示名称如指示一个重要组件是缺少服务实例类中覆盖 TypeName 属性。

SharePoint 技术不为一致,则可能是,但这不难确定虚拟方法和属性,无论它们的名称。 确定可用属性和 Visual Studio 中的方法右键单击如 SPWindowsService 从基类,以及选择了到定义,然后右键单击 SPService,得到了定义,等通过整个继承层次结构。 您还可以查看 WSS 3.0 SDK。 几乎不包括在 SPWindowsService 和 SPWindowsServiceInstance 类,但类成员的列表是用于某些程度 ( SPWindowsService 成员SPWindowsServiceInstance 成员).

请记住,但是,该测试成功的服务,并且单独的开发计算机上的服务实例实现不 SharePoint 集成 Windows Services 足够版本条件。 SharePoint 3.0 管理中心处理 Windows 服务非常不同于服务器场中的远程计算机上本地计算机上。 本地,SharePoint 3.0 管理中心使用已登录的 SharePoint 管理员,这是很可能具有对服务执行管理操作的所有所需权限的本地管理员的安全上下文。 远程,但是,SharePoint 3.0 管理中心使用计时器作业和 SPTimerV3 服务。 如我之前提到的 SPTimerV3 服务的安全帐户不在远程的计算机本地管理员因此 SPTimerV3 服务使用 SPAdmin 服务执行本地系统帐户的上下文中的该操作。 中,以确保安全上下文的差异不干扰您的 Windows 服务的操作状态,我建议您完全与至少两个前端服务器和一个单独的计算机,在严格的安全配置根据运行 SQL Server 在服务器场环境中测试您的解决方案," Windows SharePoint Services 安全帐户要求"工作表。

设置汇总

您需要解决方案设计和构建 SharePoint 的集成 Windows Services 时, 的安全,但正确 groundwork 给定特别注意,相对 uncomplicated 与 SharePoint 实际的集成。 SharePoint 对象模型已包含提供、 启动、 停止,和取消在 SharePoint 集群中的本地和远程服务器的服务实例在需要逻辑。 您只需要定义相应的服务和服务实例的类将 Windows 服务集成到 SharePoint 配置。 服务和服务的类派生自该 SPPersistedObject 为类这就意味着您可以使用这些类来维护 SharePoint 配置数据库而不是导致改进的可管理性和配置一致性在本地注册表中的直接的服务参数的实例。

总体,齐全的解决方案显示与 SharePoint 无缝集成必须包括 Windows 服务管理工具,以提供必需的服务对象,扩展 SharePoint 3.0 管理中心和 SharePoint 解决方案包来部署除了实际的 Windows 服务在场中的所有服务器上的 SharePoint 组件的应用程序页。 Windows 服务是 Windows 服务器上的重要组件,并且与集成功能在 SharePoint 中可用它们可以假定 SharePoint 环境中的关键功能。 有关详细信息,请参阅 www.microsoft.com/Sharepoint, msdn2.Microsoft.com/Sharepoint, Windows SharePoint Services SDK 文档blogs.msdn.com/Sharepoint.

Pav Cherny 是 IT 专家和擅长 Microsoft 技术协作和统一的通信的作者。 他出版物包括白皮书、 产品手册和联机重点 IT 操作和系统管理。 Pav 是总裁的 Biblioso Corporation,于托管的文档和本地化服务的公司。