note : set file permission to everyone
发布日期:2021-06-30 22:04:24 浏览次数:2 分类:技术文章

本文共 1976 字,大约阅读时间需要 6 分钟。

今天遇到个问题:

服务创建一个SYSTEM权限的进程, 在进程中降低权限到当前登录用户的权限.

这个进程写的数据文件,以后其他登录用户也要读写.

可是这个文件被写后,就是当前用户所有. e.g. 普通管理员创建的文件,普通用户登录后,无法正常打开,拒绝访问.

需要对这个高权限的文件,设置文件权限到低等级用户组, 方便其他普通用户读写.

在 stackoverflow 上居然有人遇到了和我一模一样的场景和问题,并且已经解决, 开心~

void SetFilePermission(const WCHAR * pcFileName){	// @ref http://stackoverflow.com/questions/910528/how-to-change-the-acls-from-c	// need Accctrl.h, Aclapi.h    PSID pEveryoneSID = NULL;    PACL pACL = NULL;    EXPLICIT_ACCESS ea[1];    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;	if (NULL == pcFileName)		return;    // Create a well-known SID for the Everyone group.    AllocateAndInitializeSid(&SIDAuthWorld, 1,                     SECURITY_WORLD_RID,                     0, 0, 0, 0, 0, 0, 0,                     &pEveryoneSID);    // Initialize an EXPLICIT_ACCESS structure for an ACE.    // The ACE will allow Everyone read access to the key.    ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));    ea[0].grfAccessPermissions = 0xFFFFFFFF;    ea[0].grfAccessMode = GRANT_ACCESS;    ea[0].grfInheritance= NO_INHERITANCE;    ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;    ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;    ea[0].Trustee.ptstrName  = (LPTSTR) pEveryoneSID;    // Create a new ACL that contains the new ACEs.    SetEntriesInAcl(1, ea, NULL, &pACL);    // Initialize a security descriptor.      PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,                                 SECURITY_DESCRIPTOR_MIN_LENGTH);     InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION);    // Add the ACL to the security descriptor.     SetSecurityDescriptorDacl(pSD,             TRUE,     // bDaclPresent flag               pACL,             FALSE);   // not a default DACL     //Change the security attributes    SetFileSecurityW(pcFileName, DACL_SECURITY_INFORMATION, pSD);    if (pEveryoneSID)         FreeSid(pEveryoneSID);    if (pACL)         LocalFree(pACL);    if (pSD)         LocalFree(pSD);}

转载地址:https://lostspeed.blog.csdn.net/article/details/18572857 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HttpSendRequest's demo
下一篇:note : SetServiceStatus

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月23日 15时06分41秒