• 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

  • 相关阅读:
    Linux安装oracle 10g常见问题之——ORA-01078,LRM-00109,ORA-01102
    Linux安装oracle 10g常见问题之——OUI-25031
    C#中static静态变量的用法
    让DIV中的内容水平和垂直居中
    json对象与json字符串互换
    AJAX请求 $.post方法的使用
    .NET(c#)new关键字的三种用法
    创建数据库和表的SQL语句
    SQL、LINQ、Lambda 三种用法(转)
    AJAX中UPDATEPANEL配合TIMER控件实现局部无刷新
  • 原文地址:https://www.cnblogs.com/the-owl/p/5649801.html
Copyright © 2020-2023  润新知