SharePoint Content Deployment Wizard の運用TIPS

サイトコレクション内に存在するコンテンツを「移動」させることに対して、SharePoint が標準で提供している機能は、残念ながら貧弱です。管理ツール stsadm は、サイト単位でのエクスポート・インポートが可能ですが、それ以下の単位(例えばリストやライブラリ)には利用できません。

一方、[コンテンツの構造と管理] 画面はアイテム・ファイル単位までサポートします。しかし、逆にリスト・ライブラリ単位を移動できず、かつ基本的にデータがフラットであることが前提で、フォルダをサポートしていないのが欠点です。つまり、主にドキュメントライブラリなど、深い階層を持つコンテンツの移動は実質的に不可能なのです。(恐ろしく手間がかかります)

そこでお勧めなのが、CodePlex で提供されている「SharePoint Content Deployment Wizard」。

フォルダも含めたリスト、ライブラリの柔軟なエクスポートとインポートに対応しています。動作も高速で、かつ exe 単体で動作するので、レジストリを一切汚さない親切仕様!

─なのですが。まあ、実のところ、運用してみると、いろいろと問題がでてきます。

オープンソースですから Microsoft にサポートを求める訳にもいきませんし。もうちょっい英語力に自信ががあれば、原作者さんに直接聞くのだけど…(苦笑)

しかし、便利かつ強力なツールであることは間違いありませんので、放置するのも勿体無いです。そんな SPCD Wizard の運用 TIPS を以下にまとめてみました。※都度、追記していくつもりです。

◆ツールのインストール場所

MOSS がインストールされているサーバ環境である必要があります。クライアントでは動作しません。

◆同時起動可能

多数のアイテムを含むリストやライブラリを抽出しようとすると、当然時間がかかります。しかし、Wizard を複数起動して、同時並行作業することが可能です。実行時のリソースを監視しましたが、驚くほど低負荷です。ただ、経験上、3つ同時に動かすと、偶発的になにかしらのコンフリクトが起こって、エラーになることがありました。同時起動は2枚までに留めておくといいかもしれません。

◆Include security オプション

アクセス権設定を含めたエクスポートを行うオプション─の筈なのですが、私が試した限り、リスト・ライブラリ単位でのインポートでは、何度試しても駄目でした。ログを見る限り、しっかりエクスポートはされているようなのですが、実際にインポートされたコンテンツには反映されません。Include security オプションは処理量が大きいので、 None が基本ですね。

もしかしたら、サイト単位でなら有効なのかも?

◆情報管理ポリシー

そのリスト・ライブラリに適応された情報管理ポリシーは失われません。ただ、サイトコレクションのポリシーを適応している状態で、コレクションをまたいだ移動をすると…。試してませんが、まず駄目でしょう。

◆更新日・更新者・作成者・作成日が更新されてしまう

Wizard の正常な挙動では、更新日・更新者・作成者・作成日、いずれも元の値を引き継ぎます。しかし、まれに「一部のファイルだけ更新されてしまう」現象が発生することがあります(フォルダは大丈夫)。そして、この現象は、同じコンテンツを同じ場所にインポートする限り、100%再現します。

私が試した限り、この現象は、インポート先に既に同一URLのライブラリ(DocLib1とか危険)が存在し、かつその中に既にファイルが登録されている場合に発生することがあるようです。そのコンテンツがゴミ箱に入っていて、既にサイトに存在しない場合でも駄目みたいです(回復できるから?)

ですが、不思議なことに、同じ .cmp ファイルを、同じ場所にインポートしてやると(つまり2回インポートする)、全ての値が正常になります。これも再現性があります。

◆インポート時に意味不明なエラーで失敗

エクスポート時には特にエラーも警告も出なかったのに、インポート時にいきなり下のような画面がでてエラー(失敗)することがあります。

この原因は、エクスポート時のログを見ると判ります。これは seizo サイト配下の o ライブラリをエクスポートした際のログです。

