本文的程序需在管理员的权限下运行

原文参考:http://m.myexception.cn/vc-mfc/120522.html

可以修改指定文件的或者文件夹的属性

TCHAR* lpFileName, TCHAR* lpAccountName, DWORD dw

lpFileName指定需要设置文件或者文件夹的路径,lpAccountName为需要设置的组的名字例如:Everyone,

dw为设置的属性的ACCESS_MASK具体的值有以下。参考:https://blogs.msdn.microsoft.com/openspecification/2010/04/01/about-the-access_mask-structure/

#define myHeapAlloc(x) (HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,x))typedef BOOL(WINAPI *SetSecurityDescriptorControlFnPtr)(IN PSECURITY_DESCRIPTOR pSecurityDescriptor,IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet);typedef BOOL(WINAPI *AddAccessAllowedAceExFnPtr)(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,PSID pSid);
BOOL AddRights(TCHAR* lpFileName, TCHAR* lpAccountName, DWORD dw)
{//lookupAccountName相关变量PSID pUserID = NULL;DWORD dUserID = 0;TCHAR* pDomainName = NULL;DWORD dDomainName = 0;SID_NAME_USE snuType;//第一步,取得传入的用户或用户组的SIDBOOL check1 = LookupAccountName(NULL, lpAccountName, pUserID, &dUserID, pDomainName, &dDomainName, &snuType);pUserID = (PSID)myHeapAlloc(dUserID);pDomainName = (TCHAR*)myHeapAlloc(dDomainName * sizeof(TCHAR));check1 = LookupAccountName(NULL, lpAccountName, pUserID, &dUserID, pDomainName, &dDomainName, &snuType);//第二步,取得文件的安全描述符(SD)PSECURITY_DESCRIPTOR pFileSD = NULL;DWORD dFileSD = 0;SECURITY_INFORMATION secInfo = DACL_SECURITY_INFORMATION;check1 = GetFileSecurity(lpFileName, secInfo, pFileSD, 0, &dFileSD);pFileSD = (PSECURITY_DESCRIPTOR)myHeapAlloc(dFileSD);check1 = GetFileSecurity(lpFileName, secInfo, pFileSD, dFileSD, &dFileSD);//第三步,初始一个新的SDSECURITY_DESCRIPTOR newSD;InitializeSecurityDescriptor(&newSD, SECURITY_DESCRIPTOR_REVISION);//第四步,从SD中取出DACLBOOL bPresent;BOOL bDaclDefault;PACL pACL = NULL;GetSecurityDescriptorDacl(pFileSD, &bPresent, &pACL, &bDaclDefault);//第五步,取DACL的内存大小ACL_SIZE_INFORMATION aclInfo;aclInfo.AceCount = 0;aclInfo.AclBytesFree = 0;aclInfo.AclBytesInUse = sizeof(ACL);// 如果DACL不为空,则取其信息if (bPresent) {GetAclInformation(pACL, &aclInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation);}//第六步,计算新的ACL的sizeDWORD dNewAcl = aclInfo.AclBytesInUse + sizeof(ACL_SIZE_INFORMATION) + GetLengthSid(pUserID) - 2;//第七步,为新ACL分配内存PACL pNewAcl = (PACL)myHeapAlloc(dNewAcl);//第八步,初始化新的aclInitializeAcl(pNewAcl, dNewAcl, ACL_REVISION2);//第九步,如果文件(目录)的DACL有数据则拷贝数据到新的DACLUINT newAclIndex = 0;UINT curAclIndex = 0;LPVOID pTempAce = NULL;if (bPresent&&aclInfo.AceCount){for (curAclIndex = 0; curAclIndex != aclInfo.AceCount; curAclIndex++){GetAce(pACL, curAclIndex, &pTempAce);if (((ACCESS_ALLOWED_ACE*)pTempAce)->Header.AceFlags == INHERITED_ACE)break;if (EqualSid(pUserID, &(((ACCESS_ALLOWED_ACE*)pTempAce)->SidStart))){printf("suc");continue;}AddAce(pNewAcl, ACL_REVISION, MAXDWORD, pTempAce, ((PACE_HEADER)pTempAce)->AceSize);newAclIndex++;}}SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl = NULL;AddAccessAllowedAceExFnPtr _AddAccessAllowedAceEx = NULL;//动态装载函数_AddAccessAllowedAceEx = (AddAccessAllowedAceExFnPtr)GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")),"AddAccessAllowedAceEx");_AddAccessAllowedAceEx(pNewAcl, ACL_REVISION2,CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE,dw, pUserID);//拷贝继承的ACEif (bPresent&&aclInfo.AceCount){for (; curAclIndex != aclInfo.AceCount; curAclIndex++){GetAce(pACL, curAclIndex, &pTempAce);AddAce(pNewAcl, ACL_REVISION, MAXDWORD, pTempAce, ((PACE_HEADER)pTempAce)->AceSize);}}//把新的acl设置到新的sd中check1 = SetSecurityDescriptorDacl(&newSD, TRUE, pNewAcl, FALSE);check1 = SetFileSecurity(lpFileName, secInfo, &newSD);DWORD err = GetLastError();return TRUE;
}

