SharePoint Server 2013 でのマルチテナントについて

適用対象:yes-img-13 2013no-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 ホスティング プラットフォームを計画、設計、運用、管理するための適切な意思決定を行うことができます。

マルチテナントとは、複数のテナントに対応するために、サイトやその他の共有サービスまたはソフトウェアのデータを管理およびパーティション分割する機能を指します。 この機能は、サービスの複数のインスタンスを実行したり、個別のハードウェアを設定したりするのとは対照的です。 マイクロソフト製品およびテクノロジでは、サービスのマルチテナントによりサーバー ファームのリソースが最大化されたホスティング環境が作成されます。 ホスティング環境について学習する前に、サービス アーキテクチャを理解しておくことが重要です。

SharePoint Server 2013 でマルチテナント機能を有効にする主なコンポーネントとサービス

このセクションでは、SharePoint Server 2013 でマルチテナントを有効にする主なコンポーネントとサービスについて説明します。

Web アプリケーション

SharePoint 2013 Web アプリケーションは、作成されるサイト コレクションの管理の論理ユニットおよびセキュリティとして動作するインターネット インフォメーション サービス (IIS) Web サイトで構成しています。 各 Web アプリケーションは、一意または共有のアプリケーション プールを使用する異なる IIS Web サイトで表されます。 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 サーバーの全体管理 Web サイト の [サービス アプリケーションの管理] ページに一覧表示されます。

プロキシは、サーバーの全体管理 または SharePoint 2016 製品構成ウィザード を使用してサービス アプリケーションを作成すると自動的に作成されます。 Microsoft PowerShell を使用してサービス アプリケーションを作成する場合、プロキシは常に自動的に作成されるとは限らないので、Microsoft PowerShell を使用して作成する必要があります。

一部のプロキシには変更可能な設定があります。 たとえば、Web アプリケーションが管理されたメタデータ サービスの複数のインスタンスに接続されている場合、企業の分類をホストする 1 次側サービス アプリケーションに接続されているプロキシを指定する必要があります。 マルチテナントを使用する場合、これらの設定はテナント レベルの構成に移行されます。

サービス アプリケーション

サービス アプリケーションは、特定のサービスの論理的な表現であり、その運用動作を定義するセキュリティと管理の構成です。 一例には管理されたメタデータやユーザー プロファイルがあります。 さまざまなサービス アプリケーションがさまざまな方法で実装され、この柔軟性がマルチテナント ソリューションの設計に影響します。

SharePoint Server 2013 で利用できるサービス アプリケーションの一覧、およびマルチテナント機能付き SharePoint のどのバージョンでそれらを使用できるかを判断するには、「SharePoint Server 2013 でのホストに関する一般的なガイダンス」の「 サービスと機能 」セクションを参照してください。

機能パックとライセンス

SharePoint の機能パックは、サイトを対象範囲とする機能または Web を対象範囲とする機能を一緒にグループ化する方法です。 SharePoint 機能をグループ化すると、サイト サブスクリプション (つまりテナント) に関連付けることができます。 サイト購読 (テナント) にあるすべてのサイト コレクションでは、機能パックの一部であるサイト スコープ機能または Web スコープ機能のみを使用できます。 この機能により、各種の機能セットに基づいて階層型サービスを提供できるようになります。

SharePoint Server 2013 では、ユーザーごとに異なる SharePoint ライセンスを割り当てる新機能が追加されました。 また、実行時でも SharePoint のライセンスにチェックを入れることができます。 この機能により、サービス プロバイダーは、簡素化されたデプロイ モデル全体でさまざまなサービス オファリングを構築する柔軟性が高くなります。 旧バージョンの SharePoint では、サービス プロバイダーは SharePoint のバージョンごとに別の SharePoint 展開モデルを構築する必要がありました。 SharePoint 機能の詳細については、次の記事の「SharePoint サービスの説明」の「 オンプレミス ソリューション間 での SharePoint 機能の可用性」セクションを参照してください。

Information Rights Management

SharePoint Server 2013 に Information Rights Management を統合することで、マルチテナントのサポートが追加されました。これにより、テナント レベルで Information Rights Management 設定を管理できます。

アーキテクチャの設計に関する考慮事項

このセクションでは、マルチテナントの 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 アプリケーション全体に複数のルート レベルのサイト コレクション (ドメイン名付きサイト) を作成します。

