一丶简介

1.DACL是什么.

DACL称为自主访问的控制列表.是应用程序开发必要且重要的部分.由于空DACL 允许对所有用户进行类型的访问.所以一般程序开发中都是传入NULL

比如创建文件

原型:

HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, 安全属性
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);

一般安全属性都是传入NULL. 所以创建的文件所有人可以访问.

以文件举例.DACL是什么.

在刚开始自己研究MSDN的时候也是搞不懂 什么事DACL SDDL安全属性描述符.

ACE是什么.

这里简单说下.

DACL就是以自己的理解就是权限的集合. DACL有很多权限组成.这些权限成为ACE.

如下:



打开一个程序 右键->属性->安全则可以看到. DACL其实就是上图所说的那个组.自我理解.

那么ACE是什么.上面说了. ACE是 ACL链表里面的一个子选项. 上面的DACL也是ACL.

如上图.自我理解上面这些就是ACE选项.

2.如何创建一个自己控制的文件.

以MSDN举例子

1.首先创建一个 安全属性结构体.(比如创建文件.文件中一般传入NULL.现在不传NULL)

2.使用SDDL字符串对其进行初始化

3.使用 使用 ConvertStringSecurityDescriptorToSecurityDescriptor 函数将SDDL字符串转为安全描述符.(就是那个结构体) 那个结构体的->LpsecurityDscriptor成员.

而且使用这个函数.则将返回值发送到main函数.main函数使用

更新过后的SECURITY_ATTRIBUTES 结构来创建文件.

也就是说你使用函数.更改了安全属性.然后使用这个安全属性来创建文件.

4.使用过之后要使用 localFree函数释放 lpSecurityDescriptor 申请的内存.

PS: 要使用 Conver... 这种SDDL的函数.必须将 _WIN32_WINNT 常量定义为0x0500 或者更高.

问题:

根据上面MSDN所说.要使用SDDL字符串. 那么SDDL是个什么鬼.

下面说.

3.SDDL是个什么鬼.

SDDL上面说书 是 安全描述符字符串格式 也就是说这个字符串是存储安全描述符(那个结构体)所需要记录的文本格式.

还告诉我们两个函数

ConvertSecurityDescriptorToStringSecurityDescriptor
ConvertStringSecurityDescriptorToSecurityDescriptor

根据词义就是说.一个是安全属性转化为文本格式(SDDL)

两一个就是文本个数(SDDl)转化为安全属性描述.

这里简单说一下吧. SDDL 是一个 NULL-Terminated结尾的字符串.

主要分为四组:

1.O: owner_sid 代表对象的SID字符串

2.G: Group_sid 一个SID字符串.标识对象的主要组

3.dacl_flags(ACE......)DACL信息.由ACE组成

4.sacl_flags(ACE...) SACLxin

刚开始看这个SDDL字符串.把我搞晕了.后来就明白了

首先就是说SDDL 文本格式分为四组

对象的SID字符串:组sid的字符串:DACL信息(ACE....):Sacl信息(ACE...)

格式就如下:

以MSDN给的解析一下.MSDN的解析把握搞晕了.自己后来弄好了


"O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)"

O: 代表 owner_sid

AOG: 代表对象组的SID字符串

DAD:(XXX): 代表的是DACL信息.

Sacl没有.

O: 代表对象的SID.可以看一下这一篇连接

https://docs.microsoft.com/zh-tw/windows/win32/secauthz/sid-strings

DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)

这个字符串是什么意思

首先DAD 根据MSDN所说.让我们参考 SetSecurityDescripTorControl函数. 说是他的控制位.找了一圈没找到有用的信息.

暂且不管.其实主要的就是后面后括号里面的内容.

这些内容代表的是权限.是你访问的权限. 是ACE信息.

关于这个看一下 ACE Strings即可. 里面有说这个ACE是来组成SDDL的权限的.

而且还说了ACE Strings代表的字段是什么.

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 CreateMyDACL\n");
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 LocalFree\n");
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 String.可以得出格式.如上所说.

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字符串格式可以得出我的文件安全权限为:

1.是一个拒绝访问的用户

2.是一个允许 对象继承还有容器继承的.

3.是有可读可写的属性的.

4.使用的BA 说明是内置管理员

看下文件安全属性.

此时我们的文件可读可写 但是管理员能不能访问.

是不是变相的就给文件加了保护了. 不能管理员访问.但是可以其他用户来操作.或者允许管理员访问.但是只能只读.不能写. 那么你这个文件是不是就不能删除了.

如下.代码修改了一下. 改为 可读 可访问.

