我正在尝试对我们的传统产品进行一些更改,以支持BHO上的IE EPM。我已经设法加载了它并调用了各种方法-- SetSite、DocumentComplete等。
在尝试连接到在Windows服务中运行的命名管道服务器时,我似乎遇到了问题。
以前,我们已经做了一些更改,允许处于保护模式的IE BHO使用LOW_INTEGRITY_SDDL_SACL (“S:(ML;;NW;LW)”)访问命名管道服务器。在代码中,我们使用方法创建安全描述符,然后在实际的SD或SECURITY_ATTRIBUTES对象上执行SetSecurityDescriptorSacl。这允许BHO代码访问系统服务中托管的命名管道服务器。
我参考了几篇文章,其中最有用的可能是这篇文章-- 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;
}发布于 2016-10-08 10:20:16
我做了一些研究,并设法找到了一种可行的方法。
首先,AppContainer内部的BHO似乎不能访问在它自己的会话之外的Windows会话中创建的命名管道等。因为我是在Windows服务中创建命名管道服务器的,所以我指定什么安全描述符并不重要。恐怕行不通。
其次,使用介质完整性代理进程创建具有相同尝试SD的命名管道,它将是可访问的。因此,我采取的方法是为我的BHO创建一个代理,将这些消息转发到Windows服务。因此,我的“服务器”逻辑不需要移动。
我对这种方法并不感兴趣,但这并不是太糟糕,因为我也可以将此代码重用于基于JS的扩展,而无需完全重写核心代码。
第三,我需要一些方法来调用BHO,要求它根据外部刺激采取一些行动。为此,我在BHO的SetSite中创建了一个HWND_MESSAGE窗口,并在代理进程中使用SendMessage调用它。因为这是跨进程的,所以您需要使用WM_COPYDATA。
https://stackoverflow.com/questions/39138674
复制相似问题