我正在尝试在模拟客户端时从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 7上测试,有IIS 7.5和Impersonation + Windows Auth,.NET 4.0。 Server 2003 w / IIS 6上的类似结果。
答案 0 :(得分:0)
我对IIS一无所知,但听起来全局部分对象上的安全描述符不授予对模拟帐户的访问权限。谁创造了这个对象?如果是您的代码,您可以为其提供一个自定义ACL,允许帐户(或所有人)阅读它。