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

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)调用 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(也得一个个性赋值初始化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

 

相关文章