MFC 修改文件或者文件夹的属性。相关推荐

  1. python打开文件夹的权限_python修改linux中文件(文件夹)的权限属性操作

    今天生成的对流云团路径图片放在linux下,文件的权限都是rw,没有x,后续的别人的程序调用不了,这里附上对三个属性的简单解释,有不够的欢迎大家补充 Linux的权限不是很细致,只有RWX三种 r(R ...

  2. 【linux】linux命令如何查看文件、文件夹的属性,包括大小、修改时间、谁修改的...

    [linux命令如何查看文件.文件夹的属性,包括大小.修改时间.谁修改的] 1.查看文件大小: #du -sh filename 2.查看文件,文件夹属性: #ls -l filename #ls - ...

  3. attrib批量显示文件夹_DOS下批量修改文件及文件夹属性(attrib命令详解)

    attrib指令用于修改文件的属性,文件的常见属性有:只读.存档.隐藏和系统 只读属性是指文件只可以做读的操作,不能对文件进行写的操作,就是文件的写保护. 存档属性是用来标记文件改动的,即在上一次备份 ...

  4. Linux chmod命令修改文件与文件夹权限命令代码

    在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...

  5. Linux修改文件及文件夹权限

    原文地址: 数字表示其它用户组的文件权限. linux文件权限分为三种: 读(r=4),写(w=2),执行(x=1) . 综合起来还有可读可执行(rx=5=4+1).可读可写(rw=6=4+2).可读 ...

  6. Linux chmod命令修改文件与文件夹权限的命令附实例

    在linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下 语法:chmod [who] [+ | - | =] [mode] 文件名 ...

  7. ubuntu如何修改php文件夹权限,Linux命令chmod:修改文件或文件夹权限

    在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...

  8. Ubuntu下如何修改文件或者文件夹的权限

    Ubuntu下如何修改文件或者文件夹的权限------chmod的亲身测试 具体原理如下: Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下.               一 介绍 ...

  9. linux文件夹改不了权限吗,linux修改文件和文件夹权限及所有者

    类别:CentOS / 日期:2019-10-10 / 浏览:377 / 评论:0 修改权限命令: chmod [-R] xyz文件/目录(xyz是数值或字符) 修改文件/目录所有者命令: chown ...

最新文章

  1. 鱼佬:从数据竞赛到工作!
  2. Linux常用实用命令
  3. 第19天学习Java的笔记-String字符串
  4. 你画的流程图,全组人都能看得懂吗?
  5. python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
  6. linux 内核定时器精度_高精度时钟工作机制简介
  7. iOS内存管理机制解析
  8. 微软为开源计算器加入全新的图形功能
  9. ibatis java_iBatis.java
  10. 机器视觉光源之LED光源
  11. a点到b点最短路线有多少条_8下数学培优:几何体上最短路径问题,总结与提升,不一样的感受...
  12. mysql主库从库在同一台服务器_通过两种方式增加从库——不停止mysql服务
  13. 20一个自定义集合的自述
  14. 解决vue项目首页加载过慢的情况
  15. 【日常】解决问题:SSR1080端口被占用的问题
  16. Windows下Perl环境安装和使用
  17. 新蓝天羽网体育用品商店
  18. 利用几何布朗运动模型预测股票价格_20200514_
  19. 用英语说计算机的优点1000,我的英语老师作文1000字
  20. 搭建moon服务器,实现zerotier飞速穿透

热门文章

  1. 社区运营的10大原则
  2. 数据库原理笔记(一)
  3. JAVA poi合并任意列 相同数据单元格
  4. Anaconda 更新失败的解决办法
  5. 密立根油滴实验数据处理(平衡法和动态法)
  6. 选择头像php,随机头像PHP版
  7. 你的Qt按钮可以加载Gif圆形的头像吗?
  8. python代码~六角星小练习
  9. WebDriver框架之自动运行失败的case
  10. 可视化 | Python绘制精美仪表盘