从Internet Explorer与服务交互

时间:2011-10-03 19:41:26

标签: c++ internet-explorer service bho protected-mode

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

有没有办法修改服务,BHO或注册表,以便对spUnk.CoCreateInstance的调用成功?

相关守则:

注册表项(每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);
}

1 个答案:

答案 0 :(得分:3)

另一个小时的问题,我发现调用this code (archive.org)SetLaunchActPermissionsGetLaunchActPermissionsWithIL)使其有效。

从该页面开始:

  

默认情况下,COM将阻止低IL客户端绑定到运行   任何COM服务器的实例。允许绑定,COM服务器   启动/激活安全描述符必须包含一个SACL   指定低IL标签(有关示例,请参阅上一节)   用于创建此类安全描述符的代码。)