DACL稱爲自主訪問的控制列表.是應用程序開發必要且重要的部分.因爲空DACL 容許對全部用戶進行類型的訪問.因此通常程序開發中都是傳入NULLwindows
好比建立文件
原型:api
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.ui
以下:
打開一個程序 右鍵->屬性->安全則能夠看到. DACL其實就是上圖所說的那個組.自我理解.3d
那麼ACE是什麼.上面說了. ACE是 ACL鏈表裏面的一個子選項. 上面的DACL也是ACL.code
如上圖.自我理解上面這些就是ACE選項.對象
以MSDN舉例子blog
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是個什麼鬼.
下面說.
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能夠轉化爲安全屬性 使用這個安全屬性來建立文件就能夠生成你本身控制訪問的文件了.
#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字符串不就是本身手動改改的事情.