如何让多用户共享同一个已命名内存映射?

布学无数 2006-08-26 03:08:07
我匿名启动了一个服务,服务中创建了一个命名的内存映射,如何在用户登录后能正常打开该内存映射?
...全文
292 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
布学无数 2006-08-27
  • 打赏
  • 举报
回复
昨天已经解决了,创建了一个所有用户都能访问的安全描述符之后就可以了。
goodboyws(深夜不眠者(VCMVP)) 的方法没有试过,不过还是谢谢了:)
goodboyws 2006-08-26
  • 打赏
  • 举报
回复
BOOL TakeOwnership(LPTSTR lpszOwnFile)
{

HANDLE hToken;
BYTE sidBuffer[100];
PSID pSID = (PSID)&sidBuffer;
SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
DWORD dwRes;

// Try to remove the object's DACL.

dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
DACL_SECURITY_INFORMATION, // change only the object's DACL
NULL, NULL, // don't change owner or group
NULL, // no DACL specified - allows everyone access
NULL); // don't change SACL

if (dwRes == ERROR_SUCCESS)
return TRUE;
else if (dwRes != ERROR_ACCESS_DENIED) {
printf("First SetNamedSecurityInfo call failed: %u\n", dwRes);
return FALSE;
}

// If the preceding call failed because access was denied,
// enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
// the Administrators group, take ownership of the object, and
// disable the privilege. Then try again to set the object's DACL.

// Open a handle to the access token for the calling process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES, &hToken)) {
printf("OpenProcessToken failed: %u\n", GetLastError());
return FALSE;
}

// Enable the SE_TAKE_OWNERSHIP_NAME privilege.
if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE)) {
printf("You must be logged on as Administrator.\n");
return FALSE;
}

// Create a SID for the BUILTIN\Administrators group.
if (!AllocateAndInitializeSid(&SIDAuth, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pSID)) {
printf("AllocateAndInitializeSid error %u\n", GetLastError());
return FALSE;
}

// Set the owner in the object's security descriptor.
dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
OWNER_SECURITY_INFORMATION, // change only the object's owner
pSID, // SID of Administrator group
NULL, NULL, NULL);

if (pSID)
FreeSid(pSID);

if (dwRes != ERROR_SUCCESS) {
printf("Could not set owner. Error: %u\n", dwRes);
return FALSE;
}

// Disable the SE_TAKE_OWNERSHIP_NAME privilege.
if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, FALSE)) {
printf("You must be logged on as Administrator.\n");
return FALSE;
}

// Try again to remove the object's DACL, now that we are the owner.
dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
DACL_SECURITY_INFORMATION, // change only the object's DACL
NULL, NULL, // don't change owner or group
NULL, // no DACL specified - allows everyone access
NULL); // don't change SACL

if (dwRes == ERROR_SUCCESS)
return TRUE;

printf("Second SetNamedSecurityInfo call failed: %u\n", dwRes);
return FALSE;
}
折腾_苏州 2006-08-26
  • 打赏
  • 举报
回复
一般是可以的吧..
CreateFileMapping,之后不要CloseHandle

再看看OpenFileMapping之后的GetLastError()是多少?
布学无数 2006-08-26
  • 打赏
  • 举报
回复
恩,内存映射文件(由CreateFileMapping创建的)我用过很多,而且也很熟悉,在很多应用中都用过,很好用
现在的问题是这样:
我有一个服务(Services)创建了一个已命名的内存映射文件(CreateFileMapping最后一个参数指定了名字),之后我的另一个应用程序(Application)需要打开这个内存映射文件并写入一些数据,现在我的程序无法打开这个内存映射文件,所以才问大家,谁能支个招?!
dick_song 2006-08-26
  • 打赏
  • 举报
回复
File mapping?
rageliu 2006-08-26
  • 打赏
  • 举报
回复
http://www.suoxiyu.com/s1316/17232.htm
http://www.lzu.edu.cn/netteach/jiaochen/vc++5.0/vc++5.0/chap2/chap2_3.htm
http://blog.codingnow.com/2005/10/
rageliu 2006-08-26
  • 打赏
  • 举报
回复
http://www.lcboy.cn/96e0a46f-9809-4dc3-a378-94f196e6aa506084313157462951.html

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