簡體   English   中英

從Internet Explorer與服務交互

[英]Interacting with a Service from Internet Explorer

我試圖讓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:從保護模式啟動進程 ):

[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);
}

SetLaunchActPermissions小時,我發現調用此代碼(archive.org)SetLaunchActPermissionsGetLaunchActPermissionsWithIL )使其工作。

從該頁面:

默認情況下,COM將阻止低IL客戶端綁定到任何COM服務器的運行實例。 要允許綁定,COM服務器的啟動/激活安全描述符必須包含指定低IL標簽的SACL(有關創建此類安全描述符的示例代碼,請參閱上一節)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM