【问题标题】:OpenFileMapping access denied in some exes在某些 exes 中拒绝 OpenFileMapping 访问
【发布时间】:2011-04-10 21:49:02
【问题描述】:

我有一个使用

写入变量的程序
CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE , 0, sizeof(data), "Local\\testtest");

然后我将 dll 加载到调用

的 firefox 的 plugin-container.exe(以本地登录用户身份运行)中
OpenFileMapping(FILE_MAP_READ,  FALSE, "Local\\testtest");

这很好用。但是,当我尝试将我的 dll 加载到 iexplore.exe(也以本地登录用户身份运行)时尝试相同的操作时,我得到一个 NULL 值并且 GetLastError 返回 (0x5) ACCESS DENIED。

我尝试在 dll 中调整进程的权限以添加 SE_CREATE_GLOBAL_NAME 但这没有任何区别(而且我没想到会这样,因为只需要创建一个我相信的全局名称而不是本地名称我正在使用)。

无论我尝试什么,使用 iexplore.exe 都会失败并显示 ACCESS DENIED。我发现的唯一一种解决方法是以管理员身份运行我的 setter 程序并以管理员身份运行 iexplore.exe 然后它能够​​读取它。但我不认为这是一个解决方案,因为我真的想避免在管理员下运行整个 exe。

有人知道解决这个问题的方法吗?

【问题讨论】:

  • 尝试显式设置映射权限?
  • 您的意思是在 createfilemapping() 中设置 lpAttributes 吗?我还没有尝试过,我现在会考虑使用它。
  • 不幸的是,这个没有骰子,我尝试设置它但没有任何区别。
  • 什么操作系统?也许 IE 正在保护模式下运行,并且完整性级别阻止您访问它。
  • @OmerRaviv 我发现我上面尝试的技术只有在应用程序/插件容器最初以足够的权限运行时才有效。它在 Firefox 上完美运行(也许插件容器在接近管理员级别运行),但在 chrome 或 IE 上却没有。但是,如果我以管理员身份运行 chrome 或 IE,那么它也可以在这些浏览器上运行。我放弃了这种方法,因为我不能指望用户以管理员身份运行浏览器。相反,我选择在 DLL 中使用隐藏窗口 -CreateWindow(),然后使用 PostMessage 从我的主应用程序发送消息。

标签: c++ c windows visual-c++


【解决方案1】:

如果安全不是问题,只是想让它发挥作用,您还可以将文件映射的 DACL 设置为 NULL,这样每个人都可以完全访问。

以下是一个例子。

SetSecurityInfo(handle, SE_KERNEL_OBJECT, 
    DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,
    NULL, NULL, NULL, NULL);

但请理解,如果您担心安全问题,不建议这样做。

【讨论】:

  • @istudy0 澄清一下,服务器是否在自己的句柄副本上调用SetSecurityInfo?因为您不能在客户端上执行此操作,因为所述问题是 OpenFileMapping 不返回一个。
  • 通过尝试弄清楚了:是的,服务器调用SetSecurityInfo,如this answer所示,在它自己的句柄上。奇迹般有效。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2017-10-03
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多