単一パッケージの作成

二重目的パッケージは、ユーザーごとまたはマシンごとのインストール コンテキストでアプリケーションをインストールできるように作成された Windows インストーラー 5.0 パッケージです。 アプリケーションに二重目的パッケージを使用するセットアップ開発者は、インストール時のインストール コンテキストをユーザーが選択できるようにし、Windows 7 または Windows Server 2008 R2 のユーザーごとのインストールから UAC 資格情報プロンプトを除去することができます。 Windows 7 および Windows Server 2008 R2 にインストールするための二重目的の Windows インストーラー 5.0 パッケージの開発は、単一パッケージの作成と呼ばれます。

Windows 7 および Windows Server 2008 R2 用の二重目的パッケージの開発は、Windows インストーラー 5.0、MSIINSTALLPERUSER プロパティ、ALLUSERS プロパティ、および Windows シェルのユーザーごとに使用できる既知のフォルダーと登録を使用して開始することができます。 Windows インストーラー 5.0 で、Windows 7 または Windows Server 2008 R2 にユーザーごとのコンテキストで二重目的パッケージをインストールすると、インストーラーではファイルとレジストリのエントリをユーザーごとの場所に転送し、資格情報を求める UAC プロンプトは表示されません。 Windows インストーラー 5.0 で二重目的パッケージをマシンごとのコンテキストでインストールすると、インストーラーではファイルとレジストリのエントリをマシンごとの場所に転送し、コンピューターのすべてのユーザー用にソフトウェアをインストールするための十分な特権がユーザーにあることを確認するために UAC 資格情報を求めるプロンプトが表示されます。 Windows インストーラー 5.0 でアプリケーションがインストールされると、以降のすべてのアプリケーションの更新、修復、または削除で同じインストール コンテキストが使用されます。

Windows インストーラー 4.5 以前: MSIINSTALLPERUSER プロパティと、ProgramFilesFolderCommonFilesFolderProgramFiles64Folder、および CommonFiles64Folder プロパティによって参照されるユーザーごとのバージョンのフォルダーはサポートされません。 FOLDERID_UserProgramFiles フォルダーと FOLDERID_UserProgramFilesCommon フォルダーは、Windows 7 および Windows Server 2008 R2 以降で使用できます。 つまり、Windows インストーラー 4.5 以前用に開発されたインストールでは、ファイルとレジストリのエントリは、FOLDERID_ProgramFiles、FOLDERID_ProgramFilesCommon、FOLDERID_ProgramFilesX64、およびFOLDERID_ProgramFilesCommonX64 に転送されます。 これらはコンピューターの他のユーザーがアクセスできる場所であるため、Windows Vista 以降のシステムでは、資格情報を求める UAC プロンプトの表示が必要になります。

ユーザーが Windows インストーラー 4.5 以前で Windows インストーラー 5.0 用に作成された二重目的パッケージをインストールすると、インストーラーでは MSIINSTALLPERUSER プロパティが無視されます。 この場合、インストールでは、ファイルとレジストリのエントリを他のユーザーがアクセスできる場所に転送する可能性があり、資格情報を求める UAC プロンプトをシステムで表示する必要があります。 Windows インストーラー 5.0 では、Windows インストーラー 4.5 以前用に開発されたパッケージをインストールできますが、インストールではファイルとレジストリのエントリが他のユーザーがアクセスできる場所に転送され、資格情報を求める UAC プロンプトをシステムで表示する必要があります。

開発ガイドライン

