internet-explorer - 从 IE EPM BHO 中访问命名管道服务器

标签 internet-explorer internet-explorer-11 bho appcontainer

我正在尝试对我们的旧产品进行一些更改,以支持 BHO 上的 IE EPM。我已经设法加载它并调用各种方法 - SetSite、DocumentComplete 等。

在尝试连接到 Windows 服务中运行的命名管道服务器时,我似乎遇到了障碍。

之前,我们已经进行了更改,以允许保护模式下的 IE BHO 访问命名管道服务器 - 使用 LOW_INTEGRITY_SDDL_SACL ("S:(ML;;NW;;;LW)")。在代码中,我们使用 ConvertStringSecurityDescriptorToSecurityDescriptor 方法创建安全描述符,然后对实际 SD 或 SECURITY_ATTRIBUTES 对象执行 SetSecurityDescriptorSacl。这允许 BHO 代码访问 SYSTEM 服务中托管的命名管道服务器。

我引用了几篇文章,最有用的可能是这篇文章 - Is there a way to create a named pipe from an AppContainer BHO on IE11?

我对 SDDL 做了一些更改,所以现在看起来像 -

#define EPM_INTEGRITY_SDDL L"S:(ML;;NW;;;LW)D:(A;;FA;;;SY)(A;;FA;;;WD)(A;;FA;;;AC)"

这基本上为每个人、所有应用程序包和 DACL 部分中的系统提供了完整的文件访问权限。我知道这太宽松了,但我预计一旦我使用 SetSecurityDescriptorDacl ,这至少应该起作用:-)

无论如何,设置 SD 的代码现在如下所示。我在这里遗漏了什么吗?

if (!ConvertStringSecurityDescriptorToSecurityDescriptor(EPM_INTEGRITY_SDDL, SDDL_REVISION_1, &pLISD, NULL))
{
    OutputDebugString(L"Unable to get the app-container integrity security descriptor");
    return false;
}

PACL pAcl = 0;
BOOL bAclPresent   = FALSE;
BOOL bAclDefaulted = FALSE;             
if (!GetSecurityDescriptorSacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
    return false;
}

if (!SetSecurityDescriptorSacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
    return false;
}

pAcl = 0;
bAclPresent = FALSE;
bAclDefaulted = FALSE;
if (!GetSecurityDescriptorDacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
    OutputDebugString(L"Setting to low integrity : No DACL Available");
            return false;
}

if (!SetSecurityDescriptorDacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
    OutputDebugString(L"Setting to low integrity : Unable to set the DACL");
    return false;
}

最佳答案

我做了一些研究并设法找到了一种有效的方法。

首先,AppContainer 内的 BHO 似乎无法访问在除其自己的 Windows session 中创建的命名管道等。由于我是在 Windows 服务中创建命名管道服务器,因此指定什么安全描述符并不重要。这是行不通的。

其次,使用中等完整性代理进程来创建具有相同尝试 SD 的命名管道,并且它将可以访问。因此,我采取的方法是创建一个 BHO 代理,将这些消息转发到 Windows 服务。所以,我的“服务器”逻辑不需要移动。

我对这种方法并不满意,但也不算太糟糕,因为我也可以在基于 JS 的扩展中重用此代码,而无需完全重写核心代码。

第三,我需要某种方式来回调 BHO,要求它根据外部刺激采取一些行动。我通过在 BHO 的 SetSite 中创建 HWND_MESSAGE 窗口并使用 Broker 进程中的 SendMessage 调用它来设法实现此目的。由于这是跨进程的,因此您需要使用 WM_COPYDATA。

关于internet-explorer - 从 IE EPM BHO 中访问命名管道服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39138674/

相关文章:

css - 如何在 CSS 中检测浏览器是 IE 11 还是 Edge?

internet-explorer - 有没有办法从 IE11 上的 AppContainer BHO 创建命名管道?

html - 垂直渐变/IE

javascript - 在 Ie 7 上导出 Canvas 图像

java - sendKeys 到 contentEditable div 在 Internet Explorer 中不起作用

css - 根据字体颜色在 IE11 上更改突出显示样式的问题,如何将其保留为默认值?

javascript - 使用 JavaScript 比较 Internet Explorer 中的日期

html - 通过 iFrame 登录不适用于 IE9?

c++ - BHO 处理 OnSubmit 事件

c# - 在客户环境中调试崩溃的后续步骤