windows访问控制列表 –ACL(Access Control List)

2、分类

  ACL分为两类

    1,Discretionary Access Control List (DACL)  自由访问控制列表

    2,System Access Control List (SACL) 系统访问控制列表

DACL是 安全指标(securable
object) 的五特性质(小编的理解),用来代表 安全指标 的拜会权限的列表。

  当三个进程试图访问3个有惊无险目的时,系统会检讨该对向的DACL中的ACE。

  假若该指标没有DACL,允许任何访问。

  要是有DACL,不过当中没有ACE,拒绝全体访问。

  DACL控制访问控制的事无巨细原理 https://msdn.microsoft.com/en-us/library/aa446683(v=vs.85).aspx

SACL是系统中的3个列表,用来记录钦点用户(组)、内定项目标走访的走访结果,并记录。

1、定义  

  ACL是三个windows中的表示用户(组)权限的列表。

  Access Control List(ACL)

Access Control Entry(ACE)

 

 

3、操作

  为了保证ACL语法正确,ACL的改动必须透过点名的函数,不可能直接改动。

  1,描述ACE的结构体

typedef struct _EXPLICIT_ACCESS {
  DWORD       grfAccessPermissions;
  ACCESS_MODE grfAccessMode;
  DWORD       grfInheritance;
  TRUSTEE     Trustee;
} EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;

  2,查看某用户访问权限

    (1)调用 GetSecurityInfoGetNamedSecurityInfo
获得指标的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(也能够3个天性子赋值起头化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数组)并入3个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

 

相关文章