![]() |
1
9
最简单的方法是让您的服务创建共享内存,并在createfilemapping中指定一个dacl,该dacl授予常规用户对共享内存的读取访问权。 普通用户没有创建全局权限,但服务可以拥有此权限。如果您必须让用户创建共享内存,然后让服务探测它,那么您可以有一个IPC方案,在这个方案中,您的用户代码向包含文件映射句柄的服务发送一条消息,然后服务将调用Duplicatehandle来获取对它的引用。这将需要您的服务以调试特权运行。 创建DACL的最简单方法是使用ConvertStringSecurityDescriptorToSecurityDescriptor,它采用一个名为SDDL的指定ACL格式的字符串。 Writing Secure Code 包含一个关于用sddl创建dacl的优秀章节。
“d:p(a;oici;ga;;;sy)(a;oici;ga;;;ba)(a;oici;gr;;;iu)”指定DACL。D:P表示这是一个dacl(而不是sacl)。..。你很少使用sacl),后面跟着几个ace字符串来控制谁可以访问。每一个都是一个(allow)并允许对象和包含继承(oici)。第一个将所有访问权(ga-grant all)授予系统(sy)和管理员(ba,内置管理员)。最后一个将read(gr)授予交互式用户(iu),后者实际上是登录到会话的用户。 完成后,普通用户应该能够调用OpenFileMapping来获取共享映射的句柄,并能够将其映射到自己的进程中。由于普通用户对对象的权限有限,他们必须确保打开对象并将其映射为只读访问。 如果用户需要写访问,您可以用gwgr替换gr。请注意,这是不安全的—这样,有限的用户就可以在服务读取和解析信息时修改共享内存,从而导致服务崩溃。 |