与Internet Explorer中的服务交互

Interacting with a Service from Internet Explorer

本文关键字:服务 交互 Internet Explorer      更新时间:2023-10-16

我试图让IE9在保护模式下运行时与COM服务(使用Visual Studio 2010的向导创建)进行交互。如果我以admin身份运行服务,而不是将其注册为服务,我的BHO对spUnk.CoCreateInstance的调用返回S_OK(我正在观看AtlTrace的输出)。如果IE以管理员身份运行,BHO也能够成功调用spUnk.CoCreateInstance。但是,如果我注册并将service作为实际服务运行,并在保护模式下运行IE, spUnk.CoCreateInstance返回0x80070005(拒绝访问)。我知道IE至少能够找到服务,因为如果服务未注册,或者如果它已注册但通过services.msc设置为"禁用",我会得到其他错误。

是否有办法修改服务、BHO或注册表,使对spUnk.CoCreateInstance的调用成功?

相关代码:

注册表项(按MSDN:从保护模式启动进程):

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet Explorer
    Low RightsElevationPolicy{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);
}

又折腾了一个小时,我发现调用这段代码(archive.org) (SetLaunchActPermissionsGetLaunchActPermissionsWithIL)可以使它工作。

From the page:

默认情况下,COM将阻止低IL客户端绑定到运行任何COM服务器的实例。为了允许绑定,COM服务器的启动/激活安全描述符必须包含一个SACL指定Low IL标签(参见前一节的示例)创建这样的安全描述符的代码)。