• 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)调用 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

  • 相关阅读:
    JavaScript在web自动化测试中的作用
    Python使用Pandas高效处理测试数据
    git update-index --assume-unchanged忽略跟踪
    git reset三种模式
    Python Unittest根据不同测试环境跳过用例详解
    python ddt 实现数据驱动
    测试用例重要性暨动端测试用例设计总结
    jenkins执行selenium自动化测试浏览器不显示解决方法
    《过目不忘的读书法》 读书笔记
    memcached 学习
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/8479832.html
Copyright © 2020-2023  润新知