1 つの Web アプリケーションと複数の Web アプリケーション

Web.config ファイルなどの Web アプリケーション全体で共有するリソースに影響を与えるカスタマイズが必要なテナントには、専用 Web アプリケーションを使用します。

複数のテナントを 1 つのファームに結合する場合、すべての認証済みコンテンツに 1 つの専用 SharePoint Web アプリケーションを使用し、すべての匿名コンテンツに別の専用 Web アプリケーションを使用します。 この方法では、両方の種類のコンテンツを持つテナントに対して 2 つの個別のサブスクリプション ID が必要になります。 この方法では、ライセンスも簡略化されます。

セルフサービスのサイト コレクション作成設定など、一部の SharePoint の機能は Web アプリケーション レベルにバインドされます。 これをオンにすると、同じ Web アプリケーションのすべてのテナントがサイト コレクションを作成できるようになります。

単一ファーム環境の設計

テナントデータと管理が分離されたマルチorganizationホスティング環境では、パーティション分割された共有サービスの構成が重要です。 この例では、パーティション分割されたサービスの実際的な実装とともに、お客様のサイトの展開方法に関する推奨事項を記載しています。

この例は、お客様サイトをファームに展開する以下の方法を詳しく記載しています。

  • 専用のアプリケーション プールおよび Web アプリケーション

  • 共有アプリケーション プールと専用 Web アプリケーション

  • 共有 Web アプリケーション

    • 認証サイト

    • 認証されていないサイト

顧客ごとに専用のアプリケーション プールを使用するのは、分離の要件を満たす必要がある場合のみにしてください。 Web.config ファイルなどの Web アプリケーション全体で共有するリソースに影響を与えるカスタマイズが必要なテナントには専用 Web アプリケーションを使用します。

複数のテナントを 1 つの Web アプリケーションに結合する場合、すべての認証済みコンテンツに 1 つの専用 Web アプリケーションを使用し、すべての匿名コンテンツに別の専用 Web アプリケーションを使用します。 この方法では、両方の種類のコンテンツを持つテナントに対して 2 つの個別のサブスクリプション ID が必要になります。 この方法では、ライセンスも簡略化されます。

完全な信頼コードのサイトへの展開を許可してはなりません。

Web.config ファイルなどの共有リソースに影響するカスタマイズを許可してはなりません。

次の例 (認証済みサイト) では、会社ごとに別のホスト名付きサイト コレクションが使用されます。 会社 C には 2 つの異なるホスト名付きサイト コレクションがあります。 それぞれの最上位にあるホスト名付きサイト コレクションの下で、管理パスを使用して、チーム サイト、個人用サイト、発行されたイントラネットのコンテンツ、または部門別のサイトなどのサイトに最上位サイトの第 2 層を作成します。

階層型環境の設計

上記のとおり、マルチテナントの SharePoint Server 2013 ホスティング プラットフォームを計画する際に考慮すべきことが多数あります。これらの要因には費用、管理の簡略化、リソースの分離、パフォーマンス、スケーラビリティなどがあります。

顧客ベースが拡大するにつれ、すべての顧客のすべての要件を単一環境で満たすことは困難であると分かる場合があります。 その時点で、これらの要因のバランスを取ろうとする際、トレードオフを考慮しなければなりません。

このような場合、検討する選択肢として、複数の SharePoint 環境でお客様のさまざまなニーズを満たす階層型環境の設計があります。 各環境は、低価格、高密度、リソース分離の向上、高価格でのサービス品質 (QoS) の向上など、サービスのさまざまな面が中心となっています。

この階層型環境設計のアプローチから、お客様にさまざまなサービス レベル契約を提供できます。 結果として、より広範囲のお客様に対応でき、管理と運用が簡略化されるほか、管理コストが低減し、利幅が増加します。

セキュリティに関する考慮事項

このセクションでは、マルチテナントの SharePoint Server 2013 のホスティング プラットフォームを計画し、設計する際のセキュリティに関する考慮事項について説明します。 この時点から、ユーザー 選択ウィンドウの構成について説明する組織単位 (OU) セクションなど、任意のセクションは、Windows 認証でそれ以上カスタマイズしなくても機能します。

