1、定義
ACL是一個windows中的表示用戶(組)權限的列表。
Access Control List(ACL)
Access Control Entry(ACE) |
... |
2、分類
ACL分為兩類
1,Discretionary Access Control List (DACL) 自由訪問控制列表
2,System Access Control List (SACL) 系統訪問控制列表
DACL是 安全對象(securable object) 的一個屬性(我的理解),用來表示 安全對象 的訪問權限的列表。
當一個進程試圖訪問一個安全對象時,系統會檢查該對向的DACL中的ACE。
如果該對象沒有DACL,允許任何訪問。
如果有DACL,但是其中沒有ACE,拒絕所有訪問。
DACL控制訪問控制的詳細原理 https://msdn.microsoft.com/en-us/library/aa446683(v=vs.85).aspx
SACL是系統中的一個列表,用來記錄指定用戶(組)、指定類型的訪問的訪問結果,並記錄。
3、操作
為了保證ACL語法正確,ACL的修改必須通過指定的函數,不能直接修改。
1,描述ACE的結構體
typedef struct _EXPLICIT_ACCESS { DWORD grfAccessPermissions; ACCESS_MODE grfAccessMode; DWORD grfInheritance; TRUSTEE Trustee; } EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;
2,查看某用戶訪問權限
(1)調用 GetSecurityInfo 或 GetNamedSecurityInfo 得到對象的ACL(可選返回 DACL或 SACL)
DWORD WINAPI GetSecurityInfo( _In_ HANDLE handle, _In_ SE_OBJECT_TYPE ObjectType, _In_ SECURITY_INFORMATION SecurityInfo, _Out_opt_ PSID *ppsidOwner, _Out_opt_ PSID *ppsidGroup, _Out_opt_ PACL *ppDacl, _Out_opt_ PACL *ppSacl, _Out_opt_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor ); DWORD WINAPI GetNamedSecurityInfo( _In_ LPTSTR pObjectName, _In_ SE_OBJECT_TYPE ObjectType, _In_ SECURITY_INFORMATION SecurityInfo, _Out_opt_ PSID *ppsidOwner, _Out_opt_ PSID *ppsidGroup, _Out_opt_ PACL *ppDacl, _Out_opt_ PACL *ppSacl, _Out_opt_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor );
(2)調用 GetEffectiveRightsFromAcl ,將(1)中的ACL指針作為參數,得到某用戶的訪問權限
DWORD WINAPI GetEffectiveRightsFromAcl(
_In_ PACL pacl,
_In_ PTRUSTEE pTrustee,
_Out_ PACCESS_MASK pAccessRights
);
3,添加ACE到某個對象的ACL
(1)調用 GetSecurityInfo 或 GetNamedSecurityInfo 從對象的安全描述符中(security descriptor)得到ACL(可選返回 DACL或 SACL)
(2)調用 BuildExplicitAccessWithName 初始化一個ACE(也可以一個個屬性賦值初始化ACE),若有多個要加入ACL,則將_EXPLICIT_ACCESS構造數組
VOID WINAPI BuildExplicitAccessWithName(
_Inout_ PEXPLICIT_ACCESS pExplicitAccess, //傳入待初始化的_EXPLICIT_ACCESS,初始化后返回
_In_opt_ LPTSTR pTrusteeName,
_In_ DWORD AccessPermissions,
_In_ ACCESS_MODE AccessMode,
_In_ DWORD Inheritance
);
(3)調用 SetEntriesInAcl ,將自己要加入的ACE數組(_EXPLICIT_ACCESS數組)並入一個ACL
DWORD WINAPI SetEntriesInAcl( _In_ ULONG cCountOfExplicitEntries, //數組中元素個數 _In_opt_ PEXPLICIT_ACCESS pListOfExplicitEntries, //數組指針 _In_opt_ PACL OldAcl, //若為空,則構造一個新的ACL;若不為空,則將該ACE(數組)並入該ACL _Out_ PACL *NewAcl );
(4)調用 SetSecurityInfo 或 SetNamedSecurityInfo,將自定義的ACL並入該對象的安全描述符。
DWORD WINAPI SetNamedSecurityInfo(
_In_ LPTSTR pObjectName,
_In_ SE_OBJECT_TYPE ObjectType,
_In_ SECURITY_INFORMATION SecurityInfo,
_In_opt_ PSID psidOwner,
_In_opt_ PSID psidGroup,
_In_opt_ PACL pDacl,
_In_opt_ PACL pSacl
);
DWORD WINAPI SetSecurityInfo(
_In_ HANDLE handle,
_In_ SE_OBJECT_TYPE ObjectType,
_In_ SECURITY_INFORMATION SecurityInfo,
_In_opt_ PSID psidOwner,
_In_opt_ PSID psidGroup,
_In_opt_ PACL pDacl,
_In_opt_ PACL pSacl
);
參考
ACL創建修改 https://msdn.microsoft.com/en-us/library/aa446596(v=vs.85).aspx
ACL查看 https://msdn.microsoft.com/en-us/library/aa446659(v=vs.85).aspx
原文 https://msdn.microsoft.com/en-us/library/aa374872(VS.85).aspx