Взаимодействие с сервисом из Internet Explorer - PullRequest
4 голосов
/ 03 октября 2011

Я пытаюсь, чтобы 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);
}

1 Ответ

3 голосов
/ 04 октября 2011

Еще один час с этим, и я обнаружил, что вызов этого кода (archive.org) (SetLaunchActPermissions и GetLaunchActPermissionsWithIL) заставляет его работать.

С этой страницы:

По умолчанию COM предотвращает привязку клиентов с низким IL к выполнению экземпляры любых COM-серверов. Чтобы разрешить привязку, COM-сервер Дескриптор безопасности запуска / активации должен содержать SACL, который определяет метку Low IL (см. предыдущий раздел для образца код для создания такого дескриптора безопасности).

...