次の点に注意してください。
- これらの関数のドキュメントには、特権要件についての言及はありません。と
- 権限が制限された環境でこれらの機能に問題を抱えているオンラインのユーザーは誰もいないようです。と
- 今は 2012 年です。これらの機能が UAC の下で機能しない場合は、誰かが気付いていたと思います。
だから(他に提案することは何もありませんが)、それはただうまくいくと思います.
上記にもかかわらず、私は と の実装を見ましCOleObjectFactory::RegisterAll()
たCOleObjectFactory::UpdateRegistryAll()
。
RegisterAll
最終的に、呼び出しは呼び出される場所で RegisterAll
終了します。MSDN から:olefact.cpp:135
CoRegisterClassObject
EXE クラス オブジェクトを OLE に登録して、他のアプリケーションが接続できるようにします。
この登録は、現在のユーザーのセッションとアプリケーションの存続期間に限定されると思います。備考セクションでは、特権 ( Windows Server 2003 の時点で... )について触れていますが、具体的なものは何も提供していません。
Running Object Table
経由で取得できる (ROT) と呼ばれるオブジェクトがありますGetRunningObjectTable
。ドキュメントには次のスニペットがあります。
各ワークステーションには、そのコンピューターで実行中として登録されているオブジェクトのテーブルを保持するローカル ROT があります。
COM Elevation Monikerには、ROT と特権に関する詳細情報があります (さまざまな特権レベルのプロセスが正常に動作することを示唆しています)。左側のリンクも役立つ場合があります。
CoRegisterClassObject
全体として、管理者のアクセス許可を必要とすることを示唆するものはないようです。
UpdateRegistryAll
この関数はolefact.cpp:375
、それが開くところに行き着きますHKEY_CLASSES_ROOT
。この時点で、ドキュメントは少し改善されます。
RegOpenKeyEx
またはなどのレジストリ関数をRegQueryValueEx
使用すると、キーを指定できますHKEY_CLASSES_ROOT
。対話型ユーザー アカウントで実行されているプロセスからこれらの関数を呼び出すと、システムは の既定の設定HKEY_LOCAL_MACHINE\Software\Classes
を の対話型ユーザーの設定とマージしますHKEY_CURRENT_USER\Software\Classes
。
これより先:
の下のキーにキーを書き込むHKEY_CLASSES_ROOT
と、システムはその情報を下に保存します。HKEY_LOCAL_MACHINE\Software\Classes
HKEY_CLASSES_ROOT
このドキュメントでは、制限された権限でに書き込もうとした場合(つまり、標準ユーザーが書き込めないHKLM
) がどうなるかは定義されていませんが、代わりに に書き込むことになると思いますHKCU
。
最後に、次の点に注意してください。
Windows Server 2003 および Windows XP/2000 : アプリケーションは、依存 COM オブジェクトをコンピューターごとまたはユーザーごとの COM 構成ストア (HKEY_LOCAL_MACHINE\Software\Classes
またはHKEY_CURRENT_USER\Software\Classes
) に登録できます。
したがって、 まで落ちる場合HKCU
は、問題ありません。
警告実装者: 実装の詳細に依存しないでください。