using Alphaleonis.Win32.Filesystem; using System; using System.Security.AccessControl; using System.Security.Principal; namespace Security2 { public class EffectiveAccess { public static EffectiveAccessInfo GetEffectiveAccess(FileSystemInfo item, IdentityReference2 id, string serverName) { bool remoteServerAvailable = false; Exception authzAccessCheckException = null; var win32 = new Win32(); var fss = new FileSystemSecurity2(item); var effectiveAccessMask = win32.GetEffectiveAccess(fss.SecurityDescriptor, id, serverName, out remoteServerAvailable, out authzAccessCheckException); var ace = new FileSystemAccessRule((SecurityIdentifier)id, (FileSystemRights)effectiveAccessMask, AccessControlType.Allow); return new EffectiveAccessInfo( new FileSystemAccessRule2(ace, item), remoteServerAvailable, authzAccessCheckException); } } public class EffectiveAccessInfo { private FileSystemAccessRule2 ace; private bool fromRemote; private Exception authzException; public FileSystemAccessRule2 Ace { get { return ace; } } public bool FromRemote { get { return fromRemote; } } public Exception AuthzException { get { return authzException; } } public bool OperationFailed { get { return authzException == null ? false : true; } } public EffectiveAccessInfo(FileSystemAccessRule2 ace, bool fromRemote, Exception authzException = null) { this.ace = ace; this.fromRemote = fromRemote; this.authzException = authzException; } } }