了解 SharePoint Server 2013 中的多租户

适用于:yes-img-132013 no-img-162016 no-img-192019 no-img-seSubscription Edition no-img-sopSharePoint in Microsoft 365

本文介绍与 SharePoint Server 2013 中的多租户相关的组件和服务,并提供体系结构、安全性、操作和管理指南,以帮助服务提供商了解 SharePoint Server 2013 中的多租户,以便规划、设计、构建和管理多租户 SharePoint Server 2013 托管平台。

注意

具有Viva Engage集成的 Microsoft OneDrive 不适用于本地部署的多租户或分区服务应用程序。

开始之前

SharePoint Server 2013 中的多租户简介

多租户是什么?

在 SharePoint Server 2013 中介绍多租户功能之前,应了解多租户的一般概念及其相关特征。 了解多租户及其相关特征有助于在规划、设计、操作和管理多租户 SharePoint Server 2013 托管平台时做出适当的决策。

多租户是指管理和分区网站数据以及共享服务或软件以容纳多个租户的功能。 此功能与运行服务的多个实例或设置单独的硬件形成鲜明对比。 在 Microsoft 产品和技术中,服务多租户可创建服务器场资源最大化的托管环境。 在了解托管环境之前,请务必了解服务体系结构。

在 SharePoint Server 2013 中启用多租户的关键组件和服务

此部分介绍了在 SharePoint Server 2013 中启用多租户的关键组件和服务。

Web 应用程序

SharePoint 2013 Web 应用程序由一个 Internet Information Services (IIS) 网站组成,此网站充当您创建的网站集的逻辑管理和安全单元。 每个 Web 应用程序由使用唯一或共享应用程序池的不同 IIS 网站表示。 当您创建 Web 应用程序时,您还可以创建内容数据库并定义用于连接到数据库的身份验证方法。

以主机命名的网站集

以主机命名的网站集使您可以将唯一的 DNS 名称分配到网站集。 例如,您可以将其称为 http://TeamA.contoso.comhttp://TeamB.fabrikam.com。 此预配允许在同一 Web 应用程序中部署许多使用唯一 DNS 名称的网站。 这还使服务提供商可以向许多客户扩展环境。 如果不使用以主机命名的网站集,SharePoint Web 应用程序将包含许多基于路径的网站集,这些网站集 (DNS 名称) 共享相同的主机名。 例如,团队 A 具有位于 https://contoso.com/sites/teamA 的网站集,而团队 B 具有位于 https://fabrikam.com/sites/teamB 的网站集。

从根本上说,以主机命名的网站集是扩展多租户环境的唯一方式,并提供所用 URL 命名空间的最大灵活性。 如果将基于路径的站点与多租户配合使用,则会快速到达托管路径的软件边界。

有关如何规划 SharePoint Server 2013 的以主机命名的网站集的详细信息,请参阅以 主机命名的网站集体系结构和部署 (SharePoint 2013)

服务组(代理组)

服务组(也称为代理组)是一组服务应用程序,为 Web 应用程序选择这些应用程序以使用它们。

默认情况下,所有服务应用程序均包含在默认组中,除非在创建服务应用程序时已指定另一个组。 您可以在默认组中随时添加或删除服务应用程序。 当您创建 Web 应用程序时,您可以选择默认组,或者创建自定义服务组。 您可以通过仅选择您希望 Web 应用程序使用的服务应用程序来创建自定义服务组。

自定义组不能跨多个 Web 应用程序重复使用。 每次在创建 Web 应用程序时选择“自定义”时,你只会为要创建的 Web 应用程序选择服务。

服务代理

创建服务应用程序时,将同时创建服务应用程序的代理。 代理是将 Web 应用程序连接到服务应用程序的虚拟实体。 代理列在 SharePoint 管理中心网站中的"管理服务应用程序"页面。

如果您使用管理中心或 SharePoint 2016 产品配置向导创建服务应用程序,将自动创建代理。 如果使用 Microsoft PowerShell 创建服务应用程序,则代理并不总是自动创建,并且必须使用 Microsoft PowerShell 创建代理。

某些代理可能包含可以更改的设置。 例如,如果 Web 应用程序已连接到 Managed Metadata Service 的多个实例,您必须指明连接到主服务应用程序的代理,主服务应用程序则托管公司分类。 使用多租户时,这些设置将移至租户级别配置。

服务应用程序

服务应用程序是给定服务及其安全和管理配置的逻辑表示形式,用于定义其操作行为。 示例包括 Managed Metadata Service 和 User Profiles Service。 不同的服务应用程序以不同的方式实现,这种灵活性会影响多租户解决方案的设计。

要确定 SharePoint Server 2013 中可用的服务应用程序列表及其在具有多租户功能的 SharePoint 版本之间的可用性,请参阅 SharePoint Server 2013 中主机提供商的一般指导中的 Services and Functionalities 部分

功能包和许可

SharePoint 中的功能包是将范围限定为网站或 Web 的功能分组在一起的一种方式。 对 SharePoint 功能进行分组后,即可将其与网站订阅相关联, (即租户) 。 该网站订阅(租户)中的所有网站集只能使用属于该功能包的范围限定为网站或 Web 的功能。 此功能使服务提供商可以基于不同的功能集提供分层服务。

SharePoint Server 2013 中新增了一项功能,可每用户分配不同的 SharePoint 许可证。 还会启用运行时 SharePoint 许可证检查。 此功能为服务提供商提供了更大的灵活性,可以在整个简化的部署模型中生成不同的服务产品。 在旧版 SharePoint 中,服务提供商必须为每个 SharePoint 版本生成不同的 SharePoint 部署模型。 有关 SharePoint 功能的详细信息,请参阅以下文章的 SharePoint 功能跨本地解决方案的可用性 部分: SharePoint 服务说明

信息权限管理

SharePoint Server 2013 中的信息权限管理集成增加了对多租户的支持,这样即可管理租户级别的信息权限管理设置。

体系结构设计考虑事项

本节介绍构建多租户 SharePoint Server 2013 环境的各种考虑事项。 如本文前面所述,在构建和设计 SharePoint Server 2013 环境时,多租户将结合要考虑的一些独特特性。 您必须基于制定相应决策的要求权衡这些因素。

了解 SharePoint Server 2013 中的边界和限制

了解 SharePoint Server 2013 的软件边界和限制将有助于您在为多租户 SharePoint 环境选择合适的体系结构时制定正确决策。 有关适用于 SharePoint Server 2013 的多租户环境的内容数据库和网站集的关键边界和限制的详细信息,请参阅 SharePoint Server 2016 的软件边界和限制SharePoint Server 2016 的软件边界和限制

共享服务器场与专用服务器场

使用共享服务器场在单个 Web 应用程序上托管多租户网站集可提供比为每个租户使用专用 Web 应用程序更好的可伸缩性。

仅当您需要满足隔离要求时,对每个客户使用专用 Web 应用程序和应用程序池。

不允许将完全信任代码部署到站点。

不允许影响共享资源的自定义,例如 web.config 文件。

使用以主机命名的网站集在 Web 应用程序中创建多个根级别网站集(以域命名的网站)。

一个 Web 应用程序与多个 Web 应用程序

对需要进行自定义(如 web.config 文件)以影响在 Web 应用程序中共享的资源的租户,使用专用 Web 应用程序。

在单个服务器场中组合多个租户时,对所有经过身份验证的内容使用专用 SharePoint Web 应用程序,对所有匿名内容使用单独的专用 Web 应用程序。 对于具有两种类型的内容的租户,此方法需要两个单独的订阅 ID。 此方法还将简化许可。

某些 SharePoint 功能已绑定到 Web 应用程序级别,如自助服务网站集创建设置。 启用后,同一 Web 应用程序下的所有租户都将能够创建网站集。

单一服务器场环境设计

在租户数据和管理隔离的多组织托管环境中,分区服务和共享服务的配置非常重要。 本示例提供分区服务的实际实施,并提供关于如何部署客户网站的建议。

本示例详细说明了在服务器场中部署客户网站的以下方式:

  • 专用应用程序池和 Web 应用程序

  • 共享应用程序池和专用 Web 应用程序

  • 共享 Web 应用程序

    • 经过身份验证的网站

    • 未经过身份验证的网站

仅当您需要满足隔离要求时,对每个客户使用专用应用程序和应用程序池。 对需要进行自定义(如 web.config 文件)以影响在 Web 应用程序中共享的资源的租户,使用专用 Web 应用程序。

在单个 Web 应用程序中组合多个租户时,对所有经过身份验证的内容使用专用 Web 应用程序,对所有匿名内容使用单独的专用 Web 应用程序。 对于具有两种类型的内容的租户,此方法需要两个单独的订阅 ID。 此方法还可以简化许可。

请勿允许对站点部署完全信任代码。

请勿允许影响共享资源的自定义,如 web.config 文件。

在以下示例(经过身份验证的网站)中,对每个公司使用以主机命名的不同网站集。 公司 C 包括两个以主机命名的不同网站集。 在每个以主机命名的顶级网站集下,使用管理路径为网站创建顶级网站集的第二层,例如工作组网站、"My Sites"、发布的 Intranet 内容或单独的部门网站。

分层环境设计

如前所述,在规划多租户 SharePoint Server 2013 托管平台时有很多要考虑的事项,包括成本、简化管理、资源隔离、性能和可伸缩性。

随着客户群增加,您可能会发现在单个环境中难以满足所有客户的要求。 目前,要平衡这些因素,必须进行一些利弊权衡。

在这种情况下,您想要考虑的替代方法是分层环境设计,在此设计中,多个 SharePoint 环境满足客户的不同需求。 每个环境关注服务方案的不同方面,例如低成本、高密度、更高资源隔离度以及以更高成本实现更好的服务质量 (QoS),等等。

此分层环境设计方法可以为客户提供不同的服务级别协议。 因此,您可以为更多客户服务、简化管理和运营、降低管理成本并增加利润。

