MFC 修改文件或者文件夹的属性。
本文的程序需在管理员的权限下运行
原文参考: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 修改文件或者文件夹的属性。相关推荐
- python打开文件夹的权限_python修改linux中文件(文件夹)的权限属性操作
今天生成的对流云团路径图片放在linux下,文件的权限都是rw,没有x,后续的别人的程序调用不了,这里附上对三个属性的简单解释,有不够的欢迎大家补充 Linux的权限不是很细致,只有RWX三种 r(R ...
- 【linux】linux命令如何查看文件、文件夹的属性,包括大小、修改时间、谁修改的...
[linux命令如何查看文件.文件夹的属性,包括大小.修改时间.谁修改的] 1.查看文件大小: #du -sh filename 2.查看文件,文件夹属性: #ls -l filename #ls - ...
- attrib批量显示文件夹_DOS下批量修改文件及文件夹属性(attrib命令详解)
attrib指令用于修改文件的属性,文件的常见属性有:只读.存档.隐藏和系统 只读属性是指文件只可以做读的操作,不能对文件进行写的操作,就是文件的写保护. 存档属性是用来标记文件改动的,即在上一次备份 ...
- Linux chmod命令修改文件与文件夹权限命令代码
在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...
- Linux修改文件及文件夹权限
原文地址: 数字表示其它用户组的文件权限. linux文件权限分为三种: 读(r=4),写(w=2),执行(x=1) . 综合起来还有可读可执行(rx=5=4+1).可读可写(rw=6=4+2).可读 ...
- Linux chmod命令修改文件与文件夹权限的命令附实例
在linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下 语法:chmod [who] [+ | - | =] [mode] 文件名 ...
- ubuntu如何修改php文件夹权限,Linux命令chmod:修改文件或文件夹权限
在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...
- Ubuntu下如何修改文件或者文件夹的权限
Ubuntu下如何修改文件或者文件夹的权限------chmod的亲身测试 具体原理如下: Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下. 一 介绍 ...
- linux文件夹改不了权限吗,linux修改文件和文件夹权限及所有者
类别:CentOS / 日期:2019-10-10 / 浏览:377 / 评论:0 修改权限命令: chmod [-R] xyz文件/目录(xyz是数值或字符) 修改文件/目录所有者命令: chown ...
最新文章
- 鱼佬:从数据竞赛到工作!
- Linux常用实用命令
- 第19天学习Java的笔记-String字符串
- 你画的流程图,全组人都能看得懂吗?
- python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
- linux 内核定时器精度_高精度时钟工作机制简介
- iOS内存管理机制解析
- 微软为开源计算器加入全新的图形功能
- ibatis java_iBatis.java
- 机器视觉光源之LED光源
- a点到b点最短路线有多少条_8下数学培优:几何体上最短路径问题,总结与提升,不一样的感受...
- mysql主库从库在同一台服务器_通过两种方式增加从库——不停止mysql服务
- 20一个自定义集合的自述
- 解决vue项目首页加载过慢的情况
- 【日常】解决问题:SSR1080端口被占用的问题
- Windows下Perl环境安装和使用
- 新蓝天羽网体育用品商店
- 利用几何布朗运动模型预测股票价格_20200514_
- 用英语说计算机的优点1000,我的英语老师作文1000字
- 搭建moon服务器,实现zerotier飞速穿透