Progress: エクスポート を初期化しています。
Progress: エクスポート 対象のオブジェクトを計算しています。
Progress: オブジェクトをディスクに対してシリアル化しています。
Progress: 種類 Site のオブジェクトの処理を開始しています。
Progress: 種類 Site のオブジェクトの処理を完了しました。
Progress: 種類 Folder のオブジェクトの処理を開始しています。
Progress: フォルダ /seizo/o のエクスポート中。
Progress: フォルダ /seizo/o/Forms のエクスポート中。
Progress: 種類 Folder のオブジェクトの処理を完了しました。
Progress: 種類 File のオブジェクトの処理を開始しています。
Progress: ファイル Lists/List5/DispForm.aspx のエクスポート中。
Progress: ファイル seizo/o/Forms/AllItems.aspx のエクスポート中。
Progress: ファイル seizo/o/Forms/AllItems1.aspx のエクスポート中。
Progress: ファイル seizo/o/Forms/DispForm.aspx のエクスポート中。
Progress: ファイル seizo/o/Forms/DispForm1.aspx のエクスポート中。

─何故か余計な(指定していない) List/List5 の DispForm.aspx が含まれて居ます。
これがインポート失敗の原因です。
インポートの際、Wizard は DispForm.aspx をインポートしようとします。
しかし、親要素として存在すべき List5 は当然、存在しません。
そのため、エラーになります。

この現象は、まれに発生し、一度発生すると、同じコンテンツについては100%再現します。

何故、指定していない場所を読みに行くのか皆目検討がつかなかったのですが…。どうにもこの辺りの仕様がくさいです。

Import/Export characteristics
Since the Content Migration API is used, imports/exports have the following characteristics:
dependencies of selected content (e.g. referenced CSS files, master pages) are automatically included in the export - check ‘Exclude dependencies of selected objects’ to disable this all required content types, columns etc. are automatically included in the export

http://www.codeplex.com/SPDeploymentWizard

Problem 6: deploy partial content with references outside the selected scope
This is similar to Problem 5 except that we assume that the parent objects of the selected object exists in the destination database. In this situation you might assume that no problems should occur. That is not correct. When exporting items in a subtree per default all referenced objects (like images or documents) will be exported as well. Even if these objects are outside the selected scope. In this situation the export package will contain objects which might not have a parent in the destination database.
If the parent of this image or document does not exist on the importing site then the item cannot be imported and the deployment will fail.

http://blogs.technet.com/stefan_gossner/archive/2007/10/12/deep-dive-into-the-sharepoint-content-deployment-and-migration-api-part-5.aspx

つまり、エクスポート対象のコンテンツが、選択された範囲外に対して「references」を持っている場合、Wizard はそれも一緒にエクスポートしてしまう、という訳です。しかし、この「references」が何を指すのか、いまいち不明。直訳すると「参照」なんですが、ライブラリがリストを参照している…?

─色々なケースを当たってみたところ、おぼろげにながら見えてきました。

驚いたことに、MOSS のリストやライブラリは、その中に格納されたOfficeファイル(Word、Excel、Powerpoint の2003で確認)の中に貼られた、同一サイトコレクション内の別コンテンツへのリンクを「参照」として把握しているようです。上の場合ですと、同サイト内の Lists/List5/DispForm.aspx?id=xxxx へのリンクを本文内に持ったWord が存在していました。

このことから、対応策として4つの方法が考えられます。

1.外部リンクを持ったファイルを除いてエクスポートする

SharePointの全文検索機能を使い、そのリスト・ライブラリの中を、参照しているURLをキーにして検索すれば、原因となるファイルが特定できます。そのファイルを、[コンテンツの構造と管理]で一時的にどこかのライブラリに移動します。その状態でエクスポート→インポート。最後に、再び [コンテンツの構造と管理] を使って、そのファイルをあるべき場所に移動させます。対象ファイルが少ない場合にお勧めです。

2.参照している要素を全て指定してエクスポートする