安全注意事项

本节讨论了规划和设计多租户 SharePoint Server 2013 托管平台时的不同安全考虑事项。 从此以后,讨论人员选取器配置的任何部分(例如组织单位 (OU) 部分)都只能使用 Windows 身份验证 进行进一步自定义。

针对以下身份验证类型,SharePoint Server 2013 支持多种身份验证方法和身份验证提供程序:

  • Windows 身份验证

  • 基于表单的身份验证

  • 基于 SAML 令牌的身份验证

Windows 身份验证类型利用现有的 Windows 身份验证提供程序以及 Windows 域环境使用的身份验证协议来验证进行连接的客户端的凭据。 基于声明的身份验证和经典模式使用的Windows 身份验证方法包括:

  • NTLM

  • Kerberos

  • 摘要

  • 基本

基于表单的身份验证是基于 ASP.NET 成员身份和角色提供程序身份验证的基于声明的标识管理系统。 可以对存储在身份验证提供程序中的凭据使用基于表单的身份验证,例如:

  • Active Directory 域服务 (AD DS)

  • SQL Server 数据库之类的数据库

  • Novell eDirectory、Novell Directory Services (NDS) 或 Sun ONE 等轻型目录访问协议 (LDAP) 数据存储

基于表单的身份验证根据用户在登录表单(通常是一个网页)中输入的凭据验证用户身份。 未经身份验证的请求将重定向到登录页,用户必须在该页中提供有效凭据并提交表单。 系统会为经过身份验证的请求发布一个 Cookie,其中包含用于重建后续请求的标识的项。

若要使用基于表单的身份验证针对不基于 Windows 的标识管理系统或外部标识管理系统对用户进行身份验证,必须在多个 web.config 文件中注册成员资格提供程序和角色管理器。 SharePoint Server 2013 使用标准 ASP.NET 角色管理器界面来收集有关当前用户的组信息。 SharePoint Server 2013中的授权过程会将每个 ASP.NET 角色视为一个域组。 在 web.config 文件中注册角色管理器正如注册用于身份验证的成员身份提供程序一样。

如果要从管理中心网站管理成员身份用户或角色,您必须在管理中心网站的 web.config 文件中注册成员身份提供程序和角色管理器。 同时,还必须在承载内容的 Web 应用程序和安全令牌服务的 web.config 文件中注册成员身份提供程序和角色管理器。

SharePoint Server 2013 中基于 SAML 令牌的身份验证使用 SAML 1.1 协议和 WS 联合身份验证被动请求者配置文件 (WS-F PRP)。 它需要与基于声明的环境(无论是你自己的内部环境还是合作伙伴环境)的管理员进行协调。 如果使用 Active Directory 联合身份验证服务 (AD FS) 2.0,您将具有基于 SAML 令牌的身份验证环境。

对于使用基于声明的身份验证的 Web 应用程序,人员选取器控件在 SharePoint Server 2013 中可用。 人员选取器控件使用声明提供程序列出、解析、搜索和确定用户、组与声明的"友好"显示。 有关人员选取器配置的详细信息,请参阅人员选取器和声明提供程序概述

区域代表用于访问 Web 应用程序中的相同网站的不同逻辑路径。 Each web application can include as many as five zones. When you create a web application, Central Administration creates the zone named Default. 若要创建更多区域,请扩展 Web 应用程序并选择其余区域名称之一: IntranetExtranetInternetCustom

组织单位

组织单位 (OU) 组织 Active Directory 环境中的用户和计算机对象。 为进行托管,可以按下图所示设置组织单位结构。

此图显示了托管环境的组织单元结构

您至少需要将“组策略”链接到“域根”、“域控制器 OU”、“SharePoint 服务器 OU”和“客户 OU”。

域根

适用于整个域的安全将适用于域策略。 这些设置包含在适用于整个域的组策略对象 (GPO) 中。

域控制器 OU

域控制器保存组织中最敏感的数据,数据控制安全配置本身。 适用于此级别的 GPO 用于配置和保护域中的域控制器。

SharePoint 服务器 OU

SharePoint 服务器具有目录中其他服务器不包含的角色。 将这些服务器放在自己的 OU 中将允许唯一策略适用于这些服务器。 它们还可以与目录中的其他服务器分离。 如果必须创建不同的 GPO,可以创建子 OU(例如匿名访问内容服务器与经过身份验证的内容服务器)。

客户 OU

此顶级 OU 使所有用户均可与目录的其余部分分离。 下一级 OU 包含客户 OU。 每个客户都有一个 OU。 此 OU 允许客户的所有用户帐户和计算机帐户与其他客户的这些帐户分开。 此外,此 OU 结构是支持多租户部署中的用户配置文件同步所必需的。

若要让用户印象是登录到自己的自定义域,请使用 Active Directory 服务接口编辑器 (ADSI 编辑) 或其他 AD 工具编辑每个客户 OU 的 uPNSuffixes 属性,如下图所示。

此图显示了 uPNSuffixes 属性的 ADSI 属性编辑器对话框

配置客户 OU 的 uPNSuffixes 属性后,其值将可以与该客户 OU 的用户帐户相关联,如下图中所示。

此图显示了允许您创建新用户的新对象对话框

用户身份验证

用户身份验证可根据身份验证提供程序验证用户的身份,身份验证提供程序是包含用户凭据且可以确认用户正确提交了这些凭据的目录或数据库。 Active Directory 域服务 (AD DS) 是身份验证提供程序的一个示例。 身份验证提供程序的其他通用名称包括用户目录属性存储

身份验证方法是声明用户身份的帐户凭据和其他信息的特定交换。 身份验证方法的结果是一种通常采用令牌形式的证明,其中包含指明身份验证提供程序已对用户进行身份验证的声明。

身份验证类型是针对一个或多个身份验证提供程序验证凭据的特定方法,有时使用行业标准协议。 身份验证类型可以使用多种身份验证方法。

在验证用户身份后,授权过程将确定用户可以访问的网站、内容和其他功能。

规划用户身份验证类型和方法时应确定以下术语:

  • 每个 Web 应用程序和区域的用户身份验证类型和方法。

  • 支持既定身份验证类型和方法所需的身份验证基础结构。

  • 如何迁移使用经典模式身份验证的当前 Web 应用程序和区域以使用基于声明的身份验证。

Active Directory 联合身份验证服务 (AD FS)

SharePoint Server 2013 支持基于声明的身份验证。 Active Directory 联合身份验证服务 (AD FS) 可以配置为作用于 SharePoint Server 2013 Web 应用程序的标识提供程序安全令牌服务 (IP-STS)。 在此配置中,AD FS 颁发由声明组成的基于 SAML 的安全令牌,以便客户端计算机可访问使用基于声明的身份验证的 Web 应用程序。 可以使用标识提供者作为 AD FS 的替代项。 但它必须支持 WS-Federation 标准。 另外,使用 AD FS 配置时需要自定义代码。

有关如何使用 AD FS for SharePoint Server 2013 配置基于 SAML 的声明身份验证的详细信息,请参阅 在 SharePoint Server 中使用 AD FS 配置基于 SAML 的声明身份验证

管理和运营考虑事项

此部分介绍了多租户 SharePoint Server 2013 环境的不同管理和运营注意事项。

容量管理

由于任何实现的内容和用途都不会静止不变,因此容量管理是一个持续的过程。 用户需要针对增长和变化进行规划,以便 SharePoint Server 2013 环境可以持续提供有效的业务解决方案。 有关 SharePoint Server 2013 中的容量管理的详细信息,请参阅 SharePoint Server 2013 的容量管理和大小调整概述

应用管理

SharePoint 相关应用程序提供了一种向 SharePoint 网站交付特定信息或功能的全新方法。 SharePoint 相关应用程序是一种小型且易于使用的独立应用程序,可满足特定的最终用户或业务需求。 网站所有者可以从公共 SharePoint 商店或其组织的内部应用程序目录中发现和下载 SharePoint 相关应用程序,并将它们安装在自己的 SharePoint 网站中。 这些 SharePoint 相关应用程序将最佳网站内容与 SharePoint Server 2013 集成。 它们不会替换自定义或增加 SharePoint 网站的 SharePoint 功能和解决方案包。 与服务器场或网站集管理员必须安装的功能和解决方案不同,SharePoint 相关应用程序是网站所有者可添加到自己的 SharePoint 网站中的独立应用程序。 SharePoint 相关应用程序拥有简单的生命周期,可由网站所有者进行安装、升级和卸载。

SharePoint Server 2013 中的 App Management Service 为多租户感知。 大部分应用程序配置和管理功能通过租户管理网站暴露,并允许每个租户管理员配置自己的设置。

备份和还原

在多租户 SharePoint Server 2013 托管平台上执行租户不可知的备份和还原操作时,您可以按照一般指导在 SharePoint Server 2013 环境中执行备份和还原操作,请参阅SharePoint Server 中的备份和还原

请注意,在 SharePoint Server 2013 中,工作流平台与 SharePoint 平台是分开的。 因此,工作流程管理器上的备份和还原操作应与 SharePoint 备份和还原操作相协调,以确保两者相互保持同步。 有关如何规划工作流Service Manager的备份和还原操作的更多指导,请参阅 工作流管理器 1.0 中的灾难恢复和范围还原

在多租户 SharePoint Server 2013 托管平台上执行租户特定的备份与还原操作时,您必须将以下租户感知组件保持同步:服务应用程序、工作流、内容数据库和网站集。

服务应用程序

在分区模式下配置的服务应用程序与一个或多个包含租户特定数据的关联数据库。 您可以在这些服务应用程序的应用程序级别和数据库级别执行常规备份与还原操作,但存在限制命令以在服务应用程序或数据库上执行租户特定的详细备份与还原操作。

服务应用程序考虑事项

App Management Service

