1package api 2 3import ( 4 "golang.org/x/sys/windows" 5 6 "unsafe" 7) 8 9// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379284.aspx 10const ( 11 NO_MULTIPLE_TRUSTEE = iota 12 TRUSTEE_IS_IMPERSONATE 13) 14 15// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379638.aspx 16const ( 17 TRUSTEE_IS_SID = iota 18 TRUSTEE_IS_NAME 19 TRUSTEE_BAD_FORM 20 TRUSTEE_IS_OBJECTS_AND_SID 21 TRUSTEE_IS_OBJECTS_AND_NAME 22) 23 24// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379639.aspx 25const ( 26 TRUSTEE_IS_UNKNOWN = iota 27 TRUSTEE_IS_USER 28 TRUSTEE_IS_GROUP 29 TRUSTEE_IS_DOMAIN 30 TRUSTEE_IS_ALIAS 31 TRUSTEE_IS_WELL_KNOWN_GROUP 32 TRUSTEE_IS_DELETED 33 TRUSTEE_IS_INVALID 34 TRUSTEE_IS_COMPUTER 35) 36 37// https://msdn.microsoft.com/en-us/library/windows/desktop/aa374899.aspx 38const ( 39 NOT_USED_ACCESS = iota 40 GRANT_ACCESS 41 SET_ACCESS 42 DENY_ACCESS 43 REVOKE_ACCESS 44 SET_AUDIT_SUCCESS 45 SET_AUDIT_FAILURE 46) 47 48// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx 49const ( 50 NO_INHERITANCE = 0x0 51 SUB_OBJECTS_ONLY_INHERIT = 0x1 52 SUB_CONTAINERS_ONLY_INHERIT = 0x2 53 SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3 54 INHERIT_NO_PROPAGATE = 0x4 55 INHERIT_ONLY = 0x8 56 57 OBJECT_INHERIT_ACE = 0x1 58 CONTAINER_INHERIT_ACE = 0x2 59 NO_PROPAGATE_INHERIT_ACE = 0x4 60 INHERIT_ONLY_ACE = 0x8 61) 62 63var ( 64 procSetEntriesInAclW = advapi32.MustFindProc("SetEntriesInAclW") 65) 66 67// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379636.aspx 68type Trustee struct { 69 MultipleTrustee *Trustee 70 MultipleTrusteeOperation int32 71 TrusteeForm int32 72 TrusteeType int32 73 Name *uint16 74} 75 76// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx 77type ExplicitAccess struct { 78 AccessPermissions uint32 79 AccessMode int32 80 Inheritance uint32 81 Trustee Trustee 82} 83 84// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379576.aspx 85func SetEntriesInAcl(entries []ExplicitAccess, oldAcl windows.Handle, newAcl *windows.Handle) error { 86 ret, _, err := procSetEntriesInAclW.Call( 87 uintptr(len(entries)), 88 uintptr(unsafe.Pointer(&entries[0])), 89 uintptr(oldAcl), 90 uintptr(unsafe.Pointer(newAcl)), 91 ) 92 if ret != 0 { 93 return err 94 } 95 return nil 96} 97