这里只给出 SDDL描述符语言.

TCHAR * szSD =(TCHAR*) TEXT("D:(A;OICI;GR;;;BA)");

此时文件只能可读了.

如果想要添加新的用户.可以继续参考MSDN的创建DACL一章.

理解了原理. SDDL字符串不就是自己手动改改的事情.

DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全属性的对象.)的更多相关文章

  1. UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...

  2. python判断文件的访问权限

    os.access(file, mode)判断文件的访问权限file为文件mode为操作模式,有这么几种:os.F_OK: 检查文件是否存在;os.R_OK: 检查文件是否可读;os.W_OK: 检查 ...

  3. Apache通过配置.htaccess文件禁止访问.git、.svn等目录

    如果你用过Git.SVN等代码版本控制工具的话,那肯定会知道,如果你需要拉去最新的代码到本地时,会自动生成一个.git或者.svn文件夹,里面包含一些项目相关的信息,如果在部署项目是,把这些文件公开暴 ...

  4. [C]控制外部变量访问权限的extern和static关键字

    一.extern 概述 编译器是由上至下编译源文件的,当遇到一些函数引用外部全局变量,而这个变量被定义在该函数声明主体的下方,又或者引用自其它的编译单元,这个情况就需要extern来向编译器表明此变量 ...

  5. java -- SSM配置完成后,能访问jsp文件不能访问html文件,报错解析

    SSM配置完成后,能访问jsp文件不能访问html文件,报错解析 在确保路径没有任何问题的,情况下,相同的页面,jsp能够正常访问,html却不能正常访问(404). 解决方法: 在web.xml中添 ...

  6. chmod - 改变文件的访问权限

    总揽 chmod [options] mode file... POSIX 选项: [-R] GNU 选项 (最短方式): [-cfvR] [--reference=rfile] [--help] [ ...

  7. 关于heritrix安装配置时出现”必须限制口令文件读取访问权限”的解决方法

    转载:http://www.floatinglife.cn/关于heritrix安装配置时出现必须限制口令文件读取访问 最近开始写一个RSS聚合程序,需要爬虫支持,于是就整来heritrix,没想到, ...

  8. Windows Server 2012下手动配置IIS的文件夹访问权限

    当新建一个website的时候,一般情况下IIS对相应的物理文件夹的访问权限是不够的. 针对匿名认证(anonymous authentication)需要: 打开文件夹properties-> ...

  9. Linux中文件夹访问权限不足

    经常操作Linux服务器,远程访问会遇到403问题,本篇讲述nginx下文件权限的修改. 1.命令修改该文件夹的权限 chmod -R 755 /usr/local/....   文件夹的路径 2.修 ...

随机推荐

  1. Angular复习笔记5-指令

    Angular复习笔记5-指令 在Angular中,指令是一个重要的概念,它作用在特定的DOM元素上,可以扩展这个元素的功能,为元素增加新的行为.本质上,组件可以被理解为一种带有视图的指令.组件继承自 ...

  2. 线程并发工具类之CountDownLatch的使用及原理分析

    原文链接:http://www.studyshare.cn/blog/details/1149/1 java开发工具下载地址及安装教程大全,点这里.更多技术文章,在这里. 一.定义 CountDown ...

  3. 如何理解Android中的xmlns

    转发自:https://www.jianshu.com/p/6fcaffaeffd2 作为一名 Android 开发,我想大家对xmlns并不会陌生,因为在写布局文件(如下代码所示)的时候经常会碰到, ...

  4. python day 20: 线程池与协程,多进程TCP服务器

    目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...

  5. Node.js 项目中解决 SQL 注入和 XSS 攻击

    1.SQL 注入 SQL 注入,一般是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令. SQL 注入示例 在登录界面,后端会根 ...

  6. EF 批量增删改 EntityFramework.Extensions

    EntityFramework.Extensions 1.官方网站  http://entityframework-extensions.net/ 2 破解版  Z.EntityFramework.E ...

  7. nginx的stream模块和upstream模块

    nginx7层调度方式 使用upstream模块定义集群名称和节点地址 定义在server字段之外httpd字段之内 upstream staticweb { server 172.17.0.2; # ...

  8. django项目中使用bootstrap插件的分页功能。

    官网下载bootstrap插件放到项目中的static文件中 路由 path('blog-fullwidth/', login.fullwidth,name='fullwidth'), 前端页面引入 ...

  9. Codeforces I. Vessels(跳转标记)

    题目描述: Vessels time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  10. es题目

    1.elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 .2.elasticsearch的倒排索引是什么?3.elasticsearch 索引数 ...