最近做了一个采用FileMapping进行进程间通信的程序,目的是希望通过这个程序实现WebService和我写的其他服务之间

通信,实现安全隔离以及一些状态的跟踪、保持和管理。做好后,先用两个普通的Windows 进程测试了一下,在1.8G双核

笔记本电脑上,每秒钟可以发送3万个1000字节大小的消息,效率基本达到我的要求(我没有把效率优化到极致,效率瓶颈

和优化方法我基本知道,就是人懒,现在的方案已经可以达到系统要求,就暂时不想弄了,等以后有时间再优化吧)

立即将客户端移植到ASP.NET中,结果打开FileMapping失败,立即意识到是权限问题。到网上搜了一遍,有网友说强制让

ASP.NET扮演系统管理员权限来解决,觉得不妥,一听就觉得不是一个安全的解决方案。第二种是采用NULL DACL 权限描述

符,赋予系统内核对象对任何用户都开放的完全的访问权限,这种方法比第一种好一些,不过攻击者依然可以用很低的权限

登录系统后对系统内核对象进行操作,破坏系统。第三种方法是只把服务自生和ASP.NET的权限描述符赋予系统内核对象,这种

方法安全性最高。

网上代码大多是C++写的,我用C#先写了一个NULL DACL 的代码,用了一下,果然和预期的结果一样,WebService可以和

服务进程通讯了。把这个代码给大家共享一下。第三种方法的代码以后再补充。

推荐参考这篇文章: http://dev.csdn.net/article/33/33903.shtm

NULL DACL 的C#写法:

 


设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
    [StructLayoutAttribute(LayoutKind.Sequential)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图    

public
 
struct
 SECURITY_DESCRIPTOR
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图1设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图2    

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3
{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public byte revision;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public byte size;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public short control;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public IntPtr owner;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public IntPtr group;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public IntPtr sacl;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public IntPtr dacl;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图5    }


设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图    [StructLayout(LayoutKind.Sequential)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图    

public
 
class
 SecurityAttributes : IDisposable
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图1设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图2    

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3
{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        [DllImport(
"advapi32.dll", SetLastError = true)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
static extern bool SetSecurityDescriptorDacl(IntPtr sd, bool daclPresent, IntPtr dacl, bool daclDefaulted);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        [DllImport(
"advapi32.dll", SetLastError = true)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
static extern bool InitializeSecurityDescriptor(IntPtr pSecurityDescriptor, uint dwRevision);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
private int nLength;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
private IntPtr lpSecurityDescriptor;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
private int bInheritHandle;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public SecurityAttributes()
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图6设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图7        
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
//Get SecurityAttributes size
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
            nLength = Marshal.SizeOf(typeof(SecurityAttributes));
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
//Inherit handle
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
            bInheritHandle = 1;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
//Create a NULL DACL 
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
            SECURITY_DESCRIPTOR sd = new SECURITY_DESCRIPTOR();
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
//Alloc memory for security descriptor
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
            lpSecurityDescriptor = Marshal.AllocCoTaskMem(Marshal.SizeOf(sd));
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
//Struct to Ptr
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
            Marshal.StructureToPtr(sd, lpSecurityDescriptor, false);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            InitializeSecurityDescriptor(lpSecurityDescriptor, 
1);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            SetSecurityDescriptorDacl(lpSecurityDescriptor, 
true, IntPtr.Zero, false);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图8        }

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
public void Dispose()
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图6设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图7        
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            
lock (this)
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图6设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图7            
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4                
if (lpSecurityDescriptor != IntPtr.Zero)
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图6设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图7                
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4                    Marshal.FreeHGlobal(lpSecurityDescriptor);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4                    lpSecurityDescriptor 
= IntPtr.Zero;
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图8                }

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图8            }

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图8        }

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4        
~SecurityAttributes()
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图6设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图7        
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图3{
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4            Dispose();
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图8        }

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图4
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图5    }


和FileMapping内核对象相关的API函数申明:

设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
        [DllImport(
"
Kernel32.dll
"
, EntryPoint 
=
 
"
CreateFileMapping
"
, SetLastError 
=
 
true
, CharSet 
=
 CharSet.Unicode)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        

internal
 
static
 
extern
 IntPtr CreateFileMapping(
uint
 hFile, SecurityAttributes lpAttributes, 
uint
 flProtect, 
uint
 dwMaximumSizeHigh, 
uint
 dwMaximumSizeLow, 
string
 lpName);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [DllImport(

"
Kernel32.dll
"
, EntryPoint 
=
 
"
OpenFileMapping
"
, SetLastError 
=
 
true
, CharSet 
=
 CharSet.Unicode)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        

internal
 
static
 
extern
 IntPtr OpenFileMapping(
uint
 dwDesiredAccess, 
bool
 bInheritHandle, 
string
 lpName);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [DllImport(

"
Kernel32.dll
"
, EntryPoint 
=
 
"
MapViewOfFile
"
, SetLastError 
=
 
true
, CharSet 
=
 CharSet.Unicode)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        

internal
 
static
 
extern
 IntPtr MapViewOfFile(IntPtr hFileMappingObject, 
uint
 dwDesiredAccess, 
uint
 dwFileOffsetHigh, 
uint
 dwFileOffsetLow, 
uint
 dwNumberOfBytesToMap);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [DllImport(

"
Kernel32.dll
"
, EntryPoint 
=
 
"
UnmapViewOfFile
"
, SetLastError 
=
 
true
, CharSet 
=
 CharSet.Unicode)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [

return
: MarshalAs(UnmanagedType.VariantBool)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        

internal
 
static
 
extern
 
bool
 UnmapViewOfFile(IntPtr lpBaseAddress);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [DllImport(

"
Kernel32.dll
"
, EntryPoint 
=
 
"
FlushViewOfFile
"
, SetLastError 
=
 
true
, CharSet 
=
 CharSet.Unicode)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        [

return
: MarshalAs(UnmanagedType.VariantBool)]
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图        

internal
 
static
 
extern
 
bool
 FlushViewOfFile(IntPtr lpBaseAddress, 
uint
 dwNumberOfBytesToFlush);
设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题插图

转载于:https://www.cnblogs.com/haozhiyu/archive/2008/05/14/1197359.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/95558906

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题
   

还没有人抢沙发呢~