我正在使用.net平台并使用C ++编写我的应用程序。当我使用以下代码创建一个全局共享内存来存储Windows XP中的某些值时,它完全正常工作但是在Windows 7中使用它时,它给出了错误,所以我也应用了安全属性,但仍然给出了特定权限错误。
//Global declaration
TCHAR szName[]=TEXT("Global\\MyObject");
bool CreateDACL(SECURITY_ATTRIBUTES *sa)
{
wchar_t *sdd = L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GRGW;;;IU)";
return ConvertStringSecurityDescriptorToSecurityDescriptor((LPCSTR)sdd, SDDL_REVISION_1, &sa->lpSecurityDescriptor, NULL) == TRUE;
}
void CreateShareMemory()
{
HANDLE hMapFile =NULL; // Create handle
// Check if already created
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
// If not created, then create
if(hMapFile == NULL)
{
SECURITY_ATTRIBUTES sa;
CreateDACL(&sa);
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
&sa, // default security
PAGE_READWRITE|SEC_COMMIT, // read/write access
0, // max. object size
256, // buffer size
szName); // name of mapping object
int i=GetLastError(); // Here it is giving error no 5
}
}
答案 0 :(得分:2)
普通用户无法在全局命名空间中创建文件映射,因为Session 0分离(看起来像XP SP2)没有SeCreateGlobalPrivilege
权限。
请阅读CreateFileMapping
函数的文档,该文档明确提及:
从会话零以外的会话在全局命名空间中创建文件映射对象需要SeCreateGlobalPrivilege特权。有关更多信息,请参阅内核对象命名空间。
您的进程未在会话0中作为系统服务运行,因此无法在未获得此权限的情况下创建全局文件映射。获得此权限的最简单方法是使用提升的权限运行该进程。
一种可能的替代方法(基于来自各种未经证实的来源的信息的未经测试的猜测)是尝试使用Session\(number)\(name)
在会话的命名空间中查找文件映射。如果您足够打开映射的权限,则其他进程应该可以访问它。