発行機能とサイトテンプレートについて

こんにちは、SharePoint サポートの 森 健吾 (kenmori) です。

今回の投稿では、SharePoint で発行インフラストラクチャおよび発行機能を使用した際にテンプレートとして保存できない、または保存したとしてもサイトを作成した際に問題が生じるという現象についてご説明します。

発行機能が有効化されたサイトをテンプレート化することはサポート対象外 

結論から言いますと、SharePoint Server でサイトコレクションの機能で発行インフラストラクチャ機能や、サイトの機能で発行機能を一度でもアクティブ化した場合、サイトをテンプレートとして保存することはサポートされません。
比較的周知されている制限事項とは思いますが、あらためてこの場でもご説明させていただきます。

このようなテンプレートを使用してサイトを作成した際には、サイト内のリソースが正しく展開されず、発行機能が提供するページを表示すると、エラーに遷移する状態となります。これは製品の制限事項です。
詳細は下記サポート技術情報をご確認ください。

タイトル : SharePoint Publishing feature does not support "Save Site as Template" option
アドレス : https://support.microsoft.com/kb/2492356/

SharePoint としては、一度機能をアクティブ化した際には [テンプレートとして保存] メニューを非表示する対処を実施しています。しかし、機能で機能自体を制御するには制限があり、完全に制御できることはありません。そのため、抜け道を使用して無理やりテンプレート化してしまうと、作成したサイトに様々な問題が発生します。

 

テンプレート化の主な操作

(方法 1 : [サイトの設定] から [テンプレートとしてサイトを保存] をクリックする。)

 

上記サイトの操作メニューは、発行機能のアクティブ化のタイミングで非表示にするよう実装しています。一度でも発行機能をアクティブ化したら非対応という制限に対し、SharePoint Server 2013 では、ユーザーに気付かせるためにも、非アクティブ化したサイトに対してもこのメニューを隠すような仕組みを設けていますが、仕組み上完全にテンプレート化させないようにすることはできません。

 

(方法 2 : SharePoint Designer のリボン メニューより [サイト] - [テンプレートとして保存] をクリックする。)

 

SharePoint Designer のリボン メニューは、サイトの機能のアクティブ化に応じて表示・非表示を制御できるように作られていないため、発行サイトをアクティブ化したサイトもテンプレート化できてしまいます。
SharePoint は製品として、発行インフラストラクチャまたは発行機能をアクティブ化したサイトのテンプレート化はサポートしていないため、この操作で作成したテンプレートが正常動作する保証はありません。

 

テンプレートとして保存とは

サイトをテンプレートとして保存した場合、サイト上に展開されているリスト、コンテンツ タイプ、列、展開されているリソース、アクティブ化されている機能などが、サイトの特殊性などを全く考慮せず、統一的な順序でXML 形式で保存されます。コンテンツを含むにチェックを入れれば、ユーザー データなどもこれに含まれます。

サイトを作成した際には、WSP 内に存在する manifest.xml やその参照先にある Feature.xml などに保存された情報をもとに、順にサイトコンテンツや機能のアクティブ化を進めていく動作です。

SharePoint Server 2010 以降で、テンプレートとしてサイトを保存すると、*.wsp というファイルが作成されます。このファイル形式は CAB 圧縮形式ですので、拡張子を *.cab に変更し、定義情報を展開することができます。
(wsp ファイルの中身)

 

 

(manifest.xml の定義)

 

上記は、チームサイトをそのままテンプレートとして保存 (teamsite.wsp) し、拡張子を *.cab に変更して解凍した状態です。
フォルダ直下には manifest.xml があり、各フォルダは WSP が保持するサブ機能として構成されています。

フォルダを開いて、中に保存された XML ファイルをのぞいてみると、以下のような内容であることがわかります。Manifest.xml から参照される順に記載します。

1) *ListInstances リスト、リスト コンテンツ タイプ、リスト列
2) *Modules ファイルや Web パーツ
3) *WebTemplate サイトの定義
4) *WebEventReceivers サイト イベント レシーバー定義
5) *PropertyBags サイトのプロパティ ハッシュ (SPWeb.Properties)

サイト定義に関する情報があれば、各 XML 定義の内容について、より深く確認することができます。

タイトル : サイト定義と構成
アドレス : https://msdn.microsoft.com/ja-jp/library/aa978512(v=office.14).aspx

 

発行機能について

発行インフラストラクチャおよび発行機能は、一言で言い表すことは難しいですが様々なページをデザインし発行するための多くの機能を保持します。過去のバージョンから幾度にわたる改変を繰り返した巨大な機能です。この機能をアクティブ化すると、多くのサブ機能やリソースがサイト上に展開されます。

 

