Share via


Windows SharePoint Services 3.0 でコードを使用して作業するための開発ツールと技法 (パート 2/2)

概要 : Windows SharePoint Services ソリューション、ソリューション アーキテクチャ、および Windows SharePoint Services ソリューションを作成、展開、維持、アップグレードする技法について説明します。この記事はパート 2/2 です。(26 印刷ページ)

U2U (英語)、Patrick Tisseghem

2007 年 6 月

対象 : Windows SharePoint Services 3.0、Visual Studio 2005 Extensions for Windows SharePoint Services 3.0

目次

  • Windows SharePoint Services ソリューションを展開する

  • Windows SharePoint Services ソリューションを手動でパッケージ化する

  • コード アクセス セキュリティおよび Web パーツ ソリューション

  • ソリューションを管理する

  • まとめ

  • 作成者について

  • 追加情報

この記事は、「Windows SharePoint Services 3.0 でコードを使用して作業するための開発ツールと技法 (パート 1/2)」の続きです。

Windows SharePoint Services ソリューションを展開する

フロントエンド Web サーバーまたはアプリケーション サーバーへの Windows SharePoint Services ソリューションの展開は、図 19 に示すように 2 つの段階で実行します。

図 19. SharePoint ソリューションを展開する手順

SharePoint ソリューションを展開する手順

ソリューション ストアにソリューションを追加する

SharePoint ソリューションは、サーバー ファームで使用できるソリューション ストアに追加する必要があります。ソリューション ストアは構成データベースの一部で、さまざまな .wsp ファイルが保存されます。ソリューションをストアに追加するには、Stsadm.exe コマンドライン ユーティリティまたはプログラムによる方法を使用します。

Stsadm.exe を使用する

.wsp ファイルへの相対パスを指定すると、addsolution 操作で Stsadm.exe を呼び出すことができます。以下に例を示します。

stsadm –o addsolution –filename mysolution.wsp

注意

ソリューションをローカライズしている場合は、3 つ目のパラメータ lcid も使用できます。

Windows SharePoint Services 3.0 オブジェクト モデルを使用する

もう 1 つの方法では、Windows SharePoint Services によって公開されるオブジェクト モデルと通信する .NET Framework アプリケーションを作成することができます。SharePoint ソリューションをソリューション ストアに追加するには、以下のような 1 行のコードを使用します。

SPSolution solution = SPFarm.Local.Solutions.Add(@"C:\Package\MySol.wsp");

Microsoft.SharePoint.Administration 名前空間の SPFarm クラスでは、サーバー ファーム (ローカルに作成されたもの、またはリモートに参加したもの) に接続することができます。Add メソッドを呼び出すと、SPSolution クラスのインスタンスまたは SharePoint ソリューション ファイルへのパスであれば、SPSolutionCollection オブジェクトに新しいソリューションを設定できます。SPSolution インスタンスが返されます。このレベルでは、さまざまなプロパティおよびメソッドが公開されます。

ソリューションを展開する

次の手順として、Windows SharePoint Services が有効な Web サーバー (フロントエンド Web サーバーまたはアプリケーション サーバー) にソリューションを実際に展開します。ソリューションの展開は、以下の 3 つの方法で行うことができます。

  • Stsadm.exe を使用する

  • Windows SharePoint Services 3.0 オブジェクト モデルを使用する

  • SharePoint サーバーの全体管理 Web サイトを使用する

これらの展開方法を以下に説明します。

Stsadm.exe を使用する

Stsadm.exe には deploysolution オプションがあり、コマンド プロンプトを介してソリューションを展開するのに使用できます。ソリューション ストアでのソリューションの名前は、いずれかのパラメータであり、対象となるサイト コレクションの URL です。以下に例を示します。

stsadm –o deploysolution –name mysolution.wsp 
       –url http://litwareinc.com

1 つのサイト コレクションを対象とする代わりに、サーバー ファーム内の使用可能なすべてのサイト コレクションにソリューションをプッシュすることもできます。それには、以下のように allcontenturls パラメータを使用します。

stsadm –o deploysolution –name mysolution.wsp –allcontenturls

既定では、ソリューションは即座に展開されます。ただし、time パラメータを使用して、展開のスケジュールを設定することもできます。

allowgacdeployment および allowcaspolicies パラメータも非常に重要です。これらについては後でさらに詳しく説明しますが、 簡単に説明すると、allowgacdeployment は既定では true であり、Windows SharePoint Services でグローバル アセンブリ キャッシュにアセンブリを展開することができます。allowcaspolicies パラメータを使用すると、カスタム コード アクセス セキュリティ (CAS) ポリシー ファイルを作成し、対象となるサイト コレクションの Web.config ファイルでアクティブにすることができます。

Windows SharePoint Services 3.0 オブジェクト モデルを使用してソリューションを展開する

SPSolution インスタンスのレベルで、Deploy および DeployLocal の 2 つのメソッドを使用して、プログラムによりソリューションを展開することができます。いずれも、展開対象とするインターネット インフォメーション サービス (IIS) Web アプリケーションが設定された SPWebApplication オブジェクトのコレクションを受け入れることができます。以下のようにコレクションを設定します。

Collection<SPWebApplication> webapps = new Collection<SPWebApplication>();
SPWebApplication webapp = 
      SPWebApplication.Lookup(new Uri("http://litwareinc.com"));
webapps.Add(webapp);

いずれのメソッドでも、Web パーツ ソリューションに含まれるアセンブリをグローバル アセンブリ キャッシュに展開することができます。2 つのメソッドの違いは、図 20 に示すように、Deploy はソリューションの正確な展開時期を保存する DateTime パラメータで呼び出せるという点です。

図 20. 展開のスケジュールを設定した SharePoint ソリューション

