実装されたアプリケーションのスキーマ登録
実装されたアプリケーションは、登録する必要があります。登録作業では、アプリケーションのスキーマが探索され、WMI リポジトリに登録されます。スキーマの公開はアセンブリごとに必要です。実装の型 (イベントまたはインスタンス) を宣言するアセンブリは、WMI に公開されるスキーマを持っている必要があります。.NET Framework の標準インストーラ機構を使用して、この処理を実行できます。
最初に、プロジェクトに対してインストーラを定義する必要があります。プロジェクトが他の目的でインストーラを必要としない場合は、System.Management.Instrumentation に用意されている既定の管理インストーラ ヘルパ クラスを使用し、次のコードでそのクラスからクラスを派生させることができます。
[System.ComponentModel.RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller {}
このコードは、実行するアプリケーションにインストール手順があることをシステムに通知します。プロジェクトがその他のインストール手順を経る必要があり、定義済みのプロジェクト インストーラが既に存在する場合は、System.Management.Instrumentation に用意されている ManagementInstaller クラスを使用する必要があります。たとえば、プロジェクト インストーラのコンストラクタに次のコードを追加します。
ManagementInstaller managementInstaller = new ManagementInstaller();
Installers.Add(managementInstaller);
このインストール手順を呼び出すには、次のようにいくつかの方法があります。
アプリケーションを MSI インストール パッケージにパッケージ化する場合は、実行中の .NET インストーラのオプションがオンになっていることを確認します。MSI インストールによってインストーラを実行します。
.NET Framework SDK に用意されている installutil.exe ユーティリティを、実装されたアセンブリに対して実行します。
c:> installutil <yourassemblyname>
Main() 関数の冒頭に次のコードを追加することにより、アプリケーションの内部からインストーラを実行できます。
string[] installArgs = new String[] { "/logfile=", "/LogToConsole=false", "/ShowCallStack", typeof(App).Assembly.Location, }; System.Configuration.Install.ManagedInstallerClass.InstallHelper(installArgs);
メモ ただし、このオプションを使用した場合、このアプリケーションの管理スキーマをコンシューマに対して使用できるのは、アプリケーションがインストールされたときではなく、アプリケーションを初めて実行した後です。
スキーマ登録をどのような方法で呼び出すかには関係なく、呼び出しているユーザーが Local Administrators グループのメンバである場合にだけ、スキーマ登録が成功します。これは、通常はアプリケーションのインストール時に該当しますが、アプリケーションがインストール手順を必要としない場合は、管理アプリケーションが登録されて管理データや管理イベントを提供できるようになるためには、少なくとも 1 回はローカル管理者によって実行される必要があります。
デザイン時に便利なように、スキーマは、アプリケーションが最初にイベントを発生させるかまたはインスタンスを公開した時点で自動的に公開されます。これによって、アプリケーションの高速プロトタイプ時に、プロジェクト インストーラを宣言したり、InstallUtil を実行したりする必要はなくなります。ここでも、アプリケーションを実行しているユーザーが Local Administrators グループのメンバである場合にだけ、スキーマが自動的に公開されます。この動作は、アプリケーションを配置するタイミングには依存しないということに注意してください。実装されたアセンブリのスキーマは、既に説明したようなインストーラ ベースの機構の 1 つを使用して、インストール時に WMI に公開される必要があります。
イベント (またはインスタンス) クラスのスキーマはアセンブリ内に含まれ、インストール時に WMI レポジトリに登録されます。
.NET アセンブリはバージョン情報を持つことができます。アセンブリのバージョンと、WMI レポジトリに登録されている WMI スキーマとの間に直接の対応付けはありません。
バージョンの非互換性を避けるために推奨される処理は次のとおりです。
- スキーマ変更の場合は、installutil.exe を実行してアセンブリを再インストールします。
- 変更されたクラスから派生したクラスがあれば、すべての派生クラスのアセンブリを再インストールします。
- クライアント アプリケーションを再コンパイルします。
ただし、クライアント アプリケーションを再コンパイルできない場合もあります。次の 2 つのシナリオが該当します。いずれのシナリオもイベント スキーマに適応されます。
シナリオ 1 : イベント クラス スキーマが変更されていない。
アクション : 再コンパイルおよび再インストール時に、クラス定義を含んでいるアセンブリのメジャー バージョンとマイナ バージョンが元の値を持っていることを確認してください。
シナリオ 2 : イベント スキーマが変更されている。より具体的には、プロパティまたはメソッド (あるいはその両方) を追加することによってイベント クラス スキーマが変更され、それ以前に定義されていたプロパティまたはメソッドは削除されていません。
アクション : このような場合には、アプリケーションの実装を別の WMI 名前空間に移動することを強くお勧めします。
現在登録されているスキーマがなんらかの理由で壊れた場合は、installutil.exe を再実行しても元のスキーマが再登録されないことがあります。このような場合は、/f または /force スイッチを使用して、インストーラで強制的にスキーマを再インストールできます。
installutil.exe /f <yourassemblyname>
スキーマの登録解除
インストーラは、通常、次のようなアンインストール スイッチをサポートしています。
installutil.exe /u <yourassemblyname>
<yourassemblyname> は登録した以前のスキーマ定義を含むアセンブリです。
ただし、このバージョンの ManagementInstaller クラスは、アンインストール時に何も操作を行いません。つまり、スキーマは登録解除されません。これは、複数の WMI プロバイダが同じスキーマを使用している可能性があり、特定のスキーマが他のエンティティによって使用されておらず、安全に削除できるかどうかを識別するための機構が存在しないためです。
参照
System.Management を使用する .NET Framework アプリケーションの実装 | CLI と WMI におけるクラスとマップ | 管理イベントの公開 | 管理データの公開 | 継承