As promised, part two: How do you assure that your users follow the rules about which FE and/or BE they are using? For this, you need to read up on the File System Object (FSO) including the functions that you can use to examine file and drive properties.
https://msdn.microsoft.com/en-us/library/aa242706(v=vs.60).aspx - overview
https://msdn.microsoft.com/en-us/library/aa262402(v=vs.60).aspx - list of functions
https://msdn.microsoft.com/en-us/library/aa265290(v=vs.60).aspx - GetDrive
http://accessjitsu.com/2015/10/10/the-drive-object-of-the-filesystemobject-in-microsoft-access/ - article shows code determining whether the drive is local or remote based on .DriveType property of a drive.
Ideal structure for a shared database includes the idea that you never EVER in a gazillion years allow users to directly access the tables and queries to get into a true datasheet window. In such a circumstance you have 0.0% control over what they do. If you make them go through forms to do everything, you retain enough control to do some good.
In such a setup, people typically create a switchboard or dispatcher form from which a single button-click launches the form that does exactly what they want done. This dispatcher becomes your database's Opening Form (i.e. launched when you launch the database) and is both traffic copy and junkyard dog. To give this dog some bite, you could do this. And for short, let's call the form JYD.
In the dispatcher's Form_Load routine (and it HAS to be here for reasons to be mentioned in a moment), you can use some of the FSO routines. You have TWO files that you wish to analyze. The FE file and the BE file.
Ideally, you want to have the FE file locally hosted and the BE file remotely hosted. So you put some tests in the JYD's _Open routine. This Open routine should have two exit points - one that pops up a message that says "Go away <bark><bark>" (you could choose to be more articulate.) Then it executes the VBA statement
Cancel = True and does an
Exit Sub. The other exit just does the
Exit Sub and is what you use when all of your qualifying tests got the "good to go" result.
Separately test the FE file, the file spec for which is available from
CurrentDB.Name, and you can use the FSO code to pick apart the resultant specification. There, you can decide what does or does not qualify. If you take Colin's approach, you can see the drive letter and folder of residence for the FE file. If you take a more relaxed stance, you only care about the drive properties showing "Local drive."
Then test the BE file, and you get that from looking at the table properties of any of the linked tables.
https://msdn.microsoft.com/en-us/library/cc722917.aspx
https://social.msdn.microsoft.com/F...07-linking-tables-through-vba?forum=accessdev - discusses the nature of the .Connect string in passing, though that isn't the focus of the article.
You might have to take apart the string by finding the "DATABASE=" string in the table's .Connect string and then doing a RIGHT() function of that string. At that point, you will have the BE file's specification and again can use the FSO functions to determine that your user is using the "right" copy. That again can be forgiving by checking the drive letter or it can be horrific by checking the entire path. Note that in this case, it can be just a simple string comparison if you want to hard-code the location down to the exact file type, because you normally have only one BE file anyway.
OK, so the FE and BE passed the tests and you do a simple exit from the _Open code. Why did the code have to be there? Because of all of the events associated with opening a form, only the Form_Open routine has the Cancel option. Cancel is set to False when you enter the _Open routine, but you can set it to True. If you do, the form DOES NOT OPEN. You can also (if you really want to be nasty) do an
Application.Quit and leave no doubt about what you want to happen. If you want to stop the user from opening the app, the JYD's Form_Open routine is THE FIRST CODE YOU RUN! Do the tests up front before you even show a form (which typically doesn't happen until you get into or past the Form_Load event.)
Look up "Securing an Access Database" on the web or use the Search function of this forum for "Securing a Database" to find articles on how to prevent users from bypassing the JYD with special keys and tricks.
It should also be noted that if you have user security of other types, like users with specific roles who therefore have different access requirements, the JYD form is the ideal place to evaluate (and store for later use) whatever rights the user has. In this case, use this forum's Search to find articles on user level security and discussions on user roles.