App Management Service 是用于管理 SharePoint Server 2013 中引入的 SharePoint 相关应用程序功能的服务应用程序。 SharePoint 相关应用程序提供了一种向 SharePoint 网站交付特定信息或功能的全新方法。 SharePoint 相关应用程序是一种小型且易于使用的独立应用程序,可满足特定的最终用户或业务需求。 应用管理服务不支持分区模式,但它本身是站点订阅感知模式。 在多租户 SharePoint 环境中,大部分 App Management 功能(即管理应用程序目录、管理应用程序许可证、应用程序权限等)可通过租户管理网站获取。

下图显示了租户管理网站上的 App Management。

此图显示了 App Management 的租户管理网站

Business Data Connectivity Service

在分区模式下配置后,Business Data Connectivity 服务的所有配置将迁移到租户管理。 但是,租户管理网站模板不包括指向此页面的链接,可以使用扩展租户管理网站模板部分中的自定义技术添加该链接

Secure Store service

在分区模式中配置后,加密密钥生成仍为通过管理中心或 Windows PowerShell 执行的服务器场级别配置。 其余的 Secure Store Service 配置将迁移到租户管理。 但是,租户管理网站模板不包括此页面的链接,可以使用扩展租户管理网站模板部分中的自定义技术添加该链接。

托管的元数据服务

在分区模式中配置后,所有配置将迁移到租户管理,默认情况下已启用内容类型发布。

Search Service

与函数相关的很多租户特定搜索配置将暴露在租户管理中,如下图所示。

此图显示了位于租户管理网站上的搜索管理功能

注意

许多 *。EnterpriseSearch* Microsoft PowerShell cmdlet 现在具有分区感知功能,可用于自动执行租户管理站点中公开的某些配置和管理功能。

User Profile Service

大量的配置元素将迁移到租户管理,但是配置文件同步的很多配置仍位于服务器场级别且适用于所有租户,如下图所示。

此图说明了用户配置文件配置

工作流

如前所述,在 SharePoint Server 2013 中,工作流平台与 SharePoint 平台是分开的。 工作流平台本身使用一个或多个数据库。 可以在这些数据库上执行常规数据库级备份和还原操作,但没有在这些工作流数据库上执行租户专属备份和还原操作的命令或实用工具。

内容数据库

如果租户具有一个或多个专用内容数据库的独占使用权限,您可以在这些数据库上执行常规数据库级别备份与还原操作。

注意

[!注意] 对一个或多个专用内容数据库具有独占使用权限无法通过使用标准产品功能实现,例如自助服务网站创建。 下面举例说明为满足特定服务级别产品而进行的自定义示例。

以下 Microsoft PowerShell 脚本显示如何在租户内容数据库上执行初始备份操作。

Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
Backup-SPFarm -Directory "c:\backups\alpha" -Item "HostingFarm_Content_Hosting" -BackupMethod Full
Write-Host "Tenant Content Database Backup Script Completed!"
The following Windows PowerShell script shows how to perform a restore operation on a tenant site collection:
Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
Restore-SPFarm -Directory "c:\backups\alpha" -Item "HostingFarm_Content_Hosting" -RestoreMethod Overwrite
Write-Host "Tenant Content Database Restore Script Completed!"

网站集

您可以在租户网站集上执行备份与还原操作。 您选择使用的工具取决于网站集本身的大小。 Microsoft PowerShell cmdlet 是中小型网站集的对应选项。

以下 Microsoft PowerShell 脚本显示如何在租户网站集上执行备份操作。

Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
Backup-SPSite -Identity "http://alpha.contoso.com" -Path "c:\backups\alpha\root.bak" -UseSqlSnapshot
Write-Host "Tenant Site Collection Backup Script Completed!"
The following script shows how to perform a restore operation on a tenant site collection:
Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
Restore-SPSite -Identity "http://alpha.contoso.com" -Path "c:\backups\alpha\root.bak" -DatabaseServer "SQLServer01" -DatabaseName "HostingFarm_Content_Hosting" -HostHeaderWebApplication "http://$ENV:COMPUTERNAME" -GradualDelete - Confirm: $false -Force
Write-Host "Tenant Site Collection Restore Script Completed!"

监视

有许多工具可用于监视 SharePoint Server 2013 并解决问题。 不同的工具涵盖环境的不同方面,尽管可能存在重叠的区域。 考虑可最大程度增加监视好处的工具。 有关如何规划 SharePoint Server 2013 监视的更多指南,请参阅 在 SharePoint Server 中规划监视

功能包管理

如前所述,功能包可用于将不同的功能分组在一起,并将其与网站订阅(即租户)相关联。 该网站订阅(租户)中的所有网站集只能使用属于该功能包的范围限定为网站或 Web 的功能。 此功能使服务提供商可以基于不同的功能集提供分层服务。 创建使用 New-SPSiteSubscriptionFeaturePack cmdlet 创建功能包容器的功能包,以及使用 Add-SPSiteSubscriptionFeaturePackMember cmdlet 将各个功能添加到容器的功能包。

以下 Microsoft PowerShell 脚本显示如何创建表示 SharePoint Foundation 2013 功能的租户级别功能包,并将功能包 ID 存储在服务器场的属性包中。

注意

必须存在 Subscription Settings Service 应用程序,然后才能执行使用功能包的脚本。

<#
   Feature Packs.ps1
    Creates a new Feature Pack comprised of SharePoint Foundation 2013 Features
    Adds the Feature Pack ID with a friendly name to the Farm's Property Bag for future use.
    
#>
asnp Microsoft.SharePoint.PowerShell
# Create an alias for Add-SPSiteSubscriptionFeaturePackMember 
Set-Alias AddFeature Add-SPSiteSubscriptionFeaturePackMember
# create a new feature pack, and store it in the Farm's Property Bag
$ffp = New-SPSiteSubscriptionFeaturePack
$farm = Get-SPFarm
$farm.Properties.Add("Foundation_FeaturePack", $ffp.Id);
$farm.Update();
# add foundation features to the feature pack
# web scoped features...
AddFeature -identity $ffp -FeatureDefinition  XmlFormLibrary
AddFeature -identity $ffp -FeatureDefinition  LinksList
AddFeature -identity $ffp -FeatureDefinition  WorkflowProcessList
AddFeature -identity $ffp -FeatureDefinition  GridList
AddFeature -identity $ffp -FeatureDefinition  WorkflowHistoryList
AddFeature -identity $ffp -FeatureDefinition  TeamCollab
AddFeature -identity $ffp -FeatureDefinition  GanttTasksList
AddFeature -identity $ffp -FeatureDefinition  PictureLibrary
AddFeature -identity $ffp -FeatureDefinition  IssuesList
AddFeature -identity $ffp -FeatureDefinition  DiscussionsList
AddFeature -identity $ffp -FeatureDefinition  ContactsList
AddFeature -identity $ffp -FeatureDefinition  ExternalList
AddFeature -identity $ffp -FeatureDefinition  TasksList
AddFeature -identity $ffp -FeatureDefinition  WebPageLibrary
AddFeature -identity $ffp -FeatureDefinition  AnnouncementsList
AddFeature -identity $ffp -FeatureDefinition  WikiPageHomePage
AddFeature -identity $ffp -FeatureDefinition  CustomList
AddFeature -identity $ffp -FeatureDefinition  DocumentLibrary
AddFeature -identity $ffp -FeatureDefinition  SurveysList
AddFeature -identity $ffp -FeatureDefinition  EventsList
AddFeature -identity $ffp -FeatureDefinition  DataSourceLibrary
AddFeature -identity $ffp -FeatureDefinition  NoCodeWorkflowLibrary
AddFeature -identity $ffp -FeatureDefinition  OsrvLinks
AddFeature -identity $ffp -FeatureDefinition  FCGroupsList
AddFeature -identity $ffp -FeatureDefinition  TenantAdminBDC
AddFeature -identity $ffp -FeatureDefinition  OssNavigation
AddFeature -identity $ffp -FeatureDefinition  IMEDicList
AddFeature -identity $ffp -FeatureDefinition  CallTrackList
AddFeature -identity $ffp -FeatureDefinition  SSSvcAdmin
AddFeature -identity $ffp -FeatureDefinition  MpsWebParts
AddFeature -identity $ffp -FeatureDefinition  GBWWebParts
AddFeature -identity $ffp -FeatureDefinition  FacilityList
AddFeature -identity $ffp -FeatureDefinition  ScheduleList
AddFeature -identity $ffp -FeatureDefinition  ObaProfilePages
AddFeature -identity $ffp -FeatureDefinition  GBWProvision
AddFeature -identity $ffp -FeatureDefinition  OSSSearchSearchCenterUrlFeature
AddFeature -identity $ffp -FeatureDefinition  WikiWelcome
AddFeature -identity $ffp -FeatureDefinition  MaintenanceLogs
AddFeature -identity $ffp -FeatureDefinition  TenantAdminLinks
AddFeature -identity $ffp -FeatureDefinition  HolidaysList
AddFeature -identity $ffp -FeatureDefinition  GroupWork
AddFeature -identity $ffp -FeatureDefinition  WhereaboutsList
AddFeature -identity $ffp -FeatureDefinition  CirculationList
AddFeature -identity $ffp -FeatureDefinition  TenantAdminSecureStore
AddFeature -identity $ffp -FeatureDefinition  SearchAdminWebParts
AddFeature -identity $ffp -FeatureDefinition  ObaSimpleSolution
AddFeature -identity $ffp -FeatureDefinition  TimecardList
AddFeature -identity $ffp -FeatureDefinition  WhatsNewList
AddFeature -identity $ffp -FeatureDefinition  MobilityRedirect
AddFeature -identity $ffp -FeatureDefinition  AdminLinks
AddFeature -identity $ffp -FeatureDefinition  SearchCenterLiteFiles
AddFeature -identity $ffp -FeatureDefinition  CorporateCatalog
AddFeature -identity $ffp -FeatureDefinition  BlogContent
AddFeature -identity $ffp -FeatureDefinition  PromotedLinksList
AddFeature -identity $ffp -FeatureDefinition  AppLockdown
AddFeature -identity $ffp -FeatureDefinition  AppRequestsList
AddFeature -identity $ffp -FeatureDefinition  SearchCenterUpgrade
AddFeature -identity $ffp -FeatureDefinition  SearchConfigFields
AddFeature -identity $ffp -FeatureDefinition  PhonePNSubscriber
AddFeature -identity $ffp -FeatureDefinition  SearchConfigContentType
AddFeature -identity $ffp -FeatureDefinition  GettingStarted
AddFeature -identity $ffp -FeatureDefinition  GettingStartedWithAppCatalogSite
AddFeature -identity $ffp -FeatureDefinition  ExternalSubscription
AddFeature -identity $ffp -FeatureDefinition  SearchCenterFiles
AddFeature -identity $ffp -FeatureDefinition  BcsEvents
AddFeature -identity $ffp -FeatureDefinition  OfficeExtensionCatalog
AddFeature -identity $ffp -FeatureDefinition  MDSFeature
AddFeature -identity $ffp -FeatureDefinition  TenantSearchAdmin
AddFeature -identity $ffp -FeatureDefinition  SiteAssets
AddFeature -identity $ffp -FeatureDefinition  PremiumSearchVerticals
AddFeature -identity $ffp -FeatureDefinition  AccessRequests
AddFeature -identity $ffp -FeatureDefinition  SearchConfigList
AddFeature -identity $ffp -FeatureDefinition  ReportAndDataSearch
AddFeature -identity $ffp -FeatureDefinition  MBrowserRedirect
AddFeature -identity $ffp -FeatureDefinition  BlogHomePage
AddFeature -identity $ffp -FeatureDefinition  SearchConfigListTemplate
AddFeature -identity $ffp -FeatureDefinition  SiteNotebook
AddFeature -identity $ffp -FeatureDefinition  HierarchyTasksList
AddFeature -identity $ffp -FeatureDefinition  BlogSiteTemplate
AddFeature -identity $ffp -FeatureDefinition  SearchCenterLiteUpgrade
# Site Scoped features...                                                                                                                                                                                               
AddFeature -identity $ffp -FeatureDefinition  BasicWebParts
AddFeature -identity $ffp -FeatureDefinition  OSSSearchEndUserHelpFeature
AddFeature -identity $ffp -FeatureDefinition  HelpLibrary
AddFeature -identity $ffp -FeatureDefinition  OfficeWebApps
AddFeature -identity $ffp -FeatureDefinition  WordServerViewing
AddFeature -identity $ffp -FeatureDefinition  OnenoteServerViewing
AddFeature -identity $ffp -FeatureDefinition  SiteHelp
AddFeature -identity $ffp -FeatureDefinition  ctypes
AddFeature -identity $ffp -FeatureDefinition  OSSSearchSearchCenterUrlSiteFeature
AddFeature -identity $ffp -FeatureDefinition  OpenInClient
AddFeature -identity $ffp -FeatureDefinition  ExcelServerEdit
AddFeature -identity $ffp -FeatureDefinition  AdminReportCore
AddFeature -identity $ffp -FeatureDefinition  fields
AddFeature -identity $ffp -FeatureDefinition  SearchServerWizardFeature
AddFeature -identity $ffp -FeatureDefinition  OSearchHealthReports
AddFeature -identity $ffp -FeatureDefinition  SearchWebParts
AddFeature -identity $ffp -FeatureDefinition  IssueTrackingWorkflow
AddFeature -identity $ffp -FeatureDefinition  ShareWithEveryone
AddFeature -identity $ffp -FeatureDefinition  MonitoredApps
AddFeature -identity $ffp -FeatureDefinition  SearchTaxonomyRefinementWebParts
AddFeature -identity $ffp -FeatureDefinition  SearchTaxonomyRefinementWebPartsHtml
AddFeature -identity $ffp -FeatureDefinition  SearchMaster
AddFeature -identity $ffp -FeatureDefinition  EnableAppSideLoading
AddFeature -identity $ffp -FeatureDefinition  Developer
AddFeature -identity $ffp -FeatureDefinition  AutohostedAppLicensing
AddFeature -identity $ffp -FeatureDefinition  AppRegistration
Write-Host "Feature Pack Created! " + $ffp.ID