SharePoint Server 2013 は、以下の認証タイプのためのさまざまな認証方式と認証プロバイダーをサポートします。

  • Windows 認証

  • フォームベース認証

  • SAML トークンベース認証

Windows 認証の種類では、既存の Windows 認証プロバイダーと Windows ドメイン環境が使用する認証プロトコルを活用して、接続するクライアントの資格情報を検証します。 要求ベースの認証とクラシック モードの両方で使用されるWindows 認証方法は次のとおりです。

  • NTLM

  • Kerberos

  • ダイジェスト

  • 基本

フォームベース認証は、ASP.NET のメンバーシップ プロバイダーとロール プロバイダーの認証に基づく、クレームベース ID 管理システムです。 フォーム ベースの認証は、次のような認証プロバイダーに格納されている資格情報に対して使用できます。

  • Active Directory Domain Services (AD DS)

  • SQL Server データベースなどのデータベース

  • Novell eDirectory、NDS (Novell Directory Services)、または Sun ONE などの LDAP (Lightweight Directory Access Protocol) データ ストア

フォーム ベースの認証では、ユーザーがログオン フォーム (通常は Web ページ) に入力する資格情報に基づいてユーザーを検証します。 認証されていない要求はログオン ページにリダイレクトされ、ユーザーは有効な資格情報を提供して、フォームを提出する必要があります。 システムは、後の要求の ID を再確立するためのキーを含む認証済み要求に対して Cookie を発行します。

フォーム ベースの認証を使用して、Windows に基づいていない ID 管理システムまたは外部の ID 管理システムに対してユーザーを認証するには、メンバーシップ プロバイダーとロール マネージャーをいくつかの web.config ファイルに登録する必要があります。 SharePoint Server 2013 では、標準の ASP.NET ロール マネージャー インターフェイスを使用して、現在のユーザーに関するグループ情報を収集します。 SharePoint Server 2013 の承認プロセスは、各 ASP.NET ロールを 1 つのドメイン グループのように処理します。 Web.config ファイルでのロール マネージャーの登録は、認証用のメンバーシップ プロバイダーの登録と同じ方法で行います。

サーバーの全体管理 Web サイトからメンバーシップ ユーザーやロールを管理する場合は、サーバーの全体管理 Web サイトの Web.config ファイルにメンバーシップ プロバイダーとロール マネージャーを登録する必要があります。 また、コンテンツをホストする Web アプリケーションの Web.config ファイルおよび Security Token Service の Web.config ファイルにもメンバーシップ プロバイダーとロール マネージャーを登録する必要があります。

SharePoint Server 2013 における SAML のトークンベース認証では、SAML 1.1 プロトコルと WS-Federation パッシブ リクエスター プロファイル (WS-F PRP) を使用します。 独自の内部環境でもパートナー環境でも、クレームベースの環境の管理者との調整が必要です。 Active Directory フェデレーション サービス (AD FS) 2.0 を使用する場合は、既に SAML のトークンベース認証環境があります。

クレームベースの認証を使用する Web アプリケーションでは、ユーザー選択ウィンドウは SharePoint Server 2013 内で使用できるコントロールです。 クレーム プロバイダーがユーザー選択ウィンドウのコントロールでユーザー、グループ、クレームの「分かりやすい」表示を一覧表示、解決、検索、および決定します。 ユーザー 選択ウィンドウの構成の詳細については、「Peopleピッカーと要求プロバイダーの概要」を参照してください。

ゾーンは、Web アプリケーション内の同じサイトにアクセスするさまざまな論理パスを表します。 各 Web アプリケーションには、最大で 5 つのゾーンを含めることができます。 Web アプリケーションの作成時に、サーバーの全体管理 は 既定 という名前のゾーンを作成します。 より多くのゾーンを作成するには、Web アプリケーションを拡張し、残りのゾーン名 ( イントラネットエクストラネットインターネットまたはカスタム) のいずれかを選択します。

組織単位

組織単位 (OU) では、Active Directory 環境内のユーザーおよびコンピューター オブジェクトを整理します。 ホスティング目的で、組織単位構造を下図のように編成することができます。

このダイアグラムはホスト環境に対する組織ユニットの構造を示します

少なくとも、グループ ポリシーをドメイン ルート、ドメイン コントローラー OU、SharePoint サーバー OU、顧客 OU にリンクさせます。

ドメイン ルート

