【发布时间】:2017-01-01 11:54:05
【问题描述】:
我正在尝试对我们的旧产品进行一些更改,以支持 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;
}
【问题讨论】:
-
非常感谢
EPM_INTEGRITY_SDDL。像魅力一样工作,现在我在 Windows 10 的 IE11 中以 EPM 模式运行的 BHO 能够打开一些由常规桌面进程创建的共享内存。是的,我知道,这不是要走的路(又名“巨型后门”),但总有一天我会走经纪人路线…… -
干杯!据我了解,常规桌面进程是您的“经纪人”。就我而言,我试图让我的 Windows 服务(在会话 0 中运行)作为我的代理进程,但即使使用 SDDL 的跨会话请求也无法在那里工作。下面的解决方案有点告诉你如何照顾两个沟通方向。
标签: internet-explorer internet-explorer-11 bho epm appcontainer