展開のスケジュールを設定した SharePoint ソリューション

Deploy メソッドを使用したコード例を以下に示します。

solution.Deploy(DateTime.Now.AddMinutes(5), true, webapps, true);

DeployLocal メソッドの呼び出しの例を以下に示します。

solution.DeployLocal(true, webapps, true);

SharePoint サーバーの全体管理 Web サイトを使用してソリューションを展開する

管理者は、サーバーの全体管理の [サーバー構成の管理] ページに移動し、[ソリューション管理] を使用して、IIS Web アプリケーションへの Windows SharePoint Services ソリューションの展開を、今すぐ実行したり、指定した時刻に後から実行することもできます。

ソリューションの一部であるマニフェスト ファイルで、アセンブリをグローバル アセンブリ キャッシュに保存することが求められる場合、管理者に対して警告が表示されます。

Windows SharePoint Services ソリューションを手動でパッケージ化する

Windows SharePoint Services ソリューションの開発者は、多くの場合、SharePoint ソリューション パッケージを手動で作成します。以下のような必要がある場合は、手動で作成します。

  • .NET アセンブリを、グローバル アセンブリ キャッシュではなく、プライベート アプリケーション フォルダに展開する場合。

  • 展開中に適用する必要があるコード アクセス セキュリティのアクセス許可をソリューションに追加する場合。

  • Feature フォルダに対して既定で使用される名前とは違う場合。

  • Windows SharePoint Services ソリューションをローカライズする場合。

  • フィーチャー イベント ハンドラを、特定のタイプの Windows SharePoint Services ソリューション (Web パーツ ソリューションなど) に関連付ける場合。

  • リソース (XML ファイル、画像など) をソリューション パッケージに追加する場合。

ソリューション ファイルを手動で作成する場合は、以下の基本的な手順を実行します。

  1. フォルダ内の個々のソリューション ファイルをすべて収集します。この方法について具体的なガイドラインはありませんが、タイプの異なるソリューション ファイルを独自のサブフォルダに分けるのがベスト プラクティスです。

  2. Windows SharePoint Services ソリューション ファイルの構造を定義する .ddf ファイル (Diamond Directive File の略です) を作成します。このファイルには、出力先の .wsp ファイルを決定する個々のソリューション ファイルの一覧が含まれます。

  3. 入力に .ddf ファイル、出力に .wsp ファイルを指定して、コマンドライン ユーティリティ MakeCab.exe を実行します。

以下の短いチュートリアルで、すべての手順を示します。

チュートリアル : カスタム Web パーツ ソリューション パッケージを生成および展開する

Windows SharePoint Services 3.0 では開発者に対して、フィーチャーがインストール、アクティブ化、非アクティブ化、またはアンインストールされたときにカスタム コードを実行するオプションを提供しています。たとえば、特定のタスク リストに依存する Web パーツがあるとします。Web パーツ フィーチャーがアクティブ化されるときに、このタスク リストがサイト内のリストの一部であるかどうかをカスタム コードで確認することができます。一部ではない場合は、コードによりリストが作成され、フィーチャーが非アクティブ化されるとリストが削除されます。カスタム コードは .NET アセンブリにラップされ、フィーチャー レシーバ アセンブリと呼ばれます。

このチュートリアルでは、「Windows SharePoint Services 3.0 でコードを使用して作業するための開発ツールと技法 (パート 1/2)」で説明したとおりに Web パーツを作成してあることを前提としています。Web パーツ フィーチャーがインストール、アクティブ化、非アクティブ化、またはアンインストールされると、Windows SharePoint Services は非同期イベントを起動します。これらのイベントは、Microsoft.SharePoint.SPFeatureReceiver 抽象クラスから継承する .NET クラスを作成することにより、カスタム .NET アセンブリで処理できます。以下に、例のクラスと実装する 4 つのメンバを示します。

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;

namespace MSDN.Samples
{
    public class MSDNTaskListEventHandler: SPFeatureReceiver
    {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite sitecollection = (SPSite)properties.Feature.Parent;
            SPWeb web = sitecollection.RootWeb;
            try
            {
                // -- Check if list exists.
                SPList list = web.Lists["MSDN Tasks"];                
            }
            catch 
            {
                // -- If not, create the list.
                web.Lists.Add("MSDN Tasks", "A custom list", SPListTemplateType.Tasks);
            }
        }

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSite sitecollection = (SPSite)properties.Feature.Parent;
            SPWeb web = sitecollection.RootWeb;
            try
            {
                // -- Check if list is there, and if so, delete it.
                SPList list = web.Lists["MSDN Tasks"];
                web.Lists.Delete(list.ID);
            }
            catch (Exception ex)
            {
            }
        }

        public override void FeatureInstalled(SPFeatureReceiverProperties properties)
        {
        }

        public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
        {
        }
    }
}

コーディング作業により、2 つのアセンブリが作成されます。1 つ目のアセンブリには、Web パーツを提供するコードが含まれます。2 つ目のアセンブリには、前のコードが含まれます。この記事の執筆時点では、Visual Studio Extensions for Windows SharePoint Services 3.0 では、イベント ハンドラを Web パーツ フィーチャーの定義ファイルに接続することはできません。また、Web パーツ アセンブリは、グローバル アセンブリ キャッシュではなく、プライベート アプリケーション フォルダに展開する必要があります。このため、ソリューション パッケージを手動で作成する必要があります。

注意

以下の手順では、ソリューション コンポーネントを表す異なるファイルを構成する方法を独自の設定に適用し、Visual Studio 2005 ソリューションの一部にすることができます。

