Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从低完整性进程访问MemoryMappedFile_C#_Windows_Security_Ipc - Fatal编程技术网

C# 从低完整性进程访问MemoryMappedFile

C# 从低完整性进程访问MemoryMappedFile,c#,windows,security,ipc,C#,Windows,Security,Ipc,我试图在一个中等完整性进程上创建一个MemoryMappedFile,然后在一个低完整性子进程上打开同一个文件,并将此共享内存用于IPC。没有真正的磁盘文件(使用MemoryMappedFile.CreateNew) 我的问题是,低完整性进程无法打开共享内存,抛出这样的消息:“System.UnauthorizedAccessException:对路径的访问被拒绝。”。这种情况并不奇怪,因为我希望从低完整性进程获得写访问权,但是如何授予它访问权呢 这是我的密码: 中等完整性过程: Memory

我试图在一个中等完整性进程上创建一个MemoryMappedFile,然后在一个低完整性子进程上打开同一个文件,并将此共享内存用于IPC。没有真正的磁盘文件(使用MemoryMappedFile.CreateNew)

我的问题是,低完整性进程无法打开共享内存,抛出这样的消息:“System.UnauthorizedAccessException:对路径的访问被拒绝。”。这种情况并不奇怪,因为我希望从低完整性进程获得写访问权,但是如何授予它访问权呢

这是我的密码:


中等完整性过程:

MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
var file = MemoryMappedFile.CreateNew("test", 4096, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, HandleInheritability.Inheritable);

var view = file.CreateViewAccessor();
view.Write(0, true);
try
{
    MemoryMappedFile file = MemoryMappedFile.OpenExisting("test", MemoryMappedFileRights.ReadWrite);
    var view = file.CreateViewAccessor();
    var v = view.ReadBoolean(0);
    Log.Info("MAPPED: " + v);
}
catch (Exception e)
{
    Log.Info("Error: " + e);
}
低完整性过程:

MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
var file = MemoryMappedFile.CreateNew("test", 4096, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, HandleInheritability.Inheritable);

var view = file.CreateViewAccessor();
view.Write(0, true);
try
{
    MemoryMappedFile file = MemoryMappedFile.OpenExisting("test", MemoryMappedFileRights.ReadWrite);
    var view = file.CreateViewAccessor();
    var v = view.ReadBoolean(0);
    Log.Info("MAPPED: " + v);
}
catch (Exception e)
{
    Log.Info("Error: " + e);
}

如果两个过程都以中等完整性工作,则工作正常。阅读后,我尝试在介质完整性过程中设置SDDL字符串,如下所示:

security.SetSecurityDescriptorSddlForm("S:(ML;;NW;;;LW)");
但这给了我另一个例外,这次创建内存映射文件时:“System.IO.IOException:客户端不持有所需的特权。”。我不确定这是不是正确的方法,我不太清楚Win32/C++示例如何转换为C#


有人知道这方面的更多信息吗?

好的,有一个有效的解决方案。有两个问题:

  • 将空的MemoryMappedFileSecurity对象传递给MemoryMappedFile.CreateNew()会使映射的内存甚至对同一进程都不可访问。这解释了我在评论中的错误(“System.UnauthorizedAccessException:拒绝访问路径”)

  • 实际上,我无法让
    security.setsecuritydescriptorsdlform
    正常工作(尽管谷歌透露了其他几次尝试,但没有一次对我有效)。相反,我使用了以下解决方案:。据我所知,它做同样的事情,但使用了PInvoke。因此,我刚刚调用了
    进程间安全性.SetLowIntegrityLevel(file.SafeMemoryMappedFileHandle)
    ,它使它可以从低完整性子进程访问。成功


  • 这不是一个完美的解决方案,但我现在只需要一个有效的解决方案。谢谢你的帮助

    您需要SeRelabelPrivilege来更改现有对象的强制完整性级别。如果您使用管理员权限运行,则应该能够启用SeRelabelPrivilege以进行更改。如果没有,我认为您需要在创建对象时指定完整性级别。。。。或者你可以反转这个过程,让低完整性进程创建内存映射,让中等完整性进程打开它。啊,对-但是使用管理员权限运行对我来说不是一个选项:(我以为我在对象创建时指定了完整性级别。)(安全对象进入介质完整性过程中的MemoryMappedFile.CreateNew)。另一方面,您提到的第二个选项可能会起作用,我今晚就试试。谢谢!设置您使用的SDDL在本机代码中起作用,没有管理员权限。(也就是说,不会返回任何错误,我可以从创建文件映射的进程映射文件映射视图。我实际上没有尝试从低完整性进程访问它。)可能您正在使用的.NET类中存在错误或设计错误。尝试将其交换,以便低完整性进程创建共享内存。虽然看起来成功,但这次我实际上无法在中等完整性进程中读取内存(相同错误,“System.UnauthorizedAccessException:拒绝访问路径”)。事实上,即使我在子进程上启用了中等完整性,我也会得到这个结果……很有趣;这在创建时并没有设置完整性级别。您传递了一个句柄,因此对象已经存在,这意味着我最初的猜测是错的。(我应该自己在本机代码中尝试一下。)如果我能理解.NET类是如何生成“必需特权”错误的,那就糟了!但只要你有解决方案,我想这并不重要。+1.:-)