diff --git a/Security/AccessControl/AccCtrlHelper.cs b/Security/AccessControl/AccCtrlHelper.cs index f8b9b4ce..9a59c669 100644 --- a/Security/AccessControl/AccCtrlHelper.cs +++ b/Security/AccessControl/AccCtrlHelper.cs @@ -57,23 +57,24 @@ namespace Vanara.Security.AccessControl /// Helper methods for working with Access Control structures. public static class AccessControlHelper { - public static ACCESS_ALLOWED_ACE GetAce(PACL pAcl, int aceIndex) + public static ACCESS_ALLOWED_ACE GetAce(this PACL pAcl, int aceIndex) { if (AdvApi32.GetAce(pAcl, aceIndex, out var acePtr)) return (ACCESS_ALLOWED_ACE)Marshal.PtrToStructure((IntPtr)acePtr, typeof(ACCESS_ALLOWED_ACE)); throw new System.ComponentModel.Win32Exception(); } - public static uint GetAceCount(PACL pAcl) => GetAclInfo(pAcl).AceCount; - - public static ACL_SIZE_INFORMATION GetAclInfo(PACL pAcl) + public static IEnumerable GetAces(this PACL pAcl) { - var si = new ACL_SIZE_INFORMATION(); - if (!GetAclInformation(pAcl, ref si, (uint)Marshal.SizeOf(si), ACL_INFORMATION_CLASS.AclSizeInformation)) - throw new System.ComponentModel.Win32Exception(); - return si; + var cnt = GetAceCount(pAcl); + for (var i = 0; i < cnt; i++) + yield return GetAce(pAcl, i); } + public static uint GetAceCount(this PACL pAcl) => GetAclInfo(pAcl).AceCount; + + public static ACL_SIZE_INFORMATION GetAclInfo(PACL pAcl) => pAcl.GetAclInformation(); + public static uint GetAclSize(PACL pAcl) => GetAclInfo(pAcl).AclBytesInUse; public static uint GetEffectiveRights(this PSID pSid, PSECURITY_DESCRIPTOR pSD)