すべてのソリューション コンポーネントを収集するためのサブフォルダ 2 つを含むフォルダを作成します。1 つ目のサブフォルダにはアセンブリを保存し (この記事では Assemblies という名前です)、2 つ目のサブフォルダにはフィーチャーを定義する別の XML ファイルを保存します (この記事では Features という名前です)。Web パーツ アセンブリおよびイベント ハンドラ アセンブリを Assemblies フォルダにコピーします。

Features フォルダの下位に、SharePoint ソリューションに含める必要があるすべてのフィーチャーごとにサブフォルダを作成します。このチュートリアルでは、フィーチャーは 1 つだけです。フィーチャーの名前は MSDNTaskCreator で、Features フォルダにその名前のフォルダが含まれます。このフォルダのルートに、以下の XML を含む feature.xml ファイルを追加します。

<Feature  Title="MSDNTaskCreator" 
          Id="55312295-a323-4333-b875-1bbe8ef7fd04" 
          Description="Small Web Part creating a custom task item" 
          Version="1.0.0.0" Scope="Site" Hidden="FALSE" 
          ReceiverAssembly="MSDNFeatureEventhandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5e5a470a5445a8f1" 
          ReceiverClass="MSDN.Samples.MSDNTaskListEventHandler"
          DefaultResourceFile="core" xmlns="https://schemas.microsoft.com/sharepoint/">
  <ElementManifests>
    <ElementManifest Location="elementManifest.xml" />
    <ElementFile Location="MSDNTaskCreator.webpart" />
  </ElementManifests>
</Feature>

この XML と、Visual Studio Extensions for Windows SharePoint Services 3.0 で生成される XML の違いは何でしょうか。feature.xml ファイルには、以下の 2 つの属性が追加されます。

  • ReceiverAssembly 属性には、イベント ハンドラ コードが含まれる .NET アセンブリの完全な厳密名を含めます。

  • ReceiverClass 属性には、そのアセンブリ内のクラスの完全な名前を格納します。

ルート フォルダにマニフェスト ファイルを作成する必要があります。これは、Visual Studio Extensions for Windows SharePoint Services 3.0 によって生成されるものとは違います。以下に、その内容を示します。

<Solution SolutionId="d63d0395-96a4-449e-83ce-5f7239bbd3ad" xmlns="https://schemas.microsoft.com/sharepoint/" >
  <FeatureManifests>
    <FeatureManifest Location="MSDNTaskCreator\feature.xml" />
  </FeatureManifests>
  <Assemblies>
    <Assembly Location="MSDNTaskCreator.dll" DeploymentTarget="WebApplication" >
      <SafeControls>
        <SafeControl Assembly="MSDNTaskCreator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" Namespace="MSDN.Samples" TypeName="MSDNTaskCreator" Safe="True" />
      </SafeControls>
    </Assembly>
        <Assembly Location="MSDNFeatureEventHandlers.dll" DeploymentTarget="GlobalAssemblyCache" />
  </Assemblies>  
</Solution>

フィーチャーの名前に GUID が含まれなくなった点に注意してください。1 つ目のアセンブリ要素には、DeploymentTarget という名前の属性が含まれ、その値は GlobalAssemblyCache ではなく WebApplication です。.NET アセンブリの定義を含む 2 つ目のアセンブリ要素には、グローバル アセンブリ キャッシュに展開するイベント ハンドラ コードが含まれます。

これで .ddf ファイル (ここでは .wsp_structure.ddf という名前) を作成できます。DeploymentFiles フォルダ内に直接作成します。まず、以下のヘッダー情報を追加します。

;
; *** .ddf file for generating SharePoint solution.
;
.OPTION EXPLICIT     ; Generate errors 
.Set CabinetNameTemplate=MSDNTaskCreatorWebPart.wsp     
.set DiskDirectoryTemplate=CDROM ; All cabinets go in a single directory
.Set CompressionType=MSZIP;** All files are compressed in cabinet files
.Set UniqueFiles="ON"
.Set Cabinet=on
.Set DiskDirectory1=Package

ヘッダーには、以下の 2 つの非常に動的なパーツが含まれます。

  • CabinetNameTemplate は SharePoint ソリューション ファイルの名前 (MSDNTaskCreatorWebPart.wsp) に設定します。

  • DiskDirectory1Package に設定します。これは、生成された .wsp ファイルを含めるディレクトリです。

.ddf ファイルの 2 つ目のパーツでは、パッケージの構造を定義します。

; *** the manifest file
manifest.xml manifest.xml

; *** the feature files
Features\MSDNTaskCreator\feature.xml MSDNTaskCreator\feature.xml
Features\MSDNTaskCreator\elementManifest.xml MSDNTaskCreator\elementManifest.xml
Features\MSDNTaskCreator\MSDNTaskCreator.webpart MSDNTaskCreator\MSDNTaskCreator.webpart

; *** the assemblies
Assemblies\MSDNTaskCreator.dll MSDNTaskCreator.dll
Assemblies\MSDNFeatureEventhandlers.dll MSDNFeatureEventhandlers.dll

.ddf ファイルは MakeCab.exe の入力用です。MakeCab.exe は、Microsoft キャビネット SDK (C:\Program Files\Microsoft Cabinet SDK) をインストールすると入手できるツールであり、Smart Devices SDK (C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SDKTools) の一部でもあります。

注意

Microsoft キャビネット SDK は、Internet Client SDK: Microsoft Cabinet SDK からダウンロードできます。

パッケージ化および展開を容易にするために、以下の内容のバッチ ファイルを作成します。

set MakeCabTool=c:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SDKTools\makecab.exe 
set SPAdminTool=%CommonProgramFiles%\Microsoft Shared\web server extensions\12\BIN\stsadm.exe

"%MakeCabTool%" /f wsp_structure.ddf
"%SPAdminTool%" -o addsolution -filename package\ MSDNTaskCreatorWebPart.wsp
"%SPAdminTool%" -o deploysolution -name MSDNTaskCreatorWebPart.wsp -immediate -allowGACDeployment -url http://litwareinc.com

