我正在尝试对我们的旧产品进行一些更改,以支持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部分中的Everyone,ALL APPLICATION PACKAGES和SYSTEM提供了完整的文件访问权限。我知道它过于宽松,但我预计这应该至少在我使用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;
}
答案 0 :(得分:1)
我做了一些研究,并设法找出一种有效的方法。
首先,似乎AppContainer中的BHO无法访问在Windows会话中创建的命名管道等。由于我在Windows服务中创建了命名管道服务器,因此我指定的安全描述符无关紧要。它不起作用。
其次,使用中等完整性代理进程创建具有相同尝试SD的命名管道,并且可以访问它。所以,我采取的方法是为我的BHO创建一个代理,将这些消息转发给Windows服务。所以,我的“服务器”逻辑不需要移动。
我对这种方法并不感到兴奋,但它并不太糟糕,因为我可以在没有完全重写核心代码的情况下将这些代码重用于基于JS的扩展。
第三,我需要某种方式回到BHO,要求它采取一些基于外部刺激的行动。我设法通过在BHO的SetSite中创建HWND_MESSAGE窗口并使用Broker进程中的SendMessage调用它来实现此目的。由于这是跨进程的,因此您需要使用WM_COPYDATA。