许可管理

在 SharePoint Server 2013 中已添加一项新的许可管理功能。 服务器场管理员现在可以将许可证分配给用户并进行运行时许可检查。 通过这一新功能,可以确保只有拥有适当许可的用户才能使用特定功能。 此功能还会简化部署模型,因为您不再需要为 SharePoint Server 标准和企业版本构建单独的服务器场。

用户许可证是通过将声明映射到已知类型的许可证进行分配的。 通过将 ContosoFinanceDept 安全组映射到"企业版"许可证,可为该组的所有成员分配企业版许可证。 可为登录到 SharePoint Server 的用户分配声明。 SharePoint Server 会检查用户的声明以确定其许可。 SharePoint Server 检查用户的声明以确定其许可证,如果用户没有使用特定功能的许可证,SharePoint 将在运行时阻止访问该功能。

此 SharePoint Server 2013 许可证实施使用新的 Microsoft PowerShell cmdlet 进行管理。 默认情况下在 SharePoint Server 中禁用许可功能。 但是管理员可以选择使用 Microsoft PowerShell 将其启用。 有关如何在 SharePoint Server 2013 中配置许可的详细信息,请参阅 在 SharePoint Server 中配置许可

生命周期管理

本白皮书概述了设计多租户 SharePoint 2013 解决方案时的关键基础结构考虑事项,并提供了基本配置脚本,但操作生命周期的整体管理仍然非常重要。 例如,自定义租户管理、取消预配订阅、存档、用户管理、自助式密码重置和配额都是常见领域,它们需要结合更多Windows PowerShell和自定义工作才能提供完整的服务产品。 每个服务提供商在此领域都有不同的要求,确保这些要求是基础结构平台的初始范围和设计工作的一部分非常重要。

设置和配置

此部分概述了安装和配置多租户 SharePoint Server 2013 托管平台的常规步骤。

鸣谢

本节提供了详细信息,并包含演示各个组件创建与配置的 PowerShell 脚本。 提供这些脚本是为了演示多租户的配置要求,因此不表示最佳预配顺序,但它们可以作为开发自己的自定义端到端脚本解决方案的基础。

