private static bool CheckPermissionsInWindows(INopFileProvider fileProvider, string path, bool checkRead, bool checkWrite, bool checkModify, bool checkDelete) { var permissionsAreGranted = true; try { if (!(fileProvider.FileExists(path) || fileProvider.DirectoryExists(path))) { return(true); } var current = WindowsIdentity.GetCurrent(); var readIsDeny = false; var writeIsDeny = false; var modifyIsDeny = false; var deleteIsDeny = false; var readIsAllow = false; var writeIsAllow = false; var modifyIsAllow = false; var deleteIsAllow = false; var rules = fileProvider.GetAccessControl(path).GetAccessRules(true, true, typeof(SecurityIdentifier)) .Cast <FileSystemAccessRule>() .ToList(); foreach (var rule in rules.Where(rule => current.User?.Equals(rule.IdentityReference) ?? false)) { CheckAccessRule(rule, ref deleteIsDeny, ref modifyIsDeny, ref readIsDeny, ref writeIsDeny, ref deleteIsAllow, ref modifyIsAllow, ref readIsAllow, ref writeIsAllow); } if (current.Groups != null) { foreach (var reference in current.Groups) { foreach (var rule in rules.Where(rule => reference.Equals(rule.IdentityReference))) { CheckAccessRule(rule, ref deleteIsDeny, ref modifyIsDeny, ref readIsDeny, ref writeIsDeny, ref deleteIsAllow, ref modifyIsAllow, ref readIsAllow, ref writeIsAllow); } } } deleteIsAllow = !deleteIsDeny && deleteIsAllow; modifyIsAllow = !modifyIsDeny && modifyIsAllow; readIsAllow = !readIsDeny && readIsAllow; writeIsAllow = !writeIsDeny && writeIsAllow; if (checkRead) { permissionsAreGranted = readIsAllow; } if (checkWrite) { permissionsAreGranted = permissionsAreGranted && writeIsAllow; } if (checkModify) { permissionsAreGranted = permissionsAreGranted && modifyIsAllow; } if (checkDelete) { permissionsAreGranted = permissionsAreGranted && deleteIsAllow; } } catch (IOException) { return(false); } catch { return(true); } return(permissionsAreGranted); }