最初の 2 行は、Makecab および Stsadm コマンドライン ツールへのパスの設定です。その次に、ソリューション パッケージを作成する行があります。

makecab.exe /f wsp_structure.ddf

実行すると、MSDNTaskCreatorWebPart.wsp が Package フォルダに表示されます。次の行では、以下のコマンドを実行して、サーバー ファーム内のソリューション ストアに MSDNTaskCreatorWebPart.wsp を追加します。

stsadm.exe -o addsolution -filename Package\MSDNTaskCreatorWebPart.wsp

バッチ ファイルの最後の行は、いずれかのサイト コレクションにソリューションを展開します。サーバーの全体管理の [サーバー構成の管理] タブで [ソリューション管理] ページを使用するか、コマンド プロンプト ウィンドウをもう一度開いて以下のコマンド ラインを実行します。

stsadm.exe -o deploysolution -name MSDNTaskCreatorWebPart.wsp -local -allowGACDeployment -url http://litwareinc.com

Web パーツ フィーチャーがインストールされますが、アクティブ化はされません。フィーチャーをアクティブ化するには、[サイト コレクション フィーチャー] ページを開き、[アクティブ化] ボタンをクリックします。FeatureActivated イベントの起動時に実行するコードがあるので、MSDN Task リストが作成されます。この機能を非アクティブ化すると、サイト コレクションのルート サイトからこのタスク リストが削除されます。

コード アクセス セキュリティおよび Web パーツ ソリューション

多くのロックダウン環境では、管理者はカスタム コード コンポーネントに対して完全な信頼を許可しません。管理者は、ソリューションの展開先として、アクセス許可を個別に付与できる Web アプリケーションの \bin フォルダを選択する場合があります。関連する手順を見てみましょう。

特定の市の天気情報を返す Web サービスに接続する小規模な Web パーツを見てみるとわかります。Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 を使用してこの Web パーツを構築および展開すると, .NET アセンブリはグローバル アセンブリ キャッシュに展開されます。開発用コンピュータでこのプロセスに介入して、ソリューション生成プロセスや展開の異なる設定を行うことはできません。グローバル アセンブリ キャッシュ内に展開されるため、Web パーツには完全な信頼が付与され、Web サービスへの接続についてセキュリティ上の問題は生じません。

このシナリオは、管理者が Web パーツ アセンブリの展開先をグローバル アセンブリ キャッシュにしている場合は機能します。ただし、Web パーツ アセンブリは IIS Web アプリケーションのプライベート \bin フォルダに保存されることがあります。この場合、Web パーツの開発者は、管理者によって web.config ファイルで設定されている信頼レベルに依存します。結局、以下のチュートリアルで説明するように、この例の天気予報 Web パーツのような機能を実行する Web パーツでは、セキュリティ上の問題が生じる可能性があります。

チュートリアル : コード アクセス セキュリティおよび Web パーツ ソリューション

図 21 に示すように、市の天気情報を返す小規模な Web サービスがあり、その情報を使用する Web パーツがあるとします (この例は、どのようなタイプの Web サービスでも練習できます)。

図 21. 天気予報 Web サービスを使用する Web パーツ

天気予報 Web サービスを使用する Web パーツ

Web パーツ アセンブリを、Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 を使用する場合の既定の場所であるグローバル アセンブリ キャッシュではなく、IIS Web アプリケーションのプライベート アプリケーション フォルダに展開するには、これを実施するマニフェスト ファイルで変更を加えます。以下の例に示すように、Assembly 要素のレベルで DeploymentTarget 属性を GlobalAssemblyCache ではなく WebApplication に設定します。

<Solution SolutionId="1de3b0fc-78e9-4fe6-ae63-51ea50109982" xmlns="https://schemas.microsoft.com/sharepoint/" >
  <FeatureManifests>
    <FeatureManifest Location="WeatherWebPart\feature.xml" />
  </FeatureManifests>
  <Assemblies>
    <Assembly Location="WeatherWebPart.dll"        DeploymentTarget="WebApplication" >
      <SafeControls>
        <SafeControl Assembly="WeatherWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" Namespace="WeatherWebPart" TypeName="WeatherWebPart" Safe="True" />
      </SafeControls>
    </Assembly>
  </Assemblies>
</Solution>

次に、Windows SharePoint Services ソリューションを手動で作成する必要があります。以下の .ddf ファイルに、Web パーツ ソリューションを構成する異なるコンポーネントをパッケージ化する方法を示します。

.OPTION EXPLICIT 
.Set CabinetNameTemplate=WeatherWebPart.wsp
.set DiskDirectoryTemplate=CDROM ; All cabinets go in a single directory
.Set CompressionType=MSZIP ;** All files are compressed in cabinet files
.Set UniqueFiles="OFF"
.Set Cabinet=on
.Set DiskDirectory1=Package

manifest.xml manifest.xml
assemblies\WeatherWebPart.dll WeatherWebPart.dll

Features\WeatherWebPart\feature.xml  WeatherWebPart\feature.xml
Features\WeatherWebPart\elementManifest.xml WeatherWebPart\elementManifest.xml
Features\WeatherWebPart\WeatherWebPart.webpart WeatherWebPart\WeatherWebPart.webpart

入力先に .ddf ファイルを指定して Makecab.exe を呼び出すと、Windows SharePoint Services ソリューションが生成されます。

makecab.exe /f WeatherWebPart.ddf

コマンド プロンプト ウィンドウで以下のコマンドを実行すると、ソリューションをソリューション ストアに追加できます。

stsadm.exe -o addsolution -filename package\weatherwebpart.wsp