以下子部分中包含的 Microsoft PowerShell 脚本基于 (spencer Harbar () http://www.harbar.net 工作的完整或部分) ,并在此经过他亲切的同意转载。 有关 Spencer Harbar 的原始工作的详细信息,请参阅以下文档:

提供的 PowerShell 脚本包含变量,可以根据自己环境的需求进行修改。

部署实例

本部分提供一个部署示例,该示例使用名为网站集的主机和主机标头托管路径的单个托管 Web 应用程序。 为了简单起见,它部署在单个服务器上。 此部署示例是 SharePoint 2013 的多租户的预期设计模型,可以扩展到跨多台计算机阐明服务实例角色的部署。 此部署示例对 Web 应用程序使用 HTTP。 在实际部署中,SSL 应用于保护用于 SharePoint 应用程序和其他 OAuth2 相关服务的登录、内容和授权令牌,例如工作流管理器。

DNS 配置

因为以主机命名的网站集将用于多租户 SharePoint 环境,因此您必须根据您的计划相应配置 DNS(即创建对应的 DNS 记录等)。 有关如何为 SharePoint Server 2013 规划以主机命名的网站集的更多指南,请参阅以 主机命名的网站集体系结构和部署 (SharePoint 2013)

如果您还计划支持 SharePoint 相关应用程序,您还必须将 DNS 配置为支持您的环境。 有关如何为 SharePoint Server 2013 配置应用环境的详细信息,请参阅 为 SharePoint Server 配置应用程序环境

Active Directory 配置

如前所述,要在 SharePoint 中支持多租户,必须通过创建分层组织单位结构为每个订阅支持用户配置文件同步,来正确构建 Active Directory。 您还必须为您的环境创建相应的服务帐户。 有关如何为 SharePoint Server 2013 计划服务帐户的详细信息,请参阅 在 SharePoint Server 中规划管理和服务帐户。 在此部署示例中,使用以下三个服务帐户:

  • SPFarm - SharePoint 服务器场帐户

  • SPServices - 承载服务应用程序终结点的应用程序池标识

  • SPContent - 托管内容 Web 应用程序的应用程序池标识

SharePoint 服务器场创建和配置

以下 Microsoft PowerShell 脚本显示如何创建 SharePoint 服务器场。

<#
    1. Farm Creation.ps1
    Creates a new SharePoint Farm
    Creates Central Administration on Port 8080
    Update initial variables as needed to reflect your environment
    Script will prompt for the password of the farm account
#>
asnp Microsoft.SharePoint.PowerShell
$databaseServer = "SQLSP1"
$configDatabase = "HostingFarm_Config"
$adminContentDB = "HostingFarm_Content_Admin"
$passphrase = "Password1"
$farmAccountName = "FABRIKAM\spfarm"
  
$farmAccount = Get-Credential $farmAccountName
$passphrase = (ConvertTo-SecureString $passphrase -AsPlainText -force)
Write-Host "Creating Configuration Database and Central Admin Content Database..."
New-SPConfigurationDatabase -DatabaseServer $databaseServer -DatabaseName $configDatabase `
    -AdministrationContentDatabaseName $adminContentDB `
    -Passphrase $passphrase -FarmCredentials $farmAccount
    
$spfarm = Get-SPFarm -ErrorAction SilentlyContinue -ErrorVariable err        
if ($spfarm -eq $null -or $err) {
   throw "Unable to verify farm creation."
}
Write-Host "ACLing SharePoint Resources..."
Initialize-SPResourceSecurity
Write-Host "Installing Services ..."
Install-SPService   
Write-Host "Installing Features..."
Install-SPFeature -AllExistingFeatures
Write-Host "Creating Central Administration..."              
New-SPCentralAdministration -Port 8080 -WindowsAuthProvider NTLM
Write-Host "Installing Help..."
Install-SPHelpCollection -All        
Write-Host "Installing Application Content..."
Install-SPApplicationContent
Write-Host "Farm Creation Done!" 

代理组、托管 Web 应用程序和管理路径

最初,为托管内容 Web 应用程序的应用程序池创建托管帐户。 创建一个新的代理组,然后创建 Web 应用程序。 最后,执行 Web 应用程序配置,以允许自助网站创建和共享管理路径创建。 必须在托管 Web 应用程序中创建“根”网站集,即使最终用户不会访问此网站集。 此“根”网站集是 SharePoint 2013 的可支持性和正确操作行为所必需的。

注意

此示例对 Web 应用程序使用 HTTP。

<#
    2. Proxy Group, Web Application &amp; Farm Settings.ps1
    Creates a new Managed Account
    Creates a new Proxy Group
    Creates a new Web Application for HNSC, in a new Application Pool, in the new Proxy Group
    Creates an empty root Site Collection
    Enables Self Service Site Creation
    Creates Managed Paths for HNSC
    
    Update initial variables as needed to reflect your environment
    Update the Managed Paths section to use the paths you need
    Script will prompt for the password of the App Pool account used for the Web App
    You will need to configure the SSL certificate manually or via IIS PowerShell
#>
asnp Microsoft.SharePoint.PowerShell
## UPDATE THESE VARS ##
$waAppPoolUserName = "FABRIKAM\spcontent"
$waAppPoolName = "SharePoint Hosting"
$proxyGroupName = "Hosting Proxy Group"
$waUrl = "http://$ENV:COMPUTERNAME"
$webAppName = "SharePoint Hosting"
$contentDBName = "HostingFarm_Content_Hosting"
$ownerEmail = "administrator@contoso.com"
$ownerAlias = "FABRIKAM\administrator"
## END VARS ##
# Create Managed Account
Write-Host "Please supply the password for the $waAppPoolUserName Account..."
$appPoolCred = Get-Credential $waAppPoolUserName
Write-Host "Creating Managed Account..."
$waAppPoolAccount = New-SPManagedAccount -Credential $appPoolCred
# Create a new Proxy Group
Write-Host "Creating Proxy Group..."
$proxyGroup = New-SPServiceApplicationProxyGroup -Name $proxyGroupName
# Create a new Web App in the new Proxy Group using Windows Claims on Port 80 with no host header
Write-Host "Creating Web Application..."
# SSL example, not used
#$webApp = New-SPWebApplication -ApplicationPool $waAppPoolName -ApplicationPoolAccount $waAppPoolAccount -Name $webAppName -Port 443 -SecureSocketsLayer:$true -AuthenticationProvider (New-SPAuthenticationProvider) -DatabaseName $contentDBName -ServiceApplicationProxyGroup $proxyGroup
# following line is to use port 80
$webApp = New-SPWebApplication -ApplicationPool $waAppPoolName -ApplicationPoolAccount $waAppPoolAccount -Name $webAppName -Port 80 -AuthenticationProvider (New-SPAuthenticationProvider) -DatabaseName $contentDBName -ServiceApplicationProxyGroup $proxyGroup 
# Create a empty root Site Collection, required for support and SSSC
Write-Host "Creating empty root Site Collection..."
New-SPSite -Url $waUrl -owneralias $ownerAlias -ownerEmail $ownerEmail
# Enable Self Service Site Creation 
Write-Host "Enabling Self Service Site Creation..."
$webApp.SelfServiceSiteCreationEnabled = $true
$webApp.RequireContactForSelfServiceSiteCreation = $false
$webApp.Update()
# Create Managed Paths for all 2013 Tenancy capabilities (remove the ones you don't want)
# the default /sites path is removed to prevent creation of sites from CA
Write-Host "Creating HNSC Managed Paths..."
Remove-SPManagedPath "sites" -WebApplication $webApp -Confirm:$false
New-SPManagedPath "admin" -HostHeader -Explicit # Tenant Administration
New-SPManagedPath "apps" -HostHeader -Explicit  # App Catalog
New-SPManagedPath "cthub" -HostHeader -Explicit # Content Type Hub
New-SPManagedPath "my" -HostHeader -Explicit    # MySite Host
New-SPManagedPath "my/sites" -HostHeader        # MySites
New-SPManagedPath "edisc" -HostHeader -Explicit # E-Discovery Hub
Write-Host "Proxy Group and Web Application done!"

非分区服务

在此阶段,可以创建非分区服务应用程序。 这些服务应用程序要么在服务器场中需要正常操作 (例如 State Service) ,要么不需要分区来支持多租户,因为它们不存储任何数据。 为此,需要另一个托管帐户,然后依次创建每个服务应用程序。

以下 Microsoft PowerShell 脚本显示如何创建非分区服务应用程序。

<#
    3. Non Partitioned Services.ps1
    Creates a new Managed Account
    Creates a new Service Application Pool
    
    Starts the Service Instances for and creates non partitioned Service Applications and Proxies:
        State Service
        Usage and Health Data Collection Service
        Subscription Settings Service
        App Management Service
        Work Management Service
    ...in the new Proxy Group 
    Adds any configured Workflow Service Proxy to the new Proxy Group
    Update initial variables as needed to reflect your environment
    Script will prompt for the password of the Service Application Pool account
    
#>
asnp Microsoft.SharePoint.PowerShell
## UPDATE THESE VARS ##
$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$saAppPoolUserName = "FABRIKAM\spservices"
# Service Application and DB names
$stateName = "State Service"
$stateDBName = "HostingFarm_StateService"
$usageName = "Usage and Health Data Collection Service"
$usageDBName = "HostingFarm_Usage"
$subsName = "Subscription Settings Service"
$subsDBName = "HostingFarm_SubscriptionSettings"
$appsName = "App Management Service"
$appsDBName = "HostingFarm_AppManagement"
$wmsName = "Work Management Service"
$pasName = "PowerPoint Automation Service"
## END VARS ##
# Create Managed Account and App Pool for Service App Endpoints
Write-Host "Please supply the password for the $saAppPoolUserName Account..."
$appPoolCred = Get-Credential $saAppPoolUserName
Write-Host "Creating Managed Account..."
$saAppPoolAccount = New-SPManagedAccount -Credential $appPoolCred
Write-Host "Creating Service Application Pool..."
$saAppPool = New-SPServiceApplicationPool -Name $saAppPoolName -Account $saAppPoolAccount
# Grab the Proxy Group
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Create State Service Application and Proxy, add to Proxy Group
Write-Host "Creating $stateName Application and Proxy..."
$stateDB = New-SPStateServiceDatabase -Name $stateDBName
$state = New-SPStateServiceApplication -Name $stateName -Database $stateDB
$proxy = New-SPStateServiceApplicationProxy -Name "$stateName Proxy" -ServiceApplication $state
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Create Usage Service Application and Proxy, add to Proxy Group, and provision it's Proxy
Write-Host "Creating $usageName Application and Proxy..."
$serviceInstance = Get-SPUsageService
New-SPUsageApplication -Name $usageName -DatabaseName $usageDBName -UsageService $serviceInstance
$proxy = Get-SPServiceApplicationProxy | ? { $_.TypeName -eq "Usage and Health Data Collection Proxy" }
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
$proxy.Provision();
# Start the Subscription Settings Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $subsName Application and Proxy..."
Get-SPServiceInstance | where { $_.TypeName -eq "Microsoft SharePoint Foundation Subscription Settings Service" } | Start-SPServiceInstance
$subs = New-SPSubscriptionSettingsServiceApplication -ApplicationPool $saAppPool -Name $subsName -DatabaseName $subsDBName
$proxy = New-SPSubscriptionSettingsServiceApplicationProxy -ServiceApplication $subs 
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Start the App Management Service Instance, create the  Service Application and Proxy, add to Proxy Group
Write-Host "Creating $appsName Application and Proxy..."
Get-SPServiceInstance | where { $_.TypeName -eq "App Management Service"} | Start-SPServiceInstance
$apps = New-SPAppManagementServiceApplication -ApplicationPool $saAppPool -Name $appsName -DatabaseName $appsDBName
$proxy = New-SPAppManagementServiceApplicationProxy -ServiceApplication $apps -Name "$appsName Proxy"
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Start the Work Management Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $wmsName Application and Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Work Management Service" } | Start-SPServiceInstance
$wms = New-SPWorkManagementServiceApplication -ApplicationPool $saAppPool -Name $wmsName
$proxy = New-SPWorkManagementServiceApplicationProxy -ServiceApplication $wms -Name "$wmsName Proxy"
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Start the PowerPoint Automation Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $pasName Application and Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "PowerPoint Conversion Service" } | Start-SPServiceInstance
$pas = New-SPPowerPointConversionServiceApplication -ApplicationPool $saAppPool -Name $pasName
$proxy = New-SPPowerPointConversionServiceApplicationProxy -ServiceApplication $pas -Name "$pasName Proxy"
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Adds any Workflow Service proxy to the Proxy Group (if it exists)
$wfProxy = Get-SPServiceApplicationProxy | ? {$_.TypeName -like "*Workflow Service*" }
if ($wfProxy -ne $null) {
    Write-Host "Adding Workflow Service Proxy to Proxy Group..."
    # should probably remove from the default group as well
    Add-SPServiceApplicationProxyGroupMember -Identity $proxyGroup -Member $wfProxy
}
Write-Host "Non Partitioned Service Applications done!"

分区服务应用程序创建和配置

