It is possible but takes some work
In order,...
(1) is possible, and most easily done if you have an opening form that, after getting the username, writes an entry in a table with the date/time, the username, and either nothing else or maybe the words "LOGGED IN" - and if you really wanted to get pushy, log the user's computername. Then this opening form (which could be your switchboard) will stay open for the life of the session. If you have a separate switchboard form, either that form can take over session monitoring, or the opening form can minimize and continue monitoring.
When the user logs out, you can make another entry with the date/time, username, computername, and "LOGGED OUT." The catch comes in that if the user's computer crashes or is abnormally rebooted or has a network failure, you have a "dangling session." If they log back in, you can ignore the previous "dangling" session. At any time, you can check the login records to find all users for whom the last record is "LOGGED IN"; i.e. there is no later "LOGGED OUT" record.
(2) IF you had that opening form that stays open, you can put a timer in it for some relatively comfortable interval and have it check every so often for the time of day. You can have the timer routine wake up every five or ten minutes and when 3:15 would be the next awakening, pop up a modal dialog box reminding the user to leave. It is relatively easy to compute the interval from NOW() to a convenient time like the beginning of the next hour or something like that, so from that point forward, you would by synchronized to the time of day.
(3) If you have that opening form running with a timer, one thing you can do is have the timer routine check for inactivity. BUT this gets trickier because if someone is just waiting on a long-running process in some kind of loop, maybe you don't want to interrupt that. Maybe you do. Hard to tell either way. BUT what I did is put a globally accessible variable in the front-end file that recorded the last time any form or report was opened and the last time any button was clicked, A couple of other actions also triggered this time-stamp of "last activity." Then the timer could compare that time to the time of day to determine a difference. In my case, I wanted the difference in seconds. Then if they exceeded the idle-time limit, I initiated the forced shutdown. I gave them 20 minutes. I also had a "notification" box on all of my forms where I could put up an "IDLE WARNING" message in red bold letters with a yellow background. AND I could make the terminals beep.
The trick here is that you should verify that nothing is left open. The CurrentDB.Recordsets collection lists all open records at the moment. If you close all of those then an Application.Quit should remove the session. (Just be sure to log a "LOGGED OUT" (or "FORCED OUT") entry in the login history table if you do this. You have to do this from the FRONT END because the recordset data is recorded there. That is where the work space resides, not the shared back end.