次に、サーバーの全体管理および [ソリューション管理] ページに移動します。ここからソリューションを展開できます。マニフェスト ファイルでは、アセンブリをグローバル アセンブリ キャッシュに展開する必要がないので、警告は表示されません。続行してソリューションをいずれかの IIS Web アプリケーションに展開します。IIS Web アプリケーションに関連付けられている物理フォルダ (既定では Inetpub\wwwroot\wss\VirtualDirectories\IIS Web アプリケーション名 にあります) で、アセンブリが \bin フォルダ内で使用可能であることを確認することをお勧めします。

web.config ファイルで信頼レベルが完全信頼に設定されていない場合は、図 22 に示すように、天気予報 Web パーツを実行しようとすると例外が発生します。

図 22. プライベート アプリケーション フォルダに展開された天気予報 Web パーツ

プライベート アプリケーション フォルダに展開された Web パーツ

プライベート アプリケーション フォルダに展開された天気予報 Web パーツにより、予期しない問題が発生します。ただし、エラーは予期されます。[管理ツール] にある Windows イベント ビューアを開くと、エラーの詳細を以下のように確認できます。"型 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。"

つまり、Web パーツには、Web サービスと通信するアクセス許可は付与されません。この問題を解決する方法の 1 つに、web.config ファイルで信頼レベルを完全信頼に上げる方法がありますが、この方法には危険が伴います。信頼レベルを上げた瞬間から、プライベートに展開されているすべてのアセンブリが、グローバル アセンブリ キャッシュに展開されているアセンブリと同じ基本的なアクセス許可を持つことになります。Web パーツを SharePoint ページ内で正しく実行するのに必要なアクセス許可を要求し、その要求をマニフェスト ファイルに含める方が良いでしょう。ソリューションを展開する管理者は、アクセス許可を求める特定の要求が保留中であることを示す通知を受け取り、それらのアクセス許可を付与するかどうかを決定できます。続行すると、現在アクティブ化されているポリシー ファイルからコピーが作成され、Web パーツに対して要求されたアクセス許可が追加されます。この新しいポリシー ファイルが、web.config ファイルでアクティブ化されるものになります。では、これらの手順をさらに詳しく確認しましょう。

一部の情報は既に用意できています。前述のとおり、必要なアクセス許可の詳細はわかっています。もう 1 つの情報は、作業中のアセンブリの完全な公開キーの BLOB です。この情報を取得するには、コマンド プロンプト ウィンドウを開き、以下のコマンドを実行します。

Secutil.exe –hex –s WeatherWebPart.dll > keyblob.txt

その結果、問題のアセンブリの完全な公開キーがテキスト ファイルに抽出されます。使用されるツールは, .NET Framework SDK の一部である secutil.exe です。

次に、マニフェスト ファイルを開き、以下の CodeAccessSecurity 要素を追加します (FeatureManifests 要素と Assemblies 要素の間が適しています)。

   <CodeAccessSecurity>
      <PolicyItem>
         <PermissionSet class="NamedPermissionSet" version="1" 
   Description="My webpart's permission set">
            <IPermission class="AspNetHostingPermission" version="1"
               Level="Minimal"/>
            <IPermission class="SecurityPermission" version="1"
               Flags="Execution" />
            <IPermission version="1" Unrestricted="True" 
   class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
            <IPermission class="System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="True"             version="1">               <ConnectAccess>                  <URI uri="$OriginHost$"/>                  <URI uri="http://moss:95/webservices/.*"/>                  </ConnectAccess>            </IPermission>
         </PermissionSet>
         <Assemblies>
            <Assembly Name="WeatherwebPart" Version="1.0.0.0" PublicKeyBlob="0x00240000048000009400000006020000002400005253413100040000010001000DAF8ED8D945CD2ABB2EE7953A6039B791A725F11B4588AC6D70B3E0648F955E9ED4C3C43CB044B8B0E8A6FF4D4FFBE9E3B9297D45F688A7264534E12414E17539305207EC961DA94DF294E7722CCD9BDBFC95A896E996F57156705D281EC39280BD604E87724556AF5807D146963F19F5B43DB69E1F22695463153A553260D2" />
         </Assemblies>
      </PolicyItem>
   </CodeAccessSecurity>

