【发布时间】: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 上的类似结果。
【问题讨论】:
标签: asp.net windows impersonation