using System; using System.Data.OleDb; using Serilog; namespace SyncEngine.Access { /// /// Grants Jet/ACE SELECT on system tables (same DDL as Access VBA CurrentProject.Connection.Execute). /// internal static class AccessSystemTablePermissions { private static readonly string[] SystemTables = { "MSysObjects", "MSysRelationships" }; /// OleDb GRANT only works with user-level security (workgroup .mdw). Prefer Access.Application. public static bool TryGrantSelect(OleDbConnection conn, string userName, ILogger logger) { var user = string.IsNullOrWhiteSpace(userName) ? "Admin" : userName.Trim(); var grantedAny = false; foreach (var table in SystemTables) { try { // GRANT SELECT ON MSysObjects TO Admin; var ddl = string.Format("GRANT SELECT ON {0} TO {1};", table, user); using (var cmd = new OleDbCommand(ddl, conn)) { cmd.ExecuteNonQuery(); } logger.Information("Granted SELECT on {Table} to {User}", table, user); grantedAny = true; } catch (Exception ex) { logger.Debug( "GRANT SELECT on {Table} via OleDb skipped (requires workgroup .mdw): {Message}", table, ex.Message); } } return grantedAny; } } }