サービス アプリケーションとしてのインストール
COM オブジェクトは、ローカル サーバー実行可能ファイル (EXE) として実行されるだけでなく、ローカルクライアントまたはリモート クライアントによってアクティブ化されたときにサービス アプリケーションとして実行するように自身をパッケージ化することもできます。 サービスは、ローカルおよびリモートの起動、停止、一時停止、再起動、特定のユーザー アカウントとウィンドウ ステーションで実行するサーバーを確立する機能など、便利でユーザー インターフェイスに統合された管理機能を多数サポートしています。
サービスとして記述されたオブジェクトは、LocalService 値をその AppID キーの下に確立し、標準的なサービスのインストールを実行することで、COM で使用できるようにインストールされます。
クラスは、サービス アプリケーションとして作成せずに、リモート クライアントによってアクティブ化されたときに特定のユーザー アカウントで実行されるように構成することもできます。 これを行うために、このクラスは、SCM がローカル サーバー プロセスを起動するときに使用されるユーザー名とパスワードをインストールします。
クラスがこの方法で構成されている場合、実際のアクティブ化要求の代わりに COM によってプロセスが起動されない限り、この CLSID を使用した CoRegisterClassObject の呼び出しは失敗します。 つまり、特定のユーザーとして実行するように構成されたクラスは、他の ID で登録することはできません。
ユーザー名は、クラスの APPID キーの下にある RunAs の名前付き値から取得されます。 ユーザー名が「Interactive User」の場合、クラス コードは現在ログオンしているユーザーのセキュリティ コンテキストで実行され、対話型ウィンドウ ステーションに接続されます。
それ以外の場合、パスワードは、マシンの管理者とシステムのみが使用できるレジストリの隠された部分から取得されます。 次に、ユーザー名とパスワードを使用して、クラス コードが実行されるログオン セッションを作成します。 この方法で起動すると、クラス コードは独自のデスクトップおよびウィンドウ ステーションで実行され、ウィンドウ ハンドル、クリップボード、その他のユーザー インターフェイス要素を対話型ユーザーや他のユーザー アカウントで実行されている他のクラスと共有しません。
LocalService または RunAs に登録されているサーバーは、実行中のオブジェクト テーブルにオブジェクトを登録して、任意のクライアントがそれに接続できるようにします。 これを行うには、サーバーの IRunningObjectTable::Register の呼び出しで ROTFLAGS_ALLOWANYCLIENT フラグを設定する必要があります。 このビットを設定するサーバーは、実行可能ファイルの AppID を参照するレジストリの AppID セクションに実行可能ファイル名を含める必要があります。 "activate as activator" サーバー (LocalService または RunAs として登録されていない) は、このフラグを持つオブジェクトを登録できません。
関連トピック