ユーザーごとまたはマシンごとのコンテキストでパッケージをインストールできるようにするには、次の単一パッケージ作成ガイドラインに従います。 これらのガイドラインに従うことで、ユーザーがインストール時にユーザーごとまたはマシンごとのインストールを選択でき、ユーザーごとのインストールから UAC プロンプトを除去します。

  • ユーザーごとのインストールには、Windows 7 または Windows Server 2008 R2 の Windows インストーラー 5.0 が必要です。 それ以前のバージョンのシステムでは、アプリケーションのマシンごとのインストールがパッケージでサポートされていることをユーザーに通知する必要があります。

  • 二重目的パッケージの Property テーブルALLUSERS プロパティと MSIINSTALLPERUSER プロパティの値を初期化します。 初期値として ALLUSERS 値に 2、MSIINSTALLPERUSER 値に 1 を使用します。 これにより、二重目的パッケージの既定値としてユーザーごとのインストールが指定されます。

  • インストール時にユーザーがコンテキストを選択できるようにする、二重目的パッケージのユーザー インターフェイスのダイアログ ボックスを作成することを検討してください。 このカスタム ダイアログ ボックスに、ALLUSERS プロパティと MSIINSTALLPERUSER プロパティの値を設定するためのコントロールを作成します。 ALLUSERS 値が 2 の場合、MSIINSTALLPERUSER の値を 1 に設定するとユーザーごとのインストールが指定され、MSIINSTALLPERUSER を空の文字列 ("") に設定するとマシンごとのインストールが指定されます。 ユーザーは、コマンド ラインからパッケージをインストールする場合、コマンド ラインで ALLUSERSMSIINSTALLPERUSER を設定することもできます。

  • 内部整合性エバリュエーター - ICE を使用してパッケージを検証します。 パッケージが有効な二重目的パッケージになるには、ICE105 による検証に合格できる必要があります。

  • Registry テーブルRemoveRegistry テーブルを使用して、ユーザーごとのインストール時に、レジストリのユーザーごとの部分にレジストリ エントリをリダイレクトします。 ユーザーごとのインストールでは、Root 列が -1 のレジストリ エントリは HKEY_CURRENT_USER にリダイレクトされ、マシンごとのインストールでは、これらは HKEY_LOCAL_MACHINE に転送されます。 ユーザーごとのインストールでは、Root 列に msidbRegistryRootClassesRoot (0) を含むレジストリ エントリは HKCU\Software\Classes にリダイレクトされ、マシンごとのインストールでは、これらは HKLM\Software\Classes に転送されます。

  • 32 ビット Windows インストーラー パッケージDirectory テーブルProgramFilesFolder プロパティを使用して、アプリケーション間で共有されない 32 ビット コンポーネントを含むディレクトリの場所を指定します。 ユーザーがマシンごとのコンテキストを使用して二重目的パッケージをインストールすると、これらのコンポーネントは、32 ビット バージョンの Windows の Program Files フォルダーと、64 ビット バージョンのシステムの Program Files (x86) フォルダーに保存されます。 これらのディレクトリ内のコンポーネントには、すべてのユーザーがアクセスできます。 ユーザーがユーザーごとのコンテキストを使用して Windows 7 または Windows Server 2008 R2 に二重目的パッケージをインストールすると、これらのコンポーネントは現在のユーザーの Programs フォルダー (たとえば %LocalAppData%\Programs) に保存され、そのユーザーのみがアクセスできます。

  • 32 ビット Windows インストーラー パッケージDirectory テーブルCommonFilesFolder プロパティを使用して、アプリケーション間で共有されない 32 ビット コンポーネントを含むディレクトリの場所を指定します。 ユーザーがマシンごとのコンテキストを使用して二重目的パッケージをインストールすると、これらのコンポーネントは Common Files フォルダーに保存され、すべてのユーザーがアクセスできます。 ユーザーがユーザーごとのコンテキストを使用して Windows 7 または Windows Server 2008 R2 に二重目的パッケージをインストールすると、これらのコンポーネントは現在のユーザーの Common フォルダー (たとえば %LocalAppData%\Programs\Common) に保存され、そのユーザーのみがアクセスできます。

  • 64 ビット Windows インストーラー パッケージDirectory テーブルProgramFiles64Folder プロパティを使用して、アプリケーション間で共有されない 64 ビット コンポーネントを含むディレクトリの場所を指定します。 ユーザーがマシンごとのコンテキストを使用して二重目的パッケージをインストールすると、これらのコンポーネントは Program Files フォルダーに保存されます。 これらのディレクトリ内のコンポーネントには、すべてのユーザーがアクセスできます。 ユーザーがユーザーごとのコンテキストを使用して Windows 7 または Windows Server 2008 R2 に二重目的パッケージをインストールすると、これらのコンポーネントは現在のユーザーの Programs フォルダー (たとえば %LocalAppData%\Programs) に保存され、そのユーザーのみがアクセスできます。 64 ビット オペレーティング システムにアプリケーションをインストールするためのパッケージの作成について詳しくは、「64 ビット オペレーティング システムの Windows インストーラー」を参照してください。

  • 64 ビット Windows インストーラー パッケージDirectory テーブルCommonFiles64Folder プロパティを使用して、アプリケーション間で共有されない 64 ビット コンポーネントを含むディレクトリの場所を指定します。 ユーザーがマシンごとのコンテキストを使用して二重目的パッケージをインストールすると、これらのコンポーネントは Common Files フォルダーに保存され、すべてのユーザーがアクセスできます。 ユーザーがユーザーごとのコンテキストを使用して Windows 7 または Windows Server 2008 R2 に二重目的パッケージをインストールすると、これらのコンポーネントは現在のユーザーの Common フォルダー (たとえば %LocalAppData%\Programs\Common) に保存され、そのユーザーのみがアクセスできます。

  • 64 ビット Windows インストーラー パッケージDirectory テーブルProgramFilesFolder プロパティおよび CommonFilesFolder プロパティを使用して、32 ビット コンポーネントを含むディレクトリの場所を指定します。 同じ名前で提供されたコンポーネントの 32 ビット バージョンと 64 ビット バージョンに対して異なる名前を使用するか、バージョンを別々のフォルダーに保存します。 たとえば、Directory テーブルに情報を追加し、32 ビット バージョンを含むディレクトリの場所を [ProgramFilesFolder]\ISV Name\Application Name\x86 と指定し、64 ビット バージョンを含むディレクトリの場所を [Program64FilesFolder]\ISV Name\Application Name\x64 と指定します。 すると、マシンごとのインストールでは、32 ビット バージョンが Program Files(x86)\ISV Name\Application Name\x86 に保存され、64 ビット バージョンが Program Files\ISV Name\Application Name\x64 に保存されます。 ユーザーごとのインストールでは、32 ビット バージョンが %LocalAppData%\Programs\ISV Name\Application Name\x86 に保存され、64 ビット バージョンが %LocalAppData%\Programs\ISV Name\Application Name\x64 にインストールされます。

  • アプリケーションのユーザーごとの構成データを \Users\username\AppData に格納します。

  • アプリケーションによって生成されたテンプレートとファイルを、\Users\username のサブフォルダーに格納します。

  • アプリケーションでシェル拡張機能を使用する場合は、Windows 7 または Windows Server 2008 R2 以降で使用できるユーザーごとに使用できるシェルの拡張性ポイントを使用する必要があります。

  • 実行するために昇格された特権を必要とするカスタム アクションをパッケージで使用しないでください。 CustomAction テーブルには、昇格された特権で実行するようにマークされているカスタム アクションが含まれないようにします。 昇格されたカスタム アクションの詳細については、「カスタム アクション セキュリティ」を参照してください。

  • グローバル システム フォルダーには書き込みしないでください。 Directory テーブルには、次のシステム フォルダープロパティへの参照を含めてはなりません。

AdminToolsFolder
CommonAppDataFolder
FontsFolder
System16Folder
System64Folder
SystemFolder
TempFolder
WindowsFolder
WindowsVolume

  • 共通言語ランタイム アセンブリをグローバル アセンブリ キャッシュ (GAC) にインストールしないでください。グローバル アセンブリ キャッシュへのアセンブリのインストールの詳細については、「パッケージへのアセンブリの追加」および「共通言語ランタイム アセンブリのインストール」を参照してください。
  • ODBC データ ソースをインストールしないでください。 ODBCDataSource テーブルを使用してデータ ソースをインストールしないでください。
  • サービスをインストールしないでください。 ServiceInstall テーブルを使用してサービスをインストールしないでください。

二重目的パッケージの例は、「Windows インストーラー開発者向け Windows SDK コンポーネント」でファイル PUASample1.msi として提供されています。 最新の SDK をお持ちの場合は、サンプルのインストール パッケージを再現するために必要なすべてのツールとデータにアクセスできます。 この例の詳細については、「 単一パッケージの作成例」を参照してください。