Within Access, it's probably easiest to set up the front end with a timer to check for messages. The back end would have a table that had a signal for impending shutdown, and the time it was going to happen.
Also, if you pull the user and machine information at logon, you can log what user is logged on from what machine, and have the data to answer your own question. Here's a couple of routines I use at design time to pull user system data, to verify which items I want to use.
Code:
Public Function ShowUserNames() As String
Debug.Print " * "
Debug.Print " * **** STARTING USER NAMES EXTENDED ***** "
Debug.Print " * "
Debug.Print "NameUnknown = " & GetUserNameExt(NameUnknown)
Debug.Print " * "
Debug.Print "NameFullyQualifiedDN = " & GetUserNameExt(NameFullyQualifiedDN)
Debug.Print " * "
Debug.Print "NameSamCompatible = " & GetUserNameExt(NameSamCompatible)
Debug.Print " * "
Debug.Print "NameDisplay = " & GetUserNameExt(NameDisplay)
Debug.Print " * "
Debug.Print "4 = " & GetUserNameExt(4)
Debug.Print " * "
Debug.Print "5 = " & GetUserNameExt(5)
Debug.Print " * "
Debug.Print " * **** MIDDLE USER NAMES EXTENDED ***** "
Debug.Print " * "
Debug.Print "NameUniqueId = " & GetUserNameExt(NameUniqueId)
Debug.Print " * "
Debug.Print "NameCanonical = " & GetUserNameExt(NameCanonical)
Debug.Print " * "
Debug.Print "NameUserPrincipal = " & GetUserNameExt(NameUserPrincipal)
Debug.Print " * "
Debug.Print "NameCanonicalEx = " & GetUserNameExt(NameCanonicalEx)
Debug.Print " * "
Debug.Print "NameServicePrincipal = " & GetUserNameExt(NameServicePrincipal)
Debug.Print " * "
Debug.Print " * **** ENDING USER NAMES EXTENDED ***** "
Debug.Print " * "
Debug.Print " * "
Debug.Print " * **** STARTING ENVIRON INFORMATION ***** "
Debug.Print " * "
Debug.Print " USERID = " & Environ("UserID")
Debug.Print " * "
Debug.Print " USERNAME = " & Environ("Username")
Debug.Print " * "
Debug.Print " COMPUTERNAME = " & Environ("Computername")
Debug.Print " * "
Debug.Print " USERPROFILE = " & Environ("Userprofile")
Debug.Print " * "
Debug.Print " HOMEPATH = " & Environ("Homepath")
Debug.Print " * "
Debug.Print " OS = " & Environ("OS")
Debug.Print " * "
ShowUserNames = "DONE"
End Function
Function ShowEnvironmentVariables()
Dim EnvString, Indx, Msg, PathLen ' Declare variables.
Dim varRet As Variant
varRet = SysCmd(acSysCmdAccessVer)
Debug.Print " * "
Debug.Print " * *** ACQUIRING ACCESS VERSION *** * "
Debug.Print " * "
Debug.Print " * Your MS Access Version Is " & Application.Version
Debug.Print " * Your MS Access Syscmd Version Is " & varRet
Debug.Print " * V11.0 is 2003, V12.0 is 2007, V14.0 is 2010"
Debug.Print " * "
Debug.Print " * Your MS Access Build / SP Is " & SysCmd(715)
Debug.Print " * "
Debug.Print " * Your MS Access Syscmd Version Is " & SysCmd(acSysCmdRuntime)
Debug.Print " * "
Indx = 0 ' Initialize index.
Debug.Print " * "
Debug.Print " * *** STARTING ENVIRONMENT VARIABLES *** * "
Debug.Print " * "
Do
Indx = Indx + 1
' Get environment variable.
EnvString = Environ(Indx)
' print value
Debug.Print " * "
Debug.Print " * " & Indx & " * " & EnvString
Loop Until EnvString = ""
Debug.Print " * "
Debug.Print " * *** ENDING ENVIRONMENT VARIABLES *** * "
Debug.Print " * "
ShowEnvironmentVariables = "DONE"
End Function