4

プロテクト モードで実行中に、IE9 を COM サービス (Visual Studio 2010 のウィザードを使用して作成) と対話させようとしています。サービスをサービスとして登録するのではなく、管理者として実行すると、BHO の呼び出しがspUnk.CoCreateInstance返されますS_OK(AtlTrace の出力を監視しています)。spUnk.CoCreateInstanceIE が管理者として実行されている場合、BHO は正常に呼び出すこともできます。ただし、サービスを実際のサービスとして登録して実行し、保護モードで IE を実行すると、spUnk.CoCreateInstance返されます0x80070005(アクセスが拒否されました)。サービスが登録されていない場合、またはサービスが登録されているがservices.mscを介して「無効」に設定されている場合、他のエラーが発生するため、IEは少なくともサービスを見つけることができることを知っています。

spUnk.CoCreateInstanceへの呼び出しが成功するように、サービス、BHO、またはレジストリを変更する方法はありますか?

関連コード:

レジストリ エントリ ( MSDN: Starting Processes from Protected Mode による):

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\
    Low Rights\ElevationPolicy\{89091D9A-1F9A-4721-993B-D72C2333AAD1}]
"AppName"="tstsrv.exe"
"AppPath"="C:\\path\\tstsrv\\Debug"
"Policy"=dword:00000003
"CLSID"="{90719221-2DE2-45c2-B8CB-2018C4D66C48}"


サービスの呼び出しに使用される BHO コード (hr = spUnk.CoCreateInstance(CLSID_tstsrv);は問題のある回線です):

MyAddin::SetSite(IUnknown *pUnkSite) {
    //...
    GUID CLSID_tstsrv = { 0x90719221, 0x2de2, 0x45c2, { 0xb8, 0xcb, 0x20,
        0x18, 0xc4, 0xd6, 0x6c, 0x48 } };
    CComPtr<IUnknown> spUnk;
    hr = spUnk.CoCreateInstance(CLSID_tstsrv);
    AtlTrace("CoCreateInstance(CLSID_tstsrv) => %p [%08x]\n", spUnk.p, hr);
    //...
}


サービスの初期化コードの一部:

HRESULT CtstsrvModule::InitializeSecurity(void)
{
    if(m_bSecurityInitialized) return S_OK;
    m_bSecurityInitialized = true;
    return ::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
        RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_DYNAMIC_CLOAKING, 0);
}
4

1 に答える 1

3

これをさらに1時間いじり、このコード(archive.org)SetLaunchActPermissionsおよび)を呼び出すとGetLaunchActPermissionsWithIL機能することがわかりました。

そのページから:

既定では、COM は Low IL クライアントが COM サーバーの実行中のインスタンスにバインドするのを防ぎます。バインドを許可するには、COM サーバーの起動/アクティブ化セキュリティ記述子に、低 IL ラベルを指定する SACL が含まれている必要があります (このようなセキュリティ記述子を作成するサンプル コードについては、前のセクションを参照してください)。

于 2011-10-03T21:31:45.543 に答える