ドメイン全体に適用されるセキュリティがドメイン ポリシーに適用されます。 これらの設定は、ドメイン全体に適用されるグループ ポリシー オブジェクト (GPO) に格納されます。

ドメイン コント ローラー OU

ドメイン コント ローラーは、組織で最も機密性の高いデータ、セキュリティ設定自体を制御するデータを保持しています。 このレベルで適用される GPO は、ドメイン内のドメイン コント ローラーを構成し、保護するために使用されます。

SharePoint サーバー OU

SharePoint サーバーには、ディレクトリ内の他のサーバーに含まれていない独自の役割があります。 独自の OU にこれらのサーバーを配置することで、固有のポリシーをこれらのサーバーに適用できます。 また、ディレクトリ内の他のサーバーから分離することもできます。 異なる GPO (匿名のアクセス コンテンツ サーバーと認証コンテンツ サーバーなど) を作成する必要がある場合にサブ OU を作成できます。

顧客 OU

この最上位レベルの OU では、すべてのユーザー アカウントをディレクトリの残りの部分から分離することができます。 次のレベルの OU には 顧客 OU が含まれます。 顧客ごとに 1 つの OU があります。 この OU を使用すると、顧客のすべてのユーザー アカウントとコンピューター アカウントを他の顧客のアカウントから分離できます。 さらに、この OU 構造は、マルチテナント展開でユーザー プロファイル同期をサポートするために必要な構造です。

ユーザーが独自のカスタム ドメインにログインしている印象を与えるために、次の図に示すように、Active Directory サービス インターフェイス エディター (ADSI Edit) または別の AD ツールを使用して、各 Customer OU の uPNSuffixes 属性を編集します。

この図は UPNSuffixes 属性のための ADSI プロパティ エディタ ダイアログ を表します

下図に示すとおり、顧客 OU の uPNSuffixes 属性を構成すると、その属性値はその顧客 OU 内のユーザー アカウントと関連付けるために使用できるようになります。

このダイアグラムは新規ユーザーを作成できる新しいオブジェクト ダイアログを示します

ユーザー認証

ユーザー認証は、認証プロバイダーに対するユーザーの ID の検証です。これは、ユーザーの資格情報を含み、ユーザーが正しく送信したことを確認できるディレクトリまたはデータベースです。 認証プロバイダーの例としては、Active Directory Domain Services (AD DS) があります。 認証プロバイダーの他の一般的な名前は、 ユーザー ディレクトリ属性ストアです

認証方式とは、ユーザーの ID を証明するアカウント資格情報およびその他の情報のやり取りのことを指します。 認証方式の結果は、一般的には、認証プロバイダーがユーザーを認証したというクレームを含むトークンの形式の証明になります。

認証の種類とは、時には業界標準プロトコルを使用して、1 つまたは複数の認証プロバイダーに対して資格情報を確認する特定の方法です。 認証の種類では、複数の認証方式を使用できます。

ユーザー ID の検証後、ユーザーがアクセスできるサイト、コンテンツ、その他の機能が承認プロセスによって決定されます。

ユーザー認証の種類と方式を計画するには、次の項目を決定する必要があります。

  • 各 Web アプリケーションおよびゾーン用のユーザー認証の種類および方式

  • 決定された認証の種類と方式をサポートするために必要な認証インフラストラクチャ

  • クラシック モード認証を使用する現在の Web アプリケーションおよびゾーンを、クレームベース認証を使用するように移行する方法

Active Directory フェデレーション サービス (AD FS)

SharePoint Server 2013 では、クレーム ベースの認証がサポートされています。 Active Directory フェデレーション サービス (AD FS) (AD FS) は、SharePoint Server 2013 Web アプリケーションの ID プロバイダー セキュリティ トークン サービス (IP-STS) として機能するように構成できます。 この構成では、クライアント コンピューターがクレームベース認証を使用する Web アプリケーションにアクセスできるように、AD FS から要求で構成された SAML ベースのセキュリティ トークンが発行されます。 AD FS の代わりに ID プロバイダーを使用できます。 ただし、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 用のこれらのアプリは、最高の Web を 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 ホスティング プラットフォームでテナント固有のバックアップおよび復元操作を行う場合、テナント対応コンポーネント (サービス アプリケーション、ワークフロー、コンテンツ データベース、サイト コレクション) が相互に同期し続けるようにする必要があることがあります。