一度エクスポートすれば、ログから何をエクスポートしているのかが判ります。その情報を整理して、もう一度、それらの要素を明示的に指定(EXPORT)してエクスポートします。オプションの Exclude descendents (その要素だけを指定)と Include all descendents(その要素以下を全て指定)を上手く使い分けてください。要素の親子関係を保つ必要がありますので、例えば DocLib1/hoge/hogehoge/xxxx.doc が参照要素だった場合、まず DocLib1 を Exclude、次に hoge を Exclude、そして hogehoge を Include、という風に指定します。対象ファイルがやや多いときにお勧めです。

なお、ひとつでも要素を取りこぼすと、インポートに失敗しますので、ログの分析は慎重に。

また、仕様上当然ではありますが、この方法でエクスポートされた .cmp ファイルをインポートすると、インポート先に必要のないコンテンツ(この場合だとライブラリDocLib1)が出来てしまいます。削除すれば済むことなのですが、既に同じ URL のコンテンツが存在した場合、既存のコンテンツに影響がでます(上書きされます)ので、注意が必要です。

加えて、この方法の最大の問題点は、エクスポートするコンテンツが増え続ける、点です。容量の問題ではなく、「関連性」が問題になります。たとえば、B を追加でエクスポート指定したところ、もしB が C に対して関連性を持っていた場合、C がエクスポートに含まれてしまい、インポートは失敗します。そこで、今度は C も追加したところ、実は C は D に対して関連性があり……以下エンドレス。

私はこれでドはまりしました。こうしたケースでは、次の 3 もしくは 4 がお勧めです。

3.参照されているリスト・ライブラリを削除してしまう

乱暴ですが、参照先が多い場合、非常に効果的な方法です。参照されているリスト/ライブラリを丸ごと削除してしまいます。その後、移動対象コンテンツのエクスポートを行うと、「参照」はリンク切れと判断されるようで、エクスポートに含まれません。インポート後、ゴミ箱から削除したリスト/ライブラリを戻してやれば完了です。

しかし、テスト環境ならともかく、本番のコンテンツを一時とはいえ「削除」することは怖いですね。一応、15000ファイル、5GB のドキュメントライブラリできちんと戻ることは検証済ですが。

4.インポート先に手作業で親要素を作成する

(2)の改良版です。ようは、エクスポートされたコンテンツに対して、インポート時に親要素がきちんと存在していれば良い訳です。そこで、エクスポートログを分析し、指定外のコンテンツについても、その親要素をインポート先サイトに作成します。

たとえば、DocLib10/フォルダ2/テスト.xls が指定外にエクスポートされていた場合。移行先サイトに「DocLib10」を作成し、その中に「フォルダ」フォルダを作成し、その中に「フォルダ2」フォルダを作成しておきます。これでインポートすれば、テスト.xls はエラーの原因になりません。

この方法なら、ログの分析さえ丁寧にすれば、1回のエクスポート→インポートで作業が終了します。

SharePoint Content Deployment Wizard (beta)