以下部分介绍创建和配置支持分区的每个服务应用程序所需的 Microsoft PowerShell 过程。 除搜索和用户配置文件外,相同的常规模式适用于每个服务应用程序。 但是存在与服务应用程序代理相关的一些细微区别。

Business Data Connectivity Service

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Business Data Connectivity Service 应用程序,并将其添加到自定义服务代理组。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$bcsName = "Business Data Connectivity Service"
$bcsDBName = "HostingFarm_BusinessDataConnectivity"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start Business Data Connectivity Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $bcsName Application and Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Business Data Connectivity Service" } | Start-SPServiceInstance
$bcs = New-SPBusinessDataCatalogServiceApplication -PartitionMode -Name $bcsName -ApplicationPool $saAppPool -DatabaseName $bcsDBName 
$proxy = Get-SPServiceApplicationProxy | ? { $_.Name -eq "$bcsName" }
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy

托管的元数据服务

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Managed Metadata Service 应用程序,并将其添加到自定义服务代理组。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$mmsName = "Managed Metadata Service"
$mmsDBName = "HostingFarm_ManagedMetadata"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start the Managed Metadata Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $mmsName Application and Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Managed Metadata Web Service" } | Start-SPServiceInstance
$mms = New-SPMetadataServiceApplication -PartitionMode -Name $mmsName -ApplicationPool $saAppPool -DatabaseName $mmsDBName
$proxy = New-SPMetadataServiceApplicationProxy -PartitionMode -Name "$mmsName Proxy" -ServiceApplication $mms
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy

Machine Translation Service

Machine Translation Service 通过在分区模式下创建服务应用程序支持多租户。 没有特定于租户的配置,服务在服务器场级别进行管理。 其数据库实际上充当队列,因此必须具有分区/租户感知功能。

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Machine Translation Service 应用程序。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$mtsName = "Machine Translation Service"
$mtsDBName = "HostingFarm_MachineTranslation"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start Machine Translation Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $mtsName Application &amp; proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Machine Translation Service" } | Start-SPServiceInstance
$mts = New-SPTranslationServiceApplication -PartitionMode -Name $mtsName -ApplicationPool $saAppPool -DatabaseName $mtsDBName
Get-SPServiceApplicationProxy | ? {$_.Name -eq $mtsName} | Remove-SPServiceApplicationProxy -Confirm:$false
$proxy = New-SPTranslationServiceApplicationProxy -PartitionMode -Name "$mtsName Proxy" -ServiceApplication $mts
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy

Secure Store service

在分区模式中配置后,加密密钥生成仍为通过管理中心或 Windows PowerShell 执行的服务器场级别配置。 其余的 Secure Store Service 配置将迁移到租户管理。 但是,租户管理网站模板不包含指向此页面的链接,可以使用扩展租户管理网站模板部分中的自定义技术添加该链接。

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Secure Store Service 应用程序,并将其添加到自定义服务代理组。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$sssName = "Secure Store Service"
$sssDBName = "HostingFarm_SecureStore"
$sssAuditing = $false
$sssSharing = $false
$sssAuditLogMaxSize = ""
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start Secure Store Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $sssName Application &amp; Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Secure Store Service" } | Start-SPServiceInstance
$sss = New-SPSecureStoreServiceApplication -PartitionMode -Name $sssName -ApplicationPool $saAppPool -DatabaseName $sssDBName -auditingEnabled:$sssAuditing -AuditlogMaxSize $sssAuditLogMaxSize -Sharing:$sssSharing
$proxy = New-SPSecureStoreServiceApplicationProxy -Name "$sssName Proxy" -ServiceApplication $sss
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy 

Search Service

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Search Service 应用程序。

注意

[!注意] 此服务应用程序的脚本使用 Partitioned 参数,而非 PartitionMode 参数。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$searchServerName = "$ENV:COMPUTERNAME" 
$searchName = "Search Service"
$searchDBName = "HostingFarm_Search"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start Search Service Instances, create the Service Application and Proxy, add to Proxy Group, configure Topology
Write-Host "Starting Search Service Instances..."
Start-SPEnterpriseSearchServiceInstance $searchServerName
Start-SPEnterpriseSearchQueryAndSiteSettingsServiceInstance $searchServerName
Write-Host "Creating Search Service Application and Proxy..."
$search = New-SPEnterpriseSearchServiceApplication -Partitioned -Name $searchName -ApplicationPool $saAppPool -DatabaseName $searchDBName
$proxy = New-SPEnterpriseSearchServiceApplicationProxy -Partitioned -Name "$searchName Proxy" -SearchApplication $search
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Clone the default Topology (which is empty) and create a new one and then activate it
Write-Host "Configuring Search Component Topology..."
$clone = $search.ActiveTopology.Clone()
$searchServiceInstance = Get-SPEnterpriseSearchServiceInstance
New-SPEnterpriseSearchAdminComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance 
New-SPEnterpriseSearchCrawlComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance 
New-SPEnterpriseSearchIndexComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $clone -SearchServiceInstance $searchServiceInstance
$clone.Activate()
Write-Host "Search complete!"

Word Automation Services

Word Automation Services 服务应用程序支持分区模式。 没有用于创建代理的 cmdlet。

以下 Microsoft PowerShell 脚本显示如何在分区模式下创建 Word Automation Services 服务应用程序。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$wasName = "Word Automation Service"
$wasDBName = "HostingFarm_WordAutomation"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start Word Automation Service Instance, create the Service Application and Proxy, add to Proxy Group
Write-Host "Creating $wasName Application &amp; Proxy..."
Get-SPServiceInstance | ? { $_.TypeName -eq "Word Automation Services" } | Start-SPServiceInstance
$was = New-SPWordConversionServiceApplication -PartitionMode -Name $wasName -ApplicationPool $saAppPool -DatabaseName $wasDBName 
# we cannot change the name of this proxy as there is no New-SPWordConversionServiceApplicationProxy
$proxy = Get-SPServiceApplicationProxy | ? { $_.Name -eq $wasName }
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy 

User Profile Service

如果未以 SharePoint 服务器场帐户身份运行 Windows PowerShell,在分区模式下配置时根据需要使用 PowerShell 创建 User Profile Service 将是一大挑战。 为了解决此挑战,为了成功启动用户配置文件同步服务,我们使用 Start-Process cmdlet 并模拟作为服务器场帐户执行脚本。

需要两个脚本,第一个脚本创建 UPA,第二个脚本调用第一个脚本。

以下 Microsoft PowerShell 脚本演示如何在分区模式下创建用户配置文件服务应用程序,并将其添加到自定义服务代理组...

注意

[!注意] 此脚本 NOT 直接运行,否则将无法启动 User Profile Synchronization 服务实例。 此脚本应保存在本地并注明其位置。

<#
    partitionedUPAcreation.ps1
    External dependency to create UPA under farm account creds
    
#>
asnp Microsoft.SharePoint.PowerShell
$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$upaName = "User Profile Service"
$upaProfileDBName = "HostingFarm_UserProfile_Profile"
$upaSocialDBName = "HostingFarm_UserProfile_Social"
$upaSyncDBName = "HostingFarm_UserProfile_Sync"
# Grab the Proxy Group
$proxyGroup = Get-SPServiceApplicationProxyGroup -Identity $mtProxyName
# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName
<# Creates UPA Service Application &amp; Proxy, and User Profile Service Instance
     If omitted, -ProfileSyncDBServer, -SocialDBServer &amp; -ProfileDBServer are the SharePoint Default DB Server
     If omitted, -SyncInstanceMachine is the local machine 
#>
Write-Host "Creating $upaName Application &amp; Proxy..."
$upa = New-SPProfileServiceApplication -PartitionMode -Name $upaName -ApplicationPool $saAppPoolName -ProfileDBName $upaProfileDBName -SocialDBName $upaSocialDBName -ProfileSyncDBName $upaSyncDBName
$proxy = New-SPProfileServiceApplicationProxy -PartitionMode -Name "$upaName Proxy" -ServiceApplication $upa
$proxyGroup | Add-SPServiceApplicationProxyGroupMember -Member $proxy
# Check it worked
Get-SPServiceApplication | ? {$_.Name -eq $upaName} 

下面的第二个脚本执行必要的工作,以调用 UPA 创建脚本并启动所需的服务实例。 应在 $upaScriptFile 变量中更新 UPA 创建脚本的位置。 此外,在 UPA 上设置了一些必需的权限。