発行機能がアクティブ化されたサイトをテンプレート化した場合、発行機能によってアクティブ化されるリソース自体と、発行機能またはその機能が内部的に依存している非表示の機能 (PublishingPrerequisites, PublishingResources, Navigation, PublishingLayouts, HtmlDesign 等を含む10 数個の機能) がアクティブ化されているという状態が重複してテンプレートの中に入ります。

発行インフラストラクチャおよび発行機能は、巨大な機能であるだけでなく、内部的に展開された各リソースの依存関係があります。つまり、サブ機能のアクティブ化や、リソースが展開される順番を守らなければ、機能の一部が欠損しているという状況が発生します。

サイトテンプレートという機構は、上述の通り画一的な順序でコンテンツを XML 化し、戻すときは定義通りに順に復元していくということが原則となります。そのため、依存関係が複雑に定義された機能において、展開するはずのリソースがすでに存在していたり、展開されているはずの前提リソースがないため一部の処理がスキップされたりという状況を防ぐことはできません。つまり、この機構に沿ってテンプレート化を実現しようとしても、機能特有の依存関係を考慮した形で実装することが事実上不可能です。

 

想定される対処策について

1. 後で問題に気づいた場合

発行機能のテンプレート非対応のことを知らずにサイトを作ってしまった場合は、一部の機能が正常に動作しません。例えば、よくある現象としては、マスタページの選択画面、ページ レイアウトの作成画面、デザイン マネージャ画面の一部の画面などを表示しようとするだけでエラーになることが想定されます。

この制限事項を知らず、運用途中でサイトの異常に気づいた場合は、ユーザー コンテンツを保護するためにも、何とかするしか道はないでしょう。
その際の一時対処策は、発行インフラストラクチャ機能や発行機能のサブ機能を 1 つずつ強制 (上書き) アクティブ化することで、問題を解消できる場合があります。

 

機能の GUID 一覧

PublishingPrerequisites        a392da98-270b-4e85-9769-04c0fde267aa
PublishingResources            aebc918d-b20f-4a11-a1db-9ed84d79c87e
Navigation                     89e0306d-453b-4ec5-8d68-42067cdbf98e
PublishingLayouts              d3f51be2-38a8-4e44-ba84-940d35be1566
HtmlDesign                     a4c654e4-a8da-4db3-897c-a386048f7157

上記は発行機能によってアクティブ化されるすべてのサブ機能ではありませんが、過去事例等より強制アクティブ化によって実際に問題解決に至った機能を選んで記載しています。上記 GUID 一覧を参考にしていただき、下記の方法で強制アクティブ化します。

SharePoint On Premises の場合

 Enable-SPFeature <GUID> -url https://sharepoint/sites/site1 -Force
 # 複数の機能を同時にアクティブ化する場合は、上記を繰り返します。

 

SharePoint Online の場合

 Add-Type –VPath "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
 Add-Type –VPath "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
 $siteUrl = "https://tenant.sharepoint.com"
 $loginname = "admin@tenant.onmicrosoft.com"
 Write-Host "Please enter password for $($siteUrl):"
 $pwd = Read-Host -AsSecureString
 $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
 $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($loginname, $pwd)
 $siteFeatures = $ctx.Site.Features
 $ctx.Load($siteFeatures)
 $ctx.ExecuteQuery()
 $guid = [System.Guid]"<GUID>"
 $siteFeatures.Add($guid,$true,[Microsoft.SharePoint.Client.FeatureDefinitionScope]::None)
 # 複数の機能を同時にアクティブ化する場合は、GUID を変えて上 2 行を繰り返します。
 $ctx.ExecuteQuery();

Features.Add の第 2 引数を $true に設定することで強制します。

2. これから展開を考える場合

上記までに説明した通り、サイト テンプレートを使用できない背景をふまえ、発行機能を使用したサイトを大量に展開することをこれから想定する場合は、以下の 3 つの方法が有効と考えられます。

 

1. カスタム サイト テンプレート : サイト テンプレートを編集して、再度 CAB 圧縮する

サイトテンプレートを CAB 展開し、ONet.xml に発行機能へのアクティブ化を記載します。

ポイントとして、発行機能によって展開するリソースを一つも持たない状態でテンプレート化しておき、Onet.xml に発行機能としてアクティブ化する一番ルートの機能のみを追記します。

ただし、この方法は標準機能ではなく、カスタマイズという位置づけになりますため、作成者の責任において十分テストを実施した上で実装をご検討ください。

