Я пытаюсь, чтобы IE9 взаимодействовал со службой COM (созданной с помощью мастера Visual Studio 2010) во время работы в защищенном режиме. Если я запускаю службу как администратор, а не регистрирую ее как службу, мой вызов BHO на spUnk.CoCreateInstance
возвращает S_OK
(я смотрю вывод AtlTrace). BHO также может успешно вызвать spUnk.CoCreateInstance
, если IE работает от имени администратора. Однако, если я регистрирую и запускаю службу как фактическую службу и запускаю IE в защищенном режиме, spUnk.CoCreateInstance
возвращает 0x80070005
(доступ запрещен). Я знаю, что IE, по крайней мере, может найти службу, поскольку я получаю другие ошибки, если служба не зарегистрирована или если она зарегистрирована, но установлена на «Отключено» через services.msc.
Есть ли способ изменить службу, BHO или реестр, чтобы вызов spUnk.CoCreateInstance
был успешным?
Соответствующий код:
Записи реестра (для MSDN: запуск процессов из защищенного режима ):
[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);
}