サービス アプリケーション

パーティション モードで構成されているサービス アプリケーションには、テナント固有のデータを格納する 1 つ以上の関連するデータベースがあります。 アプリケーション レベルとデータベース レベルの両方でこれらのサービス アプリケーションの一般的なバックアップおよび復元操作を行う間、これらのサービス アプリケーションまたはそのデータベースでテナント固有の詳細なバックアップおよび復元操作を行う制限付きコマンドが存在します。

サービス アプリケーションの考慮事項

App Management Service

App Management Service は、SharePoint Server 2013 に導入された SharePoint 用アプリ 機能の管理に使用するサービス アプリケーションです。 SharePoint 用アプリケーション は、SharePoint サイトに特定の情報または機能を提供する新しい方法を提供します。 SharePoint 用アプリ は、特定のエンド ユーザーのニーズまたはビジネス ニーズを解決する、小さくて使いやすい、スタンドアロンのアプリケーションです。 App Management Service はパーティション モードをサポートしていませんが、ネイティブにサイト サブスクリプションに対応しています。 マルチテナントの SharePoint 環境では、ほとんどのアプリ管理機能 (つまり アプリ カタログ の管理、Manage App のライセンス、アプリ権限など) は、テナント管理サイトを利用して取得します。

下図は、テナント管理サイトのアプリ管理を示しています。

アプリ管理のためのテナント管理サイトを表す図

Business Data Connectivity Service

パーティション モードで構成すると、Business Data Connectivity サービスのすべての構成がテナント管理に移動します。 ただし、テナント管理サイト テンプレートには、このページへのリンクは含まれていません。このリンクは、「テナント管理サイト テンプレートの拡張」セクションのカスタマイズ手法を使用して追加できます。

Secure Store Service

パーティション モードで構成すると、暗号化キーの生成は、サーバーの全体管理またはWindows PowerShellを介して実行されるファーム レベルの構成のままです。 Secure Store サービス構成の残りの部分は、テナント管理に移動します。 ただし、テナント管理サイト テンプレートには、このページへのリンクは含まれていません。このリンクは、「テナント管理サイト テンプレートの拡張」セクションのカスタマイズ手法を使用して追加できます。

管理されたメタデータ サービス

パーティション モードでの構成が完了すると、全構成がテナント管理に移動し、既定ではコンテンツ タイプの発行が有効になります。

Search Service

多くのテナント固有の検索設定関連機能は、下図に示すようにテナント管理サイトで公開されています。

このダイアグラムは Tenant Administration サイトにある Search Administration の機能を示します

注:

*の多く。EnterpriseSearch* Microsoft PowerShell コマンドレットはパーティション対応になり、テナント管理サイトで公開されている一部の構成および管理機能を自動化するために使用できます。

User Profile Service

多数の構成要素がテナント管理に移動しますが、下図に示すとおり、プロファイルの同期の構成の多くはファーム レベルのままであり、すべてのテナントに適用できます。

この図にはユーザー プロファイル構成が示されています

ワークフロー

上記のとおり、SharePoint Server 2013 では、ワークフローのプラットフォームは SharePoint のプラットフォームとは別です。 ワークフローのプラットフォーム自体は、1 つ以上のデータベースを使用します。 これらのデータベースで一般的なデータベース レベルのバックアップおよび復元操作を行えますが、これらのワークフロー データベースにテナント固有のバックアップおよび復元操作を行うコマンドやユーティリティは存在しません。

コンテンツ データベース

1 つ以上の専用のコンテンツ データベースをテナントが独占的に使用する場合、これらのデータベースで一般的なデータベース レベルのバックアップおよび復元操作を行えます。

注:

1 つ以上の専用のコンテンツ データベースを独占的に使用することは、セルフサービスのサイト作成のような標準の製品機能では実現できません。 これは、特定のサービス レベルのサービスを満たすためにカスタマイズが必要な場合の一例です。

次の 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 コマンドレットは、小規模から中規模のサイト コレクションに適した選択肢です。

次の 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 コマンドレット、およびコンテナーに個々の機能を追加する Add-SPSiteSubscriptionFeaturePackMember コマンドレットを使用する機能パックが作成されます。

次の Microsoft PowerShell スクリプトは、SharePoint Foundation 2013 の機能を表すテナント レベルの機能パックを作成し、機能パック ID をファームのプロパティ バッグに保存する方法を示しています。

