DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全
目录
一丶简介1.DACL是什么.DACL称为自主访问的控制列表.是应用程序开发必要且重要的部分.由于空DACL 允许对所有用户进行类型的访问.所以一般程序开发中都是传入NULL 比如创建文件 HANDLE CreateFileA( LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,安全属性 DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile ); 一般安全属性都是传入NULL. 所以创建的文件所有人可以访问. 这里简单说下. DACL就是以自己的理解就是权限的集合. DACL有很多权限组成.这些权限成为ACE. 如下: 打开一个程序 右键->属性->安全则可以看到. DACL其实就是上图所说的那个组.自我理解. 那么ACE是什么.上面说了. ACE是 ACL链表里面的一个子选项. 上面的DACL也是ACL. 如上图.自我理解上面这些就是ACE选项. 2.如何创建一个自己控制的文件.以MSDN举例子 1.首先创建一个 安全属性结构体.(比如创建文件.文件中一般传入NULL.现在不传NULL) 3.使用 使用 ConvertStringSecurityDescriptorToSecurityDescriptor 函数将SDDL字符串转为安全描述符.(就是那个结构体) 那个结构体的->LpsecurityDscriptor成员. PS: 要使用 Conver... 这种SDDL的函数.必须将 _WIN32_WINNT 常量定义为0x0500 或者更高. 问题: 3.SDDL是个什么鬼.SDDL上面说书 是 安全描述符字符串格式 也就是说这个字符串是存储安全描述符(那个结构体)所需要记录的文本格式. 还告诉我们两个函数 ConvertSecurityDescriptorToStringSecurityDescriptor ConvertStringSecurityDescriptorToSecurityDescriptor 根据词义就是说.一个是安全属性转化为文本格式(SDDL) 这里简单说一下吧. SDDL 是一个 NULL-Terminated结尾的字符串. 1.O: owner_sid 代表对象的SID字符串 刚开始看这个SDDL字符串.把我搞晕了.后来就明白了 首先就是说SDDL 文本格式分为四组 对象的SID字符串:组sid的字符串:DACL信息(ACE....):Sacl信息(ACE...) 格式就如下: 以MSDN给的解析一下.MSDN的解析把握搞晕了.自己后来弄好了 "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" O: 代表 owner_sid O: 代表对象的SID.可以看一下这一篇连接 DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0) 这个字符串是什么意思 关于这个看一下 ACE Strings即可. 里面有说这个ACE是来组成SDDL的权限的. ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute) MSDNhttps://docs.microsoft.com/zh-tw/windows/win32/secauthz/ace-strings 截取一部分ACE String 暂时了解这些.看下如何编程 二丶 编写SDDL 控制的文件SDDL可以转化为安全属性 使用这个安全属性来创建文件就可以生成你自己控制访问的文件了. #include <windows.h> #include <AclAPI.h> #define _WIN32_WINNT 0x0500 #pragma comment(lib,"Advapi32.lib") BOOL CreateMyDACL(SECURITY_ATTRIBUTES *); void main() { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = FALSE; // Call function to set the DACL. The DACL // is set in the SECURITY_ATTRIBUTES // lpSecurityDescriptor member. if (!CreateMyDACL(&sa)) { // Error encountered; generate message and exit. printf("Failed CreateMyDACLn"); exit(1); } // Use the updated SECURITY_ATTRIBUTES to specify // security attributes for securable objects. // This example uses security attributes during // creation of a new directory. HANDLE hFile = CreateFile(TEXT("D:1234.txt"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,&sa,CREATE_NEW,NULL,NULL); // Free the memory allocated for the SECURITY_DESCRIPTOR. if (NULL != LocalFree(sa.lpSecurityDescriptor)) { // Error encountered; generate message and exit. printf("Failed LocalFreen"); exit(1); } } BOOL CreateMyDACL(SECURITY_ATTRIBUTES * pSA) { TCHAR * szSD =(TCHAR*) TEXT("D:(D;OICI;GRGW;;;BA)"); if (NULL == pSA) return FALSE; return ConvertStringSecurityDescriptorToSecurityDescriptor( szSD,SDDL_REVISION_1,&(pSA->lpSecurityDescriptor),NULL); } 这里主要是看 CreateMyDacl这个函数内部的SDDL安全属性描述符字符串. 这里解析下: ace_type; ace_flags; rights; object_guid; inherit_object_guid; account_sid;(resource_attribute) 解析ACE字符串: (D;OICI;GRGW;;;BG) D 代表拒绝还是允许. 也就是ACE的类型.这里可以控制你的用户的是允许还是拒绝 OICI: 代表 对象继承 还是容器继承 一般是子继承有关.子对象是否可以集成 GR: 代表只读权限. 也就是 rights GA是所有权限 GW可写 GX可执行 BG: 是一个SID字符串. 代表的是 内置客人用户,相应的 BU是内置用户 BA是内置管理员 可以根据上面所说.查询SID 字符串代表的意思 我这里的代码是创建了文件.DACL是我自己控制的. 根据ACE字符串格式可以得出我的文件安全权限为: 看下文件安全属性. 此时我们的文件可读可写 但是管理员能不能访问. 是不是变相的就给文件加了保护了. 不能管理员访问.但是可以其他用户来操作.或者允许管理员访问.但是只能只读.不能写. 那么你这个文件是不是就不能删除了. TCHAR * szSD =(TCHAR*) TEXT("D:(A;OICI;GR;;;BA)"); 此时文件只能可读了. 如果想要添加新的用户.可以继续参考MSDN的创建DACL一章. 理解了原理. SDDL字符串不就是自己手动改改的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 打印 – 如何使用fmt在Go中打印出常量uint64?
- 在Windows 7上安装没有管理员权限的Android Studio软件
- windows – 从命令行创建一个无声的mp3
- windows客户端走代理上网
- 使用Microsoft Git Provider时,使用winmerge替换visual stu
- xaml – 通用App ListView项目Horizo??ntalAlignment
- WPF窗口 – 只允许水平调整大小
- windows-server-2003 – 我如何测试某个特定端口是否在服务
- 解决:IIS的:DCOM?遇到错误“重叠?I/O?操作在进行中&n
- windows-8 – Windows 8 24×24徽标图像失败的wac工具测试
- 图解 -- Win10 OpenSSH
- .net – System.Windows.Forms.WebBrowser:强制
- windows-7 – 我需要做什么以及为Windows Vista
- windows-server-2008-r2 – 如果运行时间超过15分
- windows-server-2008-r2 – 撤消R2上的替换任务管
- Wix:在组件,目录,文件,注册表等上使用KeyPath
- 用于导入.dll的C#包装器,“尝试读取或写入受保护
- hyper-v-server-2012-r2 – Windows 10更新后无法
- Windows平台下kafka环境的搭建
- Windows下xampp搭配php环境以及mysql的设置和php