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