一丶简介

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. AspNetCore MVC页面数据提交验证

    2019/05/14,AspNetCore 2.2.0 摘要:AspNetCore MVC使用数据注释配合jquery.validate提交页面进行前端加后端的数据验证 主要用到了jquery.val ...

  2. Gulp 给所有静态文件引用加版本号

    在juqery和easyui 盛行的年代许多项目采用纯静态页面去构建前端框架从而实现前后端分离的目的.项目开发周期内往往会频繁修改更新某个文件,当你将文件更新到服务器后客户端由于缓存问题而出现显示异常 ...

  3. 服务注册发现(一) Consul 简介及 windows版本的安装与部署

    Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的 ...

  4. kafka汇总

    Kafka 1. kafka概念 kafka是一个高吞吐亮的.分布式.基于发布/订阅(也就是一对多)的消息系统,最初由Linkedln公司开发的,使用Scala语言编写的,目前是Apache的开源项目 ...

  5. 【初识算法】- AC算法

    原文地址:https://www.cnblogs.com/jily/p/6250716.html 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符 ...

  6. Function.prototype.apply.call 理解分析

    首先需要了解apply,call的基本用法,其目的是改变调用方法中的this指向,将其指向为传入的对象,改变this的指向,两种方法接收参数的方式不同. 代码:console.log var cons ...

  7. 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装

    以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...

  8. CI隐藏入口文件index.php

    1.需要apache打开rewrite_module,然后修改httpd.conf的AllowOverride none 为AllowOverride All(里面,不同的环境目录不同) 2.在CI的 ...

  9. 工厂交接班易出问题?MES系统实现精准对接

    工厂交接班制度非常的严格和复杂,而MES系统能让繁琐的交接班流程简单快捷无措.MES系统在发生事件时记录传递事件,还可以主动对事件进行分类和报告.人员可以查看和深入到以前或当前班次的个别事件. 随着工 ...

  10. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...