注:

購読設定サービス アプリケーションは、機能パックを操作するスクリプトを実行する前に存在していなければなりません。

<#
   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 の Standard Edition および Enterprise Edition に異なるファームを構築しなくて済むため、この機能により展開モデルが簡略化されます。

ユーザー ライセンスは、要求を既知の種類のライセンスにマッピングすることによって割り当てられます。 たとえば、クレームとして、Active Directory ドメイン サービス (AD DS) セキュリティ グループが考えられます。 ContosoFinanceDept セキュリティ グループを Enterprise ライセンスにマッピングすることで、そのグループのすべてのメンバーに Enterprise ライセンスを効果的に割り当てます。 SharePoint Server にログオンするユーザーには、クレームが割り当てられます。 SharePoint Server は、ユーザーの要求を調べてライセンスを決定します。ユーザーが特定の機能を使用するライセンスを持っていない場合、SharePoint は実行時にその機能へのアクセスをブロックします。

この SharePoint Server 2013 ライセンスの実装は、新しい Microsoft PowerShell コマンドレットを使用して管理されます。 既定では、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 を使用しています。 実際の展開では、サインイン、SharePoint アプリで使用するコンテンツおよび認証トークン、ワークフロー マネージャーなどその他の OAuth2 関連サービスを保護するため、SSL を使用する必要があります。

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 での管理アカウントとサービス アカウントの計画」を参照してください。 この展開例では、次の 3 つのサービス アカウントを使用します。

  • SPFarm - SharePoint ファームのアカウント

  • SPServices - サービス アプリケーション エンドポイントをホストするアプリケーション プール ID

  • SPContent - コンテンツ Web アプリケーションをホストするアプリケーション プール ID

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 では、パーティション モードでサービス アプリケーションを作成することによってマルチテナントをサポートしています。 テナント固有の構成はなく、サービスはファーム レベルで管理されます。 データベースはキューとして効果的に機能するため、パーティションまたはテナントに対応している必要があります。

次の 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 サービス構成の残りの部分は、テナント管理に移動します。 ただし、テナント管理サイト テンプレートには、このページへのリンクは含まれていません。このリンクは、「テナント管理サイト テンプレートの拡張」セクションのカスタマイズ手法を使用して追加できます。

次の 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 アプリケーションを作成する方法を示します。

注:

このサービス アプリケーション用のスクリプトでは、 PartitionMode パラメーターではなく Partitioned パラメーターを使用します。

$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 Service

Word Automation Service のサービス アプリケーションは、パーティション モードをサポートします。 プロキシを作成するためのコマンドレットはありません。

次の Microsoft PowerShell スクリプトは、パーティションモードで Word Automation Service のサービス アプリケーションを作成する方法を示します。

$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 コマンドレットを使用し、スクリプトをファーム アカウントとして実行することをシミュレートします。

2 つのスクリプトが必要です。1 つ目のスクリプトでは UPA を作成し、2 つ目のスクリプトでは 1 つ目のスクリプトを呼び出します。

次の Microsoft PowerShell スクリプトは、ユーザー プロファイル サービス アプリケーションをパーティション モードで作成し、カスタム サービス プロキシ グループに追加する方法を示しています。..

注:

このスクリプトを直接実行 しないでください 。そうしないと、ユーザー プロファイル同期サービス インスタンスを開始できません。 このスクリプトはローカルに保存し、その場所に注意する必要があります。

<#
    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} 

次の 2 つ目のスクリプトでは、UPA の作成スクリプトを呼び出し、必要なサービス インスタンスを開始するために必要な作業を実行します。 UPA の作成スクリプトの場所は、 $upaScriptFile 変数で更新する必要があります。 さらに、一部の必要なアクセス許可が 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

Information Rights Management の構成

マルチテナントに対する Information Rights Management のサポートは、SharePoint サーバーの全体管理 Web サイトまたは更新された Microsoft PowerShell コマンドレットを使用して有効にすることができます。

