2011-10-03 123 views
4

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

有没有办法修改服务,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); 
} 

回答

3

这一摆弄,我发现打电话this code (archive.org)SetLaunchActPermissionsGetLaunchActPermissionsWithIL)使得它的工作的一个小时。

在这个页面:

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