在模拟客户端时访问共享内存
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
的相同调用会成功。
我正在使用 IIS 7.5 和 Impersonation + Windows Auth、.NET 4.0 的 Windows 7 上进行测试。在带有 IIS 6 的 Server 2003 上的类似结果。
【问题讨论】:
【参考方案1】:我对 IIS 一无所知,但听起来全局部分对象上的安全描述符并未授予对模拟帐户的访问权限。谁创建了对象?如果是您的代码,您可以给它一个自定义 ACL,允许帐户(或所有人)读取它。
【讨论】:
同一个账号可以直接访问全局对象,只有在涉及冒充时才会失败。该对象是由 MS 服务创建的,因此我无法控制它。 是否在任何地方记录了对象是如何创建的(即它具有什么安全描述符)?也许这是一个完整性级别问题。您可以使用 Process Explorer 查看对象的安全描述符。以上是关于在模拟客户端时访问共享内存的主要内容,如果未能解决你的问题,请参考以下文章