サーバーの全体管理 を使用して Information Rights Management をオンにする

  1. この手順を実行するユーザー アカウントが、サーバーの全体管理を実行しているコンピューターで SharePoint のファームの管理者グループおよび管理者グループのメンバーであることを確認します。

  2. サーバーの全体管理 の Web サイトから、[ セキュリティ] ページに移動します。

  3. [ セキュリティ] ページで、[ Information Rights Management の構成] に移動します。

  4. [ Information Rights Management] ページで、[ この RMS サーバーを使用する] をクリックします。

  5. [ マルチテナント型の構成で、テナント レベルでの IRM 設定の構成を許可するには、このチェック ボックスをオンにします] というチェック ボックスに必ずチェックを入れてください。

Microsoft PowerShell を使用して Information Rights Management をオンにする

  1. 次のメンバーシップがあることを確認します。
  • SQL Server インスタンスにおける securityadmin 固定サーバー ロール。

  • 更新するすべてのデータベースに対する db_owner 固定データベース ロール。

  • PowerShell コマンドレットを実行しているサーバー上の管理者グループ。

    管理者は Add-SPShellAdmin コマンドレットを使用して、SharePoint Server 2013 のコマンドレットを使用するアクセス許可を付与できます。

    注:

    権限がない場合は、セットアップ管理者または SQL Server 管理者に連絡して権限を要求してください。 PowerShell のアクセス許可の詳細については、「 Add-SPShellAdmin」を参照してください。

  1. SharePoint 管理シェルを開きます。

  2. PowerShell コマンド プロンプトで、次のコマンドを入力します。

Set-SPIRMSettings -IrmEnabled -UseActiveDirectoryDiscovery -SubscriptionScopeSettingsEnabled

テナントの管理サイト内に IRM の組み込み構成オプションはありません。 構成を適用するには、次のスクリプトに示すとおり Set-SPSiteSubscriptionIRMConfig コマンドレットを使用します。

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

このような構成は、テナント プロビジョニングの一部として実行されます。

テナントのプロビジョニングと管理

このセクションでは、テナントのプロビジョニングやマルチテナント環境のカスタマイズを行うプロセスとアプローチについて説明します。

テナントのプロビジョニング

テナントを作成するには、表の手順を実行します。

タスク
手順
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. サイト購読に割り当てる 1 つ以上のサイト コレクションを作成します。
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 テンプレートを使用するテナント管理サイトを作成する方法を示しています。 テナントが Enterprise Feature Pack を使用するように構成されている場合、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 などの他のテナント構成を含めることができます。 このようなスクリプトは、関数またはカスタム コマンドレットにカプセル化されるため、将来のテナントで繰り返し実行できます。

ワークフロー サービス

SharePoint Server 2013 では、完全な宣言型作成、REST とサービス バス メッセージング、柔軟な拡張性、管理されたサービスの信頼性などのエンタープライズ機能など、ワークフローが大幅に強化されました。 SharePoint 2013 では, .NET Framework 4.5 の Windows Workflow Foundation コンポーネントに構築された新しいワークフロー サービスを使用できます。 新しいサービスは ワークフロー マネージャー と呼ばれ、企業で中心的な役割を果たすように設計されています。

SharePoint 2013 ワークフロー プラットフォームについては、新しいワークフロー マネージャー サービスをダウンロードしてインストールし、SharePoint Server 2013 ファームと通信できるように構成しないと、使用しているツールにかかわらず使用できません。 ワークフロー マネージャー Service for SharePoint 2013 をインストールして構成する方法の詳細については、「SharePoint Server のワークフローをインストールして構成する」を参照してください。

ワークフロー サービスを構成するには、 Register-SPWorkflowService コマンドレットを使用してパーティション モードでワークフロー サービス マネージャーにファームを登録します。 このファーム登録を行う際に、 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 ファイル) に展開できます。 リボンのカスタマイズは、 RegistrationId および RegistrationType 属性を使用して特定のリストの種類に範囲指定できます。 また、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>

[サーバー] リボンをカスタマイズする方法の詳細については、「サーバー リボン のカスタマイズ」を参照してください。

カスタム プロパティを使用してサイト購読を拡張する

サイト購読サービス アプリケーションは、管理のカスタム プロパティとテナントのカスタム プロパティの両方を格納できます。 サポートするプロパティの種類には次の値があります。

  • string

  • int

  • long

  • bool

  • Guid

  • DateTime

カスタム プロパティを使用すると、テナントのクォータ管理などのテナント管理機能を拡張できます。

次の 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 でのホストに関する一般的なガイダンス