1. 発行機能を一度もアクティブ化していないサイトをテンプレート化し、テンプレートをダウンロードします。
2. 拡張子を *.cab にします。
3. フォルダ構成を維持して、ファイルを展開します。
4. <template name>WebTemplates\<template name> (例. teamsiteWebTeamplates\teamsite) フォルダ内にある ONet.xml をテキスト エディタで開きます。
5. SiteFeatures 要素の直下に下記の記述を加えます。

 <!--PublishingSite Feature-->
 <Feature ID="{f6924d36-2fa8-4f0b-b16d-06b7250180fa}" Name="FeatureDefinition/15/f6924d36-2fa8-4f0b-b16d-06b7250180fa" SourceVersion="15.0.0.0" />

6. WebFeatures 要素の直下に下記の記述を加えます。

 <!--PublishingWeb Feature-->
 <Feature ID="{94C94CA6-B32F-4da9-A9E3-1F3D343D7ECB}" Name="FeatureDefinition/15/94C94CA6-B32F-4da9-A9E3-1F3D343D7ECB" SourceVersion="15.0.0.0" />

タイトル : サイト定義 (Onet.xml) ファイル
アドレス : https://msdn.microsoft.com/ja-jp/library/ms432370(v=office.14).aspx

7. ファイルを上書き保存します。
8. 再度 CAB 圧縮し、拡張子を WSP として保存します。

補足
CAB 圧縮のためのツールが見つからない場合は、下記に makecab コマンドをラップした PowerShell スクリプトを記載しますので、よろしければお使いください。

 param(
 [string] $folder,   #input folder name
 [string] $outFile #output file name
 )

if ($folder.EndsWith("\") -eq $false){
   $folder += "\"
 }
 ".Set MaxDiskSize=0" | Out-File .\temp.ddf  -Encoding ASCII
 $files = get-childitem $folder -Recurse | where { $_.Attributes -ne "Directory"}
 foreach ($file in $files)
 {
   $destPath = $file.FullName.Replace($folder, "")
   '"' + $file.FullName + '" "' + $destPath + '"' | Out-File -Append .\temp.ddf  -Encoding ASCII
 }
 makecab /f .\temp.ddf
 Move-Item .\disk1\1.cab $outFile -Force
 Remove-Item .\disk1
 Remove-Item .\setup.inf
 Remove-Item .\setup.rpt
 Remove-Item .\temp.ddf 

上記をテキストエディタに貼り付け、makecab.ps1 として保存し、PowerShell より下記のように実行します。

 .\makecab.ps1 c:\teamsite teamsite.wsp

ただし、この方法では、あくまで機能をアクティブ化することしかできません。もし、ページ レイアウトや、デザイン パッケージ等、これらの機能をベースとしたより高度なカスタマイズを実装する場合は、下記対処策 2. 3. を検討ください。

2. プログラムや PowerShell コマンドレット等を使用して、サイト作成時にアクティブ化する。

アプリケーションを開発してサイトを作成し、同時に発行機能などをアクティブ化 (SPWeb.Features.Add, SPSite.Features.Add) する等すべてのプロビジョニングするようなツールを作成することは広く一般的に実施されていることです。

 spSite.Features.Add(featureId);

spWeb.Features.Add(featureId);

タイトル : SPFeatureCollection.Add method (Guid)
アドレス : https://msdn.microsoft.com/en-us/library/ms456927(v=office.15).aspx

3. カスタム サイト定義を開発する。

カスタムサイト定義を開発し、ページレイアウトや追加リソースについては、SPWebProvisioningProvider を使用することで追加するよう実装可能です。

タイトル : [方法] カスタム サイト定義および構成を作成する
アドレス : https://msdn.microsoft.com/ja-jp/library/ms454677(v=office.14).aspx

タイトル : SPWebProvisioningProvider class
アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spwebprovisioningprovider(v=office.15).aspx

こちらも、サイトの紹介のみとし割愛させていただきます。

 

その他、参考情報 2015.05.03 追記

コミュニティ サイトやコミュニティ サイト機能をアクティブ化したサイトについても、テンプレート化できません。下記もあわせてご参考にしていただけますと幸いです。

タイトル : コミュニティ サイトのコンテンツ展開における制限事項
アドレス : https://blogs.technet.com/b/sharepoint_support/archive/2015/05/01/3648890.aspx

その他、ブログ サイト、管理されたメタデータ機能の使用なども、テンプレートとして保存を実施すると問題が生じることが確認されています。

このように、サイト コンテンツ展開計画において、サイト テンプレートでサイトを生成する場合は、実際に対応しているか否かを事前に確認をとることが必要となります。何卒、ご了承くださいますようお願いいたします。

 

今回の投稿は以上になります。