在模拟客户端时访问共享内存

Posted

技术标签:

【中文标题】在模拟客户端时访问共享内存【英文标题】:Accessing shared memory while impersonating a client 【发布时间】:2010-10-17 15:50:58 【问题描述】:

我在模拟客户端时尝试从 ASP.NET Web 方法访问全局共享内存,但在尝试打开句柄时访问被拒绝。举个例子:

[WebMethod]
public string Testing()

  string result = null;

  using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
  
    IntPtr p1 = NativeMethods.OpenFileMapping(NativeMethods.FILE_MAP_READ, false,
      @"Global\NetTcpPortSharing/endpoint");
    if (p1 == IntPtr.Zero)
      result = string.Format(" fail p1 (0)", Marshal.GetLastWin32Error());
    else
      result = " ok p1";
  

  IntPtr p2 = NativeMethods.OpenFileMapping(NativeMethods.FILE_MAP_READ, false,
    @"Global\NetTcpPortSharing/endpoint");
  if (p2 == IntPtr.Zero)
    result += string.Format(" fail p2 (0)", Marshal.GetLastWin32Error());
  else
    result += " ok p2";

  return result;

这会导致这个输出:

<string> ok p1 fail p2 (5)</string>

因此,如果我将凭据放入应用程序池身份,它会正常打开,但使用模拟凭据会失败。如果客户端运行控制台程序(即没有模拟),则对OpenFileMapping 的相同调用会成功。

这是 Windows 强制执行的一些安全设置吗? 我怎样才能找出我的访问被拒绝的原因? 对如何完成这项工作有任何建议吗?

我正在使用 IIS 7.5 和 Impersonation + Windows Auth、.NET 4.0 的 Windows 7 上进行测试。在带有 IIS 6 的 Server 2003 上的类似结果。

【问题讨论】:

【参考方案1】:

我对 IIS 一无所知,但听起来全局部分对象上的安全描述符并未授予对模拟帐户的访问权限。谁创建了对象?如果是您的代码,您可以给它一个自定义 ACL,允许帐户(或所有人)读取它。

【讨论】:

同一个账号可以直接访问全局对象,只有在涉及冒充时才会失败。该对象是由 MS 服务创建的,因此我无法控制它。 是否在任何地方记录了对象是如何创建的(即它具有什么安全描述符)?也许这是一个完整性级别问题。您可以使用 Process Explorer 查看对象的安全描述符。

以上是关于在模拟客户端时访问共享内存的主要内容,如果未能解决你的问题,请参考以下文章

Linux共享内存

将一组结构放入unix中的共享内存中,以便客户端程序可以访问它

通过使用 mmap() 在进程之间共享内存

访问共享内存时出现分段错误

确定 Windows 中哪个进程创建了共享内存

共享内存访问导致 rss 增加