0

我正在.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
    }
}
4

1 回答 1

2

普通用户无法在没有权限的情况下在全局命名空间中创建文件映射,因为会话 0分离(以及它看起来像 XP SP2)SeCreateGlobalPrivilege

请阅读CreateFileMapping明确提到这一点的函数的文档:

从会话零以外的会话在全局命名空间中创建文件映射对象需要 SeCreateGlobalPrivilege 权限。有关详细信息,请参阅内核对象命名空间。

您的进程没有在会话 0 中作为系统服务运行,因此在没有获得此权限的情况下无法创建全局文件映射。获得此特权的最简单方法是使用提升的特权运行该进程。

一种可能的替代方法(未经测试,基于来自各种未经证实的来源的信息的猜测)是尝试使用Session\(number)\(name). 如果您对映射的权限足够开放,那么其他进程应该可以访问它。

于 2013-05-08T14:04:41.553 回答