前のコードで確認すべき重要な部分は、IPermission 要素と Assembly 要素です。まず、IPermission 要素は、Web サービスと通信するためのアクセス許可を要求します (この Web サービスは http://moss:95 IIS Web Application でホストされているものとします)。次に、Assembly 要素には、問題のアセンブリの詳細 (名前、バージョン、および secutil.exe ユーティリティで生成された keyblob.txt ファイルから取得する必要がある BLOB) が含まれます。

これらの変更がマニフェスト ファイルに適用されたら、Windows SharePoint Services ソリューションを再生成して、ソリューション ストアに追加し直す必要があります。ソリューションを展開すると、ソリューションの展開を続行すると有効になるコード アクセス セキュリティ ポリシーがソリューションに含まれていることを示す警告がページの下部に表示されます (図 23)。管理者がこれに問題がないことを確認して続行すると、Web パーツが使用可能になります。

図 23. コード アクセス セキュリティ ポリシーを含む Web パーツ ソリューションを展開する

コード アクセス セキュリティ ポリシーを含む Web パーツ ソリューション

上記のすべての手順を正しく実行すると、天気予報 Web パーツが再び以前のように動作するようになります。この背後では、以下のように、web.config ファイルの securityPolicy 要素に新しいエントリが追加されています。

<securityPolicy>
      <trustLevel name="WSS_Medium" policyFile="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_mediumtrust.config" />
      <trustLevel name="WSS_Minimal" policyFile="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_minimaltrust.config" />
      <trustLevel name="WSS_Custom" policyFile="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_custom_wss_minimaltrust.config" />
    </securityPolicy>

この WSS_Custom という新しいレベルが、web.config ファイルでアクティブな信頼レベルになります。

ソリューションを管理する

Windows SharePoint Services 3.0 では、SharePoint ソリューションの管理のサポートも提供しています。さまざまな方法で、ソリューションを取り消したり、ソリューション ストアからソリューションを削除したり、ソリューションをアップグレードすることができます。

ソリューションを取り消す

SharePoint ソリューションを取り消すと、Windows SharePoint Services により、すべてのソリューション コンポーネントが展開先から物理的に削除されます。ソリューションの取り消しは、以下の 3 つの方法で完了できます。

  • Stsadm.exe を使用する

  • サーバーの全体管理を使用する

  • Windows SharePoint Services 3.0 オブジェクト モデルを使用する

これらの方法を以下で説明します。

Stsadm.exe を使用する

retractsolution という名前のオプションには、さまざまなパラメータを指定できます。ソリューションの name は必須パラメータです。必要に応じて、特定の IIS Web アプリケーションおよびサイト コレクションの URL を指定したり、allcontenturls パラメータでソリューションをすべての展開先から削除することができます。time パラメータでは、ジョブ定義の取り消しのスケジュールを設定します。操作をすぐに実行する場合は、immediate パラメータを使用します。

以下に、ソリューションの取り消しに使用する一般的なコマンドを示します。

stsadm.exe –o retractsolution –name hellowebpart.wsp -immediate

サーバーの全体管理を使用する

ソリューションをソリューション ストアで使用できるようにした後は、サーバーの全体管理のソリューション管理ページでそのソリューションにアクセスすることができます。図 24 に示すように、ここからソリューションの取り消しプロセスを開始することができます。

図 24. IIS Web アプリケーションから Web パーツを取り消す

IIS Web アプリケーションから取り消された Web パーツ

Windows SharePoint Services 3.0 オブジェクト モデルを使用する

ソリューションを取り消す最後の方法は、Windows SharePoint Services 3.0 オブジェクト モデルを使用する方法です。SPSolution クラスは、Retract および RetractLocal メソッドを公開します。Retract を使用すると、ソリューションの取り消しのスケジュールを設定することができます。どちらのメソッドも、SPWebApplication オブジェクトのすべてのコレクションまたは特定のコレクションからソリューションを取り消すオプションを提供します。以下のコード例では、ローカル コンピュータで使用可能なすべての IIS Web アプリケーションから Web パーツ ソリューションを取り消します。

SPSolution solution = SPFarm.Local.Solutions["hellowebpart.wsp"];
solution.RetractLocal();

Web パーツ ソリューションを取り消す

Web パーツを提供するソリューションは、上記のいずれかのオプションを使用して取り消すことができます。ただし、Web パーツを取り消しても, .webpart エントリが Web パーツ ギャラリーから削除されるわけではありません。その結果、Web パーツは [Web パーツの追加] ダイアログ ボックスでアドバタイズされ続け、ユーザーは引き続きその Web パーツを表示することができます。ただし、ユーザーがその Web パーツをページに追加すると、エラーが表示されます。これは、その Web パーツが安全なコントロールとして登録されなくなり、ローカルの Bin フォルダまたはグローバル アセンブリ キャッシュからアセンブリが削除されているからです。また、Web パーツ ソリューションを取り消すと、既存の Web パーツ インスタンスが動作しなくなり、SharePoint ページにエラーが表示されるという点にも注意してください。これを解決するには、Web パーツ ギャラリーから .webpart ファイルを削除する非アクティブ化の命令を実行できます。

スキーマベースのソリューションを取り消す

スキーマベースのソリューション (カスタム リスト定義など) を取り消す際には注意が必要です。多数のインスタンスが存在する可能性があるので、それらを破損しないようにする必要があります。したがって、このようなタイプのソリューションのインスタンスを使用できるようにする場合は、ソリューションを取り消すよりも、フィーチャーをユーザーに対して非表示にする方がベスト プラクティスです。後述のソリューションのアップグレードに関する簡単なチュートリアルで、別の手順を示します。

Windows SharePoint Services ソリューションを削除する

展開されなくなった Windows SharePoint Services ソリューションは、ソリューション ストアから削除することができます。以下の 3 つの方法で行うことができます。

  • Stsadm.exe を使用する

  • サーバーの全体管理を使用する

  • Windows SharePoint Services 3.0 オブジェクト モデルを使用する

以下に、これらの 3 つの方法を説明します。

Stsadm.exe を使用する

管理者はコマンドライン ユーティリティ Stsadm.exe を起動して、deletesolution オプションを実行することができます。name パラメータがソリューションの名前で、必須です。ソリューションを削除するには、以下のコマンドを使用します。

stsadm.exe –o deletesolution –name hellowebpart.wsp

サーバーの全体管理を使用する

ソリューション管理ページ (サーバーの全体管理の [サーバー構成の管理] タブからアクセスできます) で、展開されなくなったソリューションを削除することができます。ソリューション名をクリックし、ツール バーの [ソリューションの削除] ボタンを使用します。

Windows SharePoint Services 3.0 オブジェクト モデルを使用する

SPSolutionCollection オブジェクトのレベルで Remove メソッドを呼び出しても、ソリューションを削除できます。このコレクションは、ローカル ファームに対して、または参加したファームから、SPFarm クラスによって公開されます。以下のコードでは、ソリューション ストアからソリューションを削除します。

SPFarm.Local.Solutions.Remove("hellowebpart.wsp");

ソリューションをアップグレードする

SharePoint ソリューションの管理に関する最後のオプションは、展開済みのソリューションを新しいバージョンにアップグレードすることです。バージョン管理は Windows SharePoint Services ソリューションのレベルでは行われないということを理解しておくことが重要です。実際のバージョン管理は、ソリューション コンポーネント (フィーチャー、アセンブリなど) のレベルで行われます。

図 25 に、ソリューションのアップグレードを実行する方法をまとめます。

図 25. SharePoint ソリューションをアップグレードする

SharePoint ソリューションのアップグレード

バージョン 1.0.0.0 の MySolution.wsp がソリューション ストアに追加され、1 つ以上の IIS Web アプリケーションに展開されているとします。正常にアップグレードするには、Windows SharePoint Services ソリューションの 2 つ目のバージョンの SolutionID が同じである必要があります。2 つ目のバージョンは、upgradesolution オプションを指定して Stsadm.exe コマンドライン ユーティリティを呼び出すとアップグレードされます。ソリューション ストアで、アップグレードするソリューションの名前、ソリューションの新しいバージョンを指定し、アップグレードのスケジュールを設定するか、今すぐアップグレードするかオプションを指定します。また、グローバル アセンブリ キャッシュへの展開を許可し、カスタム コード アクセス セキュリティ ポリシーを許可するオプションを指定します。

SharePoint ソリューションのアップグレードのガイドライン

SharePoint ソリューションのアップグレードのガイドラインについて考える場合は、コードベースのソリューション (Web パーツなど) とスキーマベースのソリューション (カスタム リスト定義など) を区別する必要があります。

  • Web パーツ ソリューションのアップグレード   コードベースのソリューションの一般的な例として Web パーツが挙げられます。コードベースのソリューションをアップグレードする際には、IIS Web アプリケーションのプライベート アプリケーション フォルダ内またはグローバル アセンブリ キャッシュ内のアセンブリを、更新されたバージョンのアセンブリに置き換える作業が伴います。図 26 に、考えられるアップグレード パスをまとめます。

    図 26. Web パーツをアップグレードする

    Web パーツをアップグレードする

    .NET アセンブリのバージョン番号を変更しない場合は、アップグレード プロセスは円滑に進みます。アセンブリのバージョン番号を変更せずにそのままにすると、保存済みの使用可能な状態のメタデータ (たとえば、Web パーツ ギャラリーに登録された .webpart 形式のデータ) は変更する必要がありません。ページ上の Web パーツの既存のインスタンスはすべて、簡単にアップグレードされます。

    アセンブリの厳密名が変更される場合 (通常は、バージョン番号を 1.0.0.0 から 2.0.0.0 にアップグレードする場合など)、アップグレード プロセスはもっと複雑です。サイト内に Web パーツ インスタンスが作成されていない場合は、問題ありません。Web パーツ ギャラリー内のエントリが新しい .webpart ファイルで更新されると、アセンブリの新しいバージョンが bin フォルダまたはグローバル アセンブリ キャッシュにドロップされます。ページに Web パーツを新しく追加することにより、新機能が反映されます。

    ただし、Web パーツの古いバージョンのインスタンスがページ上に存在する場合は、ユーザー側でエラーが発生する可能性があるので、アップグレードを実行することを決定します。これらのインスタンスは、まだアセンブリの最初のバージョンを参照しています。upgradesolution オプションを使用すると、アセンブリの古いバージョンが、web.config ファイルの safeControls セクション内のエントリと共に実際に削除されます。

    したがって、Web パーツ ソリューションをアセンブリの新しいバージョンでアップグレードする方法と、SharePoint サイトをホストする IIS Web アプリケーションの web.config に 2 つの追加を行う方法を組み合わせてください。2 つの追加とは、1 つ目はアセンブリの最初のバージョンに対する SafeControl 要素で、2 つ目は最初のバージョンが要求された場合に備えてアセンブリの 2 番目のバージョンをバインドする bindingRedirect です。

    チュートリアル : Web パーツ プロジェクトをアップグレードする

    Web パーツ プロジェクトをアップグレードするには

    1. まず、バージョン情報などの文字列を出力する小規模な Web パーツ プロジェクトを構築します。Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 を使用して開始できますが、パッケージ化および展開は手動で実行する必要があります。図 27 のようなプロジェクト構造を推奨します。ここでは、SharePoint ソリューションの手動でのパッケージ化について前述したすべての技法を使用します。

      図 27. Web パーツ ソリューションのプロジェクト構造

      Web パーツ ソリューションのプロジェクト構造

    2. ソリューションを展開し、サイト コレクション内でフィーチャーをアクティブ化して、いずれかのページに Web パーツを追加できるようにします (図 28 を参照)。

      図 28. Web パーツの最初のバージョン

      Web パーツの最初のバージョン

    3. Web パーツの更新を要求されたとします。ユーザーは、Web パーツにやや異なる文字列を表示することを求めています。まず、Web パーツ内のコンテンツの表示を変更した後、Web パーツ プロジェクトのプロパティを使用してアセンブリのバージョン番号を 1.0.0.0 から 2.0.0.0 に変更します。プロジェクトを構築します。

    4. .webpart ファイルを開き、type 要素のバージョン番号を更新します。

    5. プロジェクトを構築し、SharePoint ソリューション ファイルを再構築します。バッチ ファイルまたはコマンド プロンプトから以下を呼び出して、ソリューションをアップグレードします。

      Stsadm -o upgradesolution -name VersionDemo.wsp -filename VersionDemo.wsp -immediate -allowgacdeployment
      
    6. Web パーツ インスタンスでページを更新します。図 29 に、表示されるエラーと、出力に変更が正しく反映された新しいインスタンスを示します。

      図 29. エラーを表示し、正しく表示する Web パーツ

      正しい表示でエラーを含む Web パーツ

    7. 表示されたエラーを解決します。

      1. web.config ファイルでバージョン 1.0.0.0 に対して SafeControl 要素を追加します。

        <SafeControl Assembly="VersionDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" Namespace="MSDN.Samples" TypeName="VersionDemo" Safe="True" />
        
      2. web.config ファイルで、リダイレクト操作について、assemblyBinding 要素の下に以下の要素を追加します。

        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="VersionDemo" publicKeyToken="9f4da00116c38ec5" culture="neutral" />
                    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
                </dependentAssembly> 
        …
            </assemblyBinding>
        </runtime>
        
    8. 2 つの Web パーツ インスタンスを含むページを更新します。図 30 にこの結果を示します。Web パーツの最初のバージョンが、アセンブリの 2.0.0.0 バージョンに対しても動作するようになりました。

      図 30. どちらの Web パーツも正しく動作する

      どちらの Web パーツも正しく動作する

  • スキーマベースのソリューションのアップグレード   スキーマベースのソリューションの例として、カスタム リスト定義が挙げられます。通常、スキーマ定義に基づくインスタンスが SharePoint サイトに存在する場合、これらのタイプのソリューションをアップグレードするには、フィーチャーの新しいバージョンを展開し、古いバージョンをユーザーに対して非表示にするようマークします。こうすると、インスタンスは破損せず、新しいインスタンスは更新後の定義に従います。

    チュートリアル : スキーマベースのソリューションをアップグレードする

    この記事の前半で SharePoint ソリューションとして作成および展開した Employees リスト テンプレートに戻りましょう。

    ユーザーが、このリストの多数のインスタンスを作成してあるものとします。リスト定義に変更を加えるか、リスト定義を完全に削除することを決定しました。既に説明したとおり、SharePoint コンピュータからソリューション ファイルを単に削除することはできません。それらを機能させたまま、管理者およびユーザーに対して非表示にする必要があります。前述のとおり、この方法はソリューションを取り消す代わりにも使用できます。

    以下に、スキーマベースのソリューションをアップグレードする手順を示します。

    スキーマベースのソリューションをアップグレードするには

    1. リスト定義のソリューション コンポーネントが含まれているフォルダを開き、feature.xml ファイルを開きます。

    2. Feature 要素の Hidden 属性を値 TRUE に変更します。

      <Feature Id="{489C77F1-B064-408e-9B85-029A33BDF9D7}" 
          Title="Employees"
          Description="This feature provides support for creating an Employee List."
          Version="1.0.0.0"
          Scope="Web"
          Hidden="TRUE"
          xmlns="https://schemas.microsoft.com/sharepoint/">
          <ElementManifests>
              <ElementManifest Location="ListTemplates\Employees.xml"/>
              <ElementFile Location="Employees\allitems.aspx" />
              <ElementFile Location="Employees\dispform.aspx" />
              <ElementFile Location="Employees\editform.aspx" />
              <ElementFile Location="Employees\newform.aspx" />
              <ElementFile Location="Employees\schema.xml" />
          </ElementManifests>
      </Feature>
      

      こうすると、フィーチャーは管理ページで非表示になりますが、[作成] ページでも非表示にする必要があります。

    3. employees.xml ファイルを開き、Hidden 属性を追加します。

      <Elements xmlns="https://schemas.microsoft.com/sharepoint/">
          <ListTemplate 
                Name="Employees" 
                Type="10100" 
                BaseType="0" 
                OnQuickLaunch="TRUE" 
                SecurityBits="11" 
                DisplayName="Employees" 
                Description="Employees List Type" 
                Hidden="TRUE"
                Image="/_layouts/images/CHNGCOL.GIF"/>
      </Elements>
      

    ソリューションのみを取り消す場合は、以上の手順で十分です。

    ただし、リスト定義を新しいバージョンに置換する場合は、ソリューション パッケージに以下を追加する必要があります。

    • 異なる GUID でマークされた、フィーチャーの新しいバージョン (すべての関連ファイルを含む)。

    • フィーチャーのオリジナルの (非表示になる) バージョンとフィーチャーの新しいバージョンの両方のインストール手順で拡張されたマニフェスト ファイル。

    • 新しいフィーチャーおよび前のバージョンを .wsp ファイルにパッケージ化するためのエントリを含む拡張された .ddf ファイル。

    いずれのシナリオでも、前述のとおりに Stsadm の upgradesolution オプションを使用して、SharePoint ソリューション ファイルを再作成して展開する必要があります。

    Stsadm.exe -o upgradesolution -filename package\Employees.wsp -name Employees.wsp –immediate
    

まとめ

Windows SharePoint Services におけるソリューションの概念を理解することは、開発者および管理者にとって非常に重要です。アプリケーションを構築し、さまざまな方法で SharePoint サイトを拡張する開発者は、ソリューション コンポーネントを SharePoint ソリューション ファイルにパッケージ化して、それらを管理者に提供する必要があります。管理者は、さまざまなオプションを使用して、SharePoint サイトのユーザーにソリューションを提供することができます。この記事では、中央のソリューション ストアからフロントエンド Web サーバーおよびアプリケーション サーバーにソリューションをプッシュするのに使用できる新しいオプションについて説明しています。展開したソリューションを維持およびアップグレードする技法についても説明しています。

作成者について

Patrick Tisseghem は Microsoft Office SharePoint Server MVP であり、Windows SharePoint Services 3.0 および Office SharePoint Server 2007 を専門にしています。SharePoint の最新バージョンについて、Microsoft Redmond 向けに ISV に重点を置いた初期導入資料を作成および配布し、各国で開発者向けワークショップを開いています。TechEd や SharePoint Connections などの主要な Microsoft の会議で頻繁に発言し、MSDN で多数のホワイト ペーパーを発表しています。また、Microsoft Press から書籍『Inside MOSS 2007』を発行しています。Patrick の詳細については、同氏のブログ を参照してください。

追加情報

詳細については、以下のリソースを参照してください。