2

これで、WindowsXPで正常に動作するC++アプリができました。初期化には次のコードが含まれています

// Register all OLE server (factories) as running.  This enables the
//  OLE libraries to create objects from other applications.
COleObjectFactory::RegisterAll();

私が言ったように、それはWindows XPで正常に動作しますが、プログラムがXPで正常なCOMインターフェイスを登録しようとしていることを理解していますが、これはUACのためにWindowsVistaとWindows7で問題になる可能性があります。特に、標準ユーザーとして実行されている場合(昇格された特権はありません)。

私が正しく理解していれば、これはプログラムを正しく実行するために必要ですが、昇格された特権なしではこのコードを実行できません。アプリが実行されるたびに実行される場合(これは通常、実行時CWinApp::init()に実行されます)

管理者権限を使用すると言う前に、ユーザーは管理者権限を持っていません。それを変更する方法はありません。

だから、今私の質問は次のとおりです。

1)私の仮定は正しいですか?

2)私が正しければ、これを回避する最善の方法は何ですか?これを削除できますか?他に何か設定する必要がありますか?(レジストリ内のものの代わりにXMLファイルを使用するように一部のVBモジュールを変更しました

PS:モジュールはDLLにコンパイルされます

PPS:UACをオンにする必要があります

4

1 に答える 1

1

次の点に注意してください。

  1. これらの関数のドキュメントには、特権要件についての言及はありません。と
  2. 権限が制限された環境でこれらの機能に問題を抱えているオンラインのユーザーは誰もいないようです。と
  3. 今は 2012 年です。これらの機能が UAC の下で機能しない場合は、誰かが気付いていたと思います。

だから(他に提案することは何もありませんが)、それはただうまくいくと思います.

上記にもかかわらず、私は と の実装を見ましCOleObjectFactory::RegisterAll()COleObjectFactory::UpdateRegistryAll()

RegisterAll

最終的に、呼び出しは呼び出される場所で RegisterAll終了します。MSDN から:olefact.cpp:135CoRegisterClassObject

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は、問題ありません。

警告実装者: 実装の詳細に依存しないでください。

于 2012-06-18T11:35:37.200 に答える