$proxyGroupName = "Hosting Proxy Group"
$saAppPoolName = "SharePoint Web Services Default"
$upaScriptfile = "c:\partitionedUPAcreation.ps1"
$upaName = "User Profile Service"
$user = "FABRIKAM\Administrator"
$serviceUser = "FABRIKAM\spservices"
# Grab the Service Application Pool and Proxy Group
Write-Host "Getting Service Application Pool and Proxy Group..."
$saAppPool = $saAppPoolName | Get-SPServiceApplicationPool
$proxyGroup = Get-SPServiceApplicationProxyGroup $proxyGroupName
# Start User Profile Service Instance
Write-Host "Starting User Profile Service Instance..."
Get-SPServiceInstance | ? { $_.TypeName -eq "User Profile Service" } | Start-SPServiceInstance
Write-Host "Restarting SPTimerV4..."
Restart-Service SPTimerV4
# Grab the Farm Account credentials
Write-Host "Please enter the Farm Account Password:"
$farmAcct = (Get-SPFarm).DefaultServiceAccount
$cred = Get-Credential $farmAcct.Name
# Create a new process to initiate User Profile Service Application creation under UAC elevation
Write-Host "Creating new process for UPA creation..."
Start-Process $PSHOME\powershell.exe -Credential $cred -ArgumentList "-Command Start-Process $PSHOME\powershell.exe -ArgumentList `"'$upaScriptfile'`" -Verb Runas" -Wait
Get-Date
Write-Host "UPA Created!"
# Start the User Profile Synchronization Service Instance
Write-Host "Starting the UPS Service Instance..."
Get-Date
$upa = Get-SPServiceApplication | where-object {$_.Name -eq $upaName}
$upsInstanceName = "User Profile Synchronization Service"
[String]$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($cred.Password)); 
Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName} | % {
    $_.Status = [Microsoft.SharePoint.Administration.SPObjectStatus]::Provisioning
    $_.IsProvisioned = $false
    $_.UserProfileApplicationGuid = $upa.Id
    $_.Update()
    $upa.SetSynchronizationMachine($_.Server.Address, $_.Id, $cred.UserName, $password) # this can cause update conflicts
    Start-SPServiceInstance $_
}
Write-Host "Waiting on $upsInstanceName to provision..."
Write-Host "Baseline time is 130 seconds"
[int]$time = 0
$ups = Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName}
while(-not ($ups.Status -eq "Online")){
   sleep 10;
    Write-Host "Still waiting... ($time seconds elapsed)"
    $ups = Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName}
    $time = $time + 10
  }
Write-Host "$upsInstanceName provisioned, it took $time seconds."
Get-Date
Write-Host "UPS Service Instance Started"
# UPA Settings and Permissions, do this after UPS SI Started and Get it again to prevent update conflicts
Write-Host "Configuring NETBios Domain Names and UPA Permissions..."
$upa = Get-SPServiceApplication | where-object {$_.Name -eq $upaName}
$upa.NetBIOSDomainNamesEnabled=1
$upa.Update()   
function Grant-ServiceAppPermission($app, $user, $perm, $admin) {
    $sec = $app | Get-SPServiceApplicationSecurity -Admin:$admin
    $claim = New-SPClaimsPrincipal -Identity $user -IdentityType WindowsSamAccountName
    $sec | Grant-SPObjectSecurity -Principal $claim -Rights $perm
    $app | Set-SPServiceApplicationSecurity -ObjectSecurity $sec -Admin:$admin
}
Grant-ServiceAppPermission $upa $user "Full Control" $false
Grant-ServiceAppPermission $upa $serviceUser "Full Control" $false

信息权限管理配置

可以使用 SharePoint 管理中心网站或更新的 Microsoft PowerShell cmdlet 启用对多租户的信息权限管理支持。

使用 管理中心启用信息权限管理

  1. 确认执行此过程的用户帐户是运行管理中心的计算机上 SharePoint 组"Farm Administrators"和 Administrators 组的成员。

  2. 在管理中心网站上,转到"安全性"。

  3. 在"安全性"页面上,转到"配置信息权限管理"

  4. 在"信息权限管理"页面上,单击"使用此 RMS 服务器"。

  5. 确保选中复选框"在多租户配置中选中此框以允许租户配置租户级别 IRM 设置"。

使用 Microsoft PowerShell 启用信息权限管理

  1. 确认您具有以下成员身份:
  • SQL Server 实例上的 securityadmin 固定服务器角色。

  • 要更新的所有数据库上的 db_owner 固定数据库角色。

  • 运行 PowerShell cmdlet 的服务器上的管理员组。

    管理员可以使用 Add-SPShellAdmin cmdlet,授予 SharePoint Server 2013 cmdlet 使用权限。

    注意

    [!注意] 如果您没有这些权限,请与安装管理员或 SQL Server 管理员联系以请求权限。 有关 PowerShell 权限的详细信息,请参阅 Add-SPShellAdmin

  1. 打开“SharePoint 命令行管理程序”

  2. 在 PowerShell 命令提示符处,键入以下命令:

Set-SPIRMSettings -IrmEnabled -UseActiveDirectoryDiscovery -SubscriptionScopeSettingsEnabled

租户管理网站中没有 IRM 的内置配置选项。 要应用配置,请使用 Set-SPSiteSubscriptionIRMConfig cmdlet,如以下脚本中所示:

$subscription=Get-SPSiteSubscription "http://www.contoso.com"
Set-SPSiteSubscriptionIRMConfig -identity $subscription -IrmEnabled -CertificateServerUrl "http://rms.contoso.com" 

此类配置作为租户预配的一部分执行。

租户配置和管理

此部分介绍用于配置租户和自定义多租户环境的过程与方法。

租户配置

要创建租户,请执行表中的步骤。

Tasks
Steps
1. 创建网站订阅。
在 Microsoft PowerShell 命令提示符处,键入以下语法:
$sub = New-SPSiteSubscription
2. 将功能包分配至网站订阅,并使用人员选取器配置自定义 OU。
在 Microsoft PowerShell 命令提示符处,键入以下语法:
Set-SPSiteSubscriptionConfig -id $sub -FeaturePack $customerFeatures -UserAccountDirectoryPath "OU=$customerName,OU=Customers,DC=contoso,DC=com"
3. 创建一个或多个将分配至网站订阅的网站集。
在 Microsoft PowerShell 命令提示符处,键入以下语法:
Write-Host "Creating Member Site..." New-SPSite -url "http://$customerName.contoso.com" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template sts#0 -ContentDatabase $contentDBName``````# create Tenant Admin site Write-Host "Creating Tenant Admin site..." New-SPSite -url "http://$customerName.contoso.com/admin" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template tenantadmin#0 -AdministrationSiteType TenantAdministration -ContentDatabase $contentDBName``````Write-Host "Creating My Site Host..." New-SPSite -url "http://$customerName.contoso.com/mysites" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template SPSMSITEHOST#0 -ContentDatabase $contentDBName

以下 PowerShell 脚本显示如何创建使用 TENANTADMIN#0 模板的租户管理网站。 如果租户配置为使用企业功能包,则 Microsoft PowerShell 脚本将执行更多操作,即创建“我的网站”集合。

Add-PSSnapin Microsoft.SharePoint.Powershell -EA 0  
 
# farm details (update to reflect your environment) 
$hostingMainURL = "http://$ENV:COMPUTERNAME"
$upaProxyName = "Tenant User Profile Service Proxy" 
$mmsProxyName = "Tenant Managed Metadata Service" 
$contentDBName = "HostingFarm_Content_Hosting" 
$farm = Get-SPFarm
$foundationFeaturePack = $farm.Properties.Foundation_FeaturePack
#$standardFeaturePack = $farm.Properties.Standard_FeaturePack
#$enterpriseFeaturePack = $farm.Properties.Enterprise_FeaturePack
# tenant-specific information (vary by tenant)
$customerName = "Customer A" 
$customerTenantAdmin = "CONTOSO\customerA-Admin"
$customerTenantAdminEmail = "admin@customerA.com"
$customerFeatures = $enterpriseFeatures
# Note: 
# this script assumes that the Content Web App and necessary Managed Paths exist. 
# grab the web app 
$webApp = Get-SPWebApplication $hostingMainURL 
 
# create new Site Subscription 
Write-Host "Creating Site Subscription..." 
$sub = New-SPSiteSubscription 
 
# assign feature pack and set the OU to be used by the People 
Write-Host "Assigning Feature Pack and configuring People Picker..." 
Set-SPSiteSubscriptionConfig -id $sub -FeaturePack $customerFeatures -UserAccountDirectoryPath "OU=$customerName,OU=Customers,DC=contoso,DC=com" 
 
# create the "main" member site (we need a site at the root to use Host Headers and Managed Paths in the following cmdlets) 
Write-Host "Creating Member Site..." 
New-SPSite -url "http://$customerName.contoso.com" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template sts#0 -ContentDatabase $contentDBName
 
# create Tenant Admin site  
Write-Host "Creating Tenant Admin site..." 
New-SPSite -url "http://$customerName.contoso.com/admin" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template tenantadmin#0 -AdministrationSiteType TenantAdministration -ContentDatabase $contentDBName
 
# everything else needs standard 
if (!($customerFeatures -eq $foundationFeatures)) 
{ 
    Write-Host "Tenant has SharePoint Server features" 
    # create a mysite host 
    Write-Host "Creating My Site Host..." 
    New-SPSite -url "http://$customerName.contoso.com/mysites" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template SPSMSITEHOST#0 -ContentDatabase $contentDBName
    # configure the MySites host, MySites path, Naming Resolution and Profile Sync OU for the Subscription 
    Write-Host "Configuring Tenant Profile Config..." 
    $upaProxy = Get-SPServiceApplicationProxy | where-object {$_.DisplayName -eq $upaProxyName} 
    Add-SPSiteSubscriptionProfileConfig -id $sub -SynchronizationOU $customerName -MySiteHostLocation "http://$customerName.contoso.com/mysites" -MySiteManagedPath "/mysites/personal" -SiteNamingConflictResolution "None" -ProfileServiceApplicationProxy $upaProxy 
 
    # create a site for the Content Type Gallery 
    Write-Host "Creating Content Type Gallery..." 
    New-SPSite -url "http://$customerName.contoso.com/cthub" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template sts#0 -ContentDatabase $contentDBName
 
    # configure the Content Type Gallery for the Subscription 
    Write-Host "Configuring Tenant Content Type Gallery..." 
    $mmsProxy = Get-SPServiceApplicationProxy | where-object {$_.DisplayName -eq $mmsProxyName} 
    # ContentTypeHub feature activation may fail - if so activate manually 
    Set-SPSiteSubscriptionMetadataConfig -identity $sub -serviceProxy $mmsProxy -huburi "http://$customerName.contoso.com/cthub" -SyndicationErrorReportEnabled 
    Write-Host "Activating Content Type Hub..." 
    Enable-SPFeature -Identity ContentTypeHub -url "http://$customerName.contoso.com/cthub" 
} 
     
Write-Host "Tenant Provisioning Script Completed!"  

可以进一步自定义此方法,以包含其他租户配置,例如工作流、应用和 IRM。 此类脚本封装到函数或自定义 cmdlet 中,以便为将来的租户重复运行该脚本。

工作流服务

SharePoint Server 2013 对工作流进行了重大改进,包括完全声明式创作、REST 和服务总线消息传递、弹性可伸缩性以及托管服务可靠性等企业功能。 SharePoint 2013 可以使用构建于 .NET Framework 4.5 的 Windows Workflow Foundation 组件之上的新工作流服务。 新服务称为 工作流管理器,旨在在企业中扮演核心角色。

只有在您下载并安装新的工作流管理器服务并将其配置为与 SharePoint Server 2013 服务器场进行通信后,SharePoint 2013 工作流平台才可供您和您的工具使用。 有关如何安装和配置 工作流管理器 Service for SharePoint 2013 的详细信息,请参阅安装和配置 SharePoint Server 工作流

要配置工作流服务,请在分区模式下使用 Register-SPWorkflowService cmdlet 将服务器场注册到工作流服务管理器中。 在执行此场注册时,请使用 SPSite 参数从服务器场传递任何现有租户网站集的 URL,并使用 ScopeName 参数为场定义命名工作流范围。

以下 Windows PowerShell 脚本显示在分区模式下如何将 SharePoint 服务器场注册到工作流服务管理器中。

Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue 
# Register the Farm with the Workflow Service and create a workflow scope
# Note: any tenant site will suffice
Register-SPWorkflowService -SPSite "http://tenant.contoso.com" -WorkflowHostUri "http://WFSvr01:12291" -PartitionMode -AllowOAuthHttp -Force -ScopeName "HostingFarm"
 
Write-Host "Farm Workflow Registration Script Completed!"

要为 SharePoint 工作流启用特定租户,您必须配置工作流服务代理。 执行此配置时,获取对租户的根网站集的引用,并将其注册到工作流服务代理。

以下 PowerShell 脚本显示如何为 SharePoint 工作流启用租户。

Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue 
#Get the Workflow Service Application Proxy
$wfProxy  = Get-SPWorkflowServiceApplicationProxy
#Create a credential object
$user = New-Object System.Net.NetworkCredential ("domain\Admin", "Password")
#Get the SPSite object of the root site collection of the tenant
$site = Get-SPSite http://tenant.domain.com
#Set the Workflow address for the tenant site (reference our workflow scope)
$wfProxy.SetWorkflowServiceAddress($site,"http://WFSvr01:12291/HostingFarm")
#Register the proxy with tenant site collection
$wfProxy.Register($site,$user)
#Connect the tenant site collection to the proxy
$wfProxy.Connect($site)  
Write-Host "Tenant Workflow Registration Script Completed!" 

将租户配置为使用工作流Service Manager后,可以使用 SharePoint Designer使用 SharePoint 2013 工作流选项创建工作流,如下图所示。

此图显示 SharePoint Designer 中的 SharePoint 2013 工作流选项

扩展租户管理网站模板

使用自定义操作定义架构在租户管理网站的主页上添加或删除链接。

以下功能定义显示如何添加新组和多个链接,以及如何删除到“管理网站集”页面的链接。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomActionGroup
       Id="TenantAdmin_HostingUserAccounts"
       Location="Microsoft.SharePoint.TenantAdministration"
       Title="User Accounts"
       Sequence="90"
       ImageUrl="_layouts/images/SiteSettings_UsersAndPermissions_48x48.png">
    <UrlAction
        Url="" />
  </CustomActionGroup>
  <CustomAction
      Id="TenantAdmin_HostingUserAccounts_AddUser"
      GroupId="TenantAdmin_HostingUserAccounts"
      Location="Microsoft.SharePoint.TenantAdministration"
      Sequence="10"
      Title="Create User">
    <UrlAction
        Url="_layouts/UserAccountsWebParts/UA_AddUsers.aspx" />
  </CustomAction>
  <CustomAction
      Id="TenantAdmin_HostingUserAccounts_ManageUsers"
      GroupId="TenantAdmin_HostingUserAccounts"
      Location="Microsoft.SharePoint.TenantAdministration"
      Sequence="30"
      Title="Manage Users">
    <UrlAction
        Url="_layouts/UserAccountsWebParts/UA_ManageUsers.aspx" />
  </CustomAction>
  <HideCustomAction
    GroupId = "TenantAdmin_Sites"
    HideActionId = "TenantAdmin_Sites_ManageSiteCollections" 
    Location="Microsoft.SharePoint.TenantAdministration" />
</Elements>

有关自定义操作(例如内置链接的默认 ID)的详细信息,请参阅 自定义操作定义架构

自定义功能区

SharePoint Server 2013 中的"服务器"功能区可以使用"服务器"功能区 XML 和 ECMAScript(JavaScript、JScript)进行自定义。 XML 定义了功能区上的控件。 ECMAScript 对页面或页面上的对象执行操作。 您可以使用 SharePoint FoundationECMAScript 对象模型或内置 ECMAScript 函数中存在的 ECMAScript。 您还可以将您自己的 ECMAScript 添加到页面并使用它与功能区进行交互。

自定义"服务器"功能区时,您可以添加、替换和删除控件、组和选项卡。 对功能区的自定义使用功能中的"服务器"功能区 XML 进行定义,并且可以部署到解决方案包(.wsp 文件中)。 可以使用 RegistrationIdRegistrationType 属性将功能区自定义的范围限定为特定列表类型。 还可以使用 Feature.xml 文件中的 Scope 属性将自定义的范围限定为网站或特定 Web 应用程序。

以下 XML 显示如何替换"管理网站集"页面上"磁盘配额"按钮的功能。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/" >
  <CustomAction Id="Ribbon.Library.Actions.ReplacementButton"
      Location="CommandUI.Ribbon"
      Title="Replace a Ribbon Button">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition
          Location="Ribbon.SiteCollections.Manage.DiskQuota">
          <Button Id="Ribbon.SiteCollections.Manage.DiskQuota.Replacement"
            Command="ReplacementButtonCommand"
            Image32by32="/_layouts/1033/images/formatmap32x32.png?vk=4536"
                  Image32by32Left="-256"
                  Image32by32Top="-224"
            LabelText="Disk Quota"
            TemplateAlias="o1" />
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler
          Command="ReplacementButtonCommand"
          CommandAction="javascript: 
         function demoCallback(dialogResult, returnValue)  
          {  
          }  
              var options = {               
                url: 'HostingTenantAdmin/DiskQuota.aspx', 
                tite: 'Manage Disk Quota', 
                allowMaximize: true, 
                showClose: true, 
                width: 610, 
                height: 450,
            dialogReturnValueCallback: demoCallback  }; 
              SP.UI.ModalDialog.showModalDialog(options);" />
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
</Elements>

有关如何自定义服务器功能区的详细信息,请参阅 自定义服务器功能区

使用自定义属性扩展网站订阅

Site Subscription Service 应用程序可以存储管理自定义属性和租户自定义属性。 支持的属性类型包括以下值:

  • string

  • int

  • long

  • bool

  • Guid

  • 日期/时间

您可以使用自定义属性扩展租户管理功能,如租户配额管理。

以下 PowerShell 脚本显示如何访问自定义属性。

Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
#-----------------------------------------------------
# Load Assemblies
#-----------------------------------------------------
[void] [Reflection.Assembly]::Load("Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")
#-----------------------------------------------------
# Functions
#-----------------------------------------------------
function GetSPSiteSubscription([string]$url)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = Get-SPSiteSubscription $url;
    
    return $sub;
}
function GetSiteSubAdminProperties([string]$url)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetAdminProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    return $props; 
}
function AddOrSetSiteSubAdminProperty([string]$url, [string]$theKey, $theValue)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetAdminProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    if ($props.ContainsKey($theKey) -eq $true)
    {
        $props.SetValue($theKey, $theValue);
    }
    else
    {
        $props.Add($theKey, $theValue);
    }
    $props.Update(); 
}
function GetSiteSubAdminProperty([string]$url, [string]$theKey)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetAdminProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    $theValue = "";
    if ($props.ContainsKey($theKey) -eq $true)
    {
        foreach ($prop in $props)
        {
            if ($prop.Key -eq $theKey) 
            {
                $theValue = $prop.Value;
                break;
            }
        }
        return $theValue;
    }
    else 
    {
        return $null;
    }
}
function RemoveSiteSubAdminProperty([string]$url, [string]$theKey)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetAdminProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    if ($props.ContainsKey($theKey) -eq $true)
    {
        $props.Remove($theKey);
        $props.Update();
    }
}
function GetSiteSubTenantProperties($url)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    return $props; 
}
function AddOrSetSiteSubTenantProperty([string]$url, [string]$theKey, $theValue)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    if ($props.ContainsKey($theKey) -eq $true)
    {
        $props.SetValue($theKey, $theValue);
    }
    else
    {
        $props.Add($theKey, $theValue);
    }
    $props.Update(); 
}
function GetSiteSubTenantProperty([string]$url, [string]$theKey)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    $theValue = "";
    if ($props.ContainsKey($theKey) -eq $true)
    {
        foreach ($prop in $props)
        {
            if ($prop.Key -eq $theKey) 
            {
                $theValue = $prop.Value;
                break;
            }
        }
        return $theValue;
    }
    else 
    {
        return $null;
    }
}
function RemoveSiteSubTenantProperty([string]$url, [string]$theKey)
{
    [Microsoft.SharePoint.SPSiteSubscription]$sub = GetSPSiteSubscription -url $url;
    [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager] $manager =  [Microsoft.SharePoint.SPSiteSubscriptionSettingsManager]::Local;
    if ($manager -eq $null)
    {
        throw("Bad Manager!");
    }
    [Microsoft.SharePoint.SPSiteSubscriptionPropertyCollection]$props = $manager.GetProperties($sub);
    if ($props -eq $null)
    {
        throw("Bad Props!");
    }
    if ($props.ContainsKey($theKey) -eq $true)
    {
        $props.Remove($theKey);
        $props.Update();
    }

另请参阅

概念

SharePoint Server 2013 中主机提供商的一般指导