これまでのコメント

  1. poteto より:

    AGENT: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; MS-RTC LM 8; .NET CLR 3.5.21022; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.0.30618)
    先日、フォーラムにて質問させていた件で、結果的にサブサイトの再構\築(再作成)を行った件ですが、その時、リストの移行にこのツールを使いました。
    ※以前のsaruhikoさんのブログを発見しました(^^

    リストを移行させた理由としては、アイテムの作成者を引き継ぎたかったためです。
    で、オプションの指定ですが、
    ・Export Method:ExportAll
    ・Include Security:All
    にしないと引き継がれませんでした。

    そして問題が・・・
    以下の件は、ツールの問題ではなく、stsadm.exe のExport・Importの仕様 or バグ かもしれませんが、日付列に不思議なことが起こります。
    ツールにて移行したリストは、アイテムごとの権限の“読み取りアクセス権”“編集アクセス権”共に『所有するアイテムのみ』にしてあります。つまり、投稿権限のユーザーは、自分が作成したアイテム以外、閲覧すらできなくしています。
    うまくいった!!と思ったら、ユーザーから『日付が消えちゃってる』という問い合わせ。
    調べてみたところ、作成した日付列は、デザイン権限以上あれば表\示されるのですが、投稿権限以下は、日付列の表\示ができない状態となっていたのです。
    対処方法は、
    (1)移行元リストの、作成した日付列のデータをエクセルにコピー(並び順を検討する必要あり)
    (2)Exportする前に、日付以外の種類(今回は1行テキスト)に変更。
    (3)ツールでExport。
    (4)移行先リストにツールでImport。
    (5)(2)で変更した種類を日付列に戻す。
    (6)(1)でエクセルにコピーしておいたデータをリストに上書きで貼\り付ける。(データシートビュー)
    と、かなり手間が掛かりました。。。

    色々と問題はありますが、このツールがなければ、元に戻すことが出来なかったのも事実ですので、強力なツールであることは変わりませんね!

    長文、失礼しました。

  2. saruhiko より:

    AGENT: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    お疲れ様でした〜^^

    >リストを移行させた理由としては、アイテ
    >ムの作成者を引き継ぎたかったためです。
    >で、オプションの指定ですが、
    >・Export Method:ExportAll
    >・Include Security:All
    >にしないと引き継がれませんでした。

    あれ?
    私の環境では、エクスポート時に
    ・Include Security:None 
    でも、インポート時に
    ・UserInfoUpdate:ImportALL
    としてやれば、作成者・作成日時・更新者・更新日時が引き継がれました。

    >stsadm.exe のExport・Importの仕様 or
    >バグ かもしれませんが、日付列に不思議
    >なことが起こります。

    確かに不思議ですね〜
    そもそも、MOSSには列単位でユーザに応じて表\示/非表\示する機能\はないはずですので、どうしてそんなことが起こるんでしょう?
    実は、裏機能\的にもっている…?

  3. poteto より:

    AGENT: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; MS-RTC LM 8; .NET CLR 3.5.21022; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.0.30618)
    お疲れ様です。

    > あれ?
    > 私の環境では、エクスポート時に
    > ・Include Security:None 
    > でも、インポート時に
    > ・UserInfoUpdate:ImportALL
    > としてやれば、作成者・作成日時・更新者・更新日時が引き継がれました。

    ほほぅ、そうだったんですか。
    後でやってみます。

    > 確かに不思議ですね〜
    > そもそも、MOSSには列単位でユーザに応じて表\示/非表\示する機能\はないはずですので、どうしてそんなことが起こるんでしょう?
    > 実は、裏機能\的にもっている…?

    まったくもって謎です。
    まぁ、謎だらけのツールなので、今では『そういうもんだ』と言い聞かせてますが(苦笑);

  4. やまちゃん より:

    AGENT: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2
    いつも参考にさせてもらっています。
    saruhikoさん、私のBlogへのリンク貼\って頂きありがとうございました。

    列単位で非表\示にする機能\は、SharePointのオブジェクトモデル(開発)で実装可能\です。
    GUI上ではありませんが、SharePointサーバー上で動かすプログラムで設定変更が可能\です。

    不要かもしれませんが、SPFieldオブジェクトの列非表\示プロパティのMSDNを貼\り付けます。
    http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.spfield.hidden.aspx

  5. saruhiko より:

    AGENT: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Sleipnir/2.8.5)
    やまちゃんさま、コメントありがとうございます。
    勉強になりました。
    ほ〜。出来るんですね!
    それなら標準で装備してくれと(苦笑)
    非常に興味はそそられますが、私の基本的なスタンスは「極力標準機能\の枠内で利用する」ことですので、怖くて手がでないですね〜。
    どこかのベンダーさんが、インストール/アンインストールが可能\なアドオン機能\として開発してくれると嬉